基于ajax与msmq技术的消息推送功能实现代码


Posted in Javascript onDecember 26, 2016

周末在家捣鼓了一下消息推送的简单例子,其实也没什么技术含量,欢迎大伙拍砖。

我设计的这个推送demo是基于ajax长轮询+msmq消息队列来实现的,具体交互过程如下图:

基于ajax与msmq技术的消息推送功能实现代码

先说说这个ajax长轮询,多长时间才算长呢?这个还真不好界定。

这里是相对普通ajax请求来说的,通常处理一个请求也就是毫秒级别的时间。但是这里的长轮询方式

在ajax发送请求给服务器之后,服务器给调用端返回数据的时间多长那可还真不好说。嘿嘿,这关键要看

我们啥时候往msmq队列中推送数据了,先看看推送的效果图吧。。。。。

基于ajax与msmq技术的消息推送功能实现代码

抱歉,没弄张动态效果图给大家。实现的功能大体上就是这样。上图中的winform程序中我们点击即刻发送按钮,同时网页上我们就能看到新推送的数据。

好了,说完具体实现流程和效果之后马上就开始编码实现吧。。。。

消息推送Winform程序代码

namespace SenderApp
{
  public partial class Form1 : Form
  {
    private string queueName = @".\Private$\pushQueue";
    private MessageQueue pushQueue = null;
    
    public Form1()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      try
      {
        var queue = this.GetQueue();
        if (string.IsNullOrEmpty(this.textBox1.Text)) { this.label1.Text = "推送消息不能为空"; return; }
        queue.Send(this.textBox1.Text, "messagePush");
        this.label1.Text = "消息推送成功";
      }
      catch (Exception ex)
      {
        this.label1.Text = string.Format("消息推送失败:{0}",ex.Message);
      }
    }

    private MessageQueue GetQueue()
    {
      if (this.pushQueue == null)
      {
        if (!MessageQueue.Exists(queueName))
        {
          this.pushQueue = MessageQueue.Create(queueName);
        }
        else
        {
          this.pushQueue = new MessageQueue(queueName);
        }
      }
      return this.pushQueue;
    }

    private void textBox1_MouseDown(object sender, MouseEventArgs e)
    {
      this.textBox1.Text = "";
      this.label1.Text = "推送状态";
    }
  }
}

Web服务端代码

namespace MessagePushWeb.Controllers
{
  public class HomeController : Controller
  {
    private static string queueName = @".\Private$\pushQueue";
    private static MessageQueue pushQueue = null;

    public ActionResult Index()
    {
      return View();
    }

    public async Task<ActionResult> GetMessage()
    {
      string msg = await Task.Run(() => {
        return this.ReadMessage();
      });
      
      return Content(msg);
    }


    private MessageQueue GetQueue()
    {
      if (pushQueue == null)
      {
        if (MessageQueue.Exists(queueName))
        {
          pushQueue = new MessageQueue(queueName);
          pushQueue.Formatter = new XmlMessageFormatter(new string[] { "System.String" });
        }
      }
      return pushQueue;
    }

    private string ReadMessage()
    {
      var queue = GetQueue();
      Message message = queue.Receive();
      return message.Body.ToString();
    }
  }
}

页面视图代码

@{
  ViewBag.Title = "Push";
}


<h2>Push</h2>

<div>接收消息列表</div>
<div id="msg"></div>

<script type="text/javascript">
  $(function () {
    getMessage();
  });


  function getMessage() {
    $.get("/home/getmessage", {}, function (data) {
      var _msg = $("#msg").html();
      $("#msg").html(_msg + "<li>" + data + "</li>");
      getMessage();
    });
   }
</script>

当然,在这个只是一个初级的消息推送demo,是否能胜任生产环境的需要还有待考证。

如果你也有更好的实现和建议,都欢迎留言给我。

源码在这里:http://pan.baidu.com/s/1hsHSLTy

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript 作用域使用说明
Aug 13 Javascript
图片翻转效果具体实现代码
Jan 09 Javascript
javascript常用代码段搜集
Dec 04 Javascript
JavaScript的设计模式经典之建造者模式
Feb 24 Javascript
深入分析javascript中的错误处理机制
Jul 17 Javascript
plupload+artdialog实现多平台上传文件
Jul 19 Javascript
bootstrap轮播图示例代码分享
May 17 Javascript
前端跨域的几种解决方式总结(推荐)
Aug 16 Javascript
javascript 开发之网页兼容各种浏览器
Sep 28 Javascript
vue cli使用绝对路径引用图片问题的解决
Dec 06 Javascript
karma+webpack搭建vue单元测试环境的方法示例
May 24 Javascript
vue实现网络图片瀑布流 + 下拉刷新 + 上拉加载更多(步骤详解)
Jan 14 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 #Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
Dec 26 #Javascript
Bootstrap的modal拖动效果
Dec 25 #Javascript
原生ajax处理json格式数据的实例代码
Dec 25 #Javascript
JS异步文件分片断点上传的实现思路
Dec 25 #Javascript
BootStrop前端框架入门教程详解
Dec 25 #Javascript
半个小时学json(json传递示例)
Dec 25 #Javascript
You might like
PHP 彩色文字实现代码
2009/06/29 PHP
PHP Error与Logging函数的深入理解
2013/06/03 PHP
destoon各类调用汇总
2014/06/20 PHP
PHP实现返回JSON和XML的类分享
2015/01/28 PHP
php实现多城市切换特效
2015/08/09 PHP
PHP利用超级全局变量$_GET来接收表单数据的实例
2016/11/05 PHP
Smarty模板变量与调节器实例详解
2019/07/20 PHP
[Web]防止用户复制页面内容和另存页面的方法
2009/02/06 Javascript
Extjs4 GridPanel 的几种样式使用介绍
2013/04/18 Javascript
JQuery触发事件例如click
2013/09/11 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
使用layer弹窗和layui表单实现新增功能
2018/08/09 Javascript
浅谈vue同一页面中拥有两个表单时,的验证问题
2018/09/18 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
jquery实现动态改变css样式的方法分析
2019/05/27 jQuery
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
python类装饰器用法实例
2015/06/04 Python
python中的随机函数小结
2018/01/27 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python多个模块py文件的数据共享实例
2019/01/11 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
Linux如何为某个操作添加别名
2013/03/01 面试题
init进程的作用
2012/04/12 面试题
主治医师岗位职责
2013/12/10 职场文书
业务部经理岗位职责
2014/01/04 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
小学教学随笔感言
2014/02/26 职场文书
工程项目建议书范文
2014/03/12 职场文书
幼师求职信
2014/06/23 职场文书
个人工作决心书
2015/09/22 职场文书