基于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天然的迭代器
Oct 29 Javascript
利用jquery的获取JS文件中的字符串内容
Feb 14 Javascript
动态添加删除表格行的js实现代码
Feb 28 Javascript
详解Javascript 装载和执行
Nov 17 Javascript
jQuery操作cookie方法实例教程
Nov 25 Javascript
Javascript闭包与函数柯里化浅析
Jun 22 Javascript
js 性能优化之快速响应的用户界面
Feb 15 Javascript
如何以Angular的姿势打开Font-Awesome详解
Apr 22 Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 jQuery
解决axios post 后端无法接收数据的问题
Oct 29 Javascript
js刷新页面location.reload()用法详解
Dec 09 Javascript
vue制作抓娃娃机的示例代码
Apr 17 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
GBK的页面输出JSON格式的php函数
2010/02/16 PHP
PHP操作XML作为数据库的类
2010/12/19 PHP
PHP中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
PHP写UltraEdit插件脚本实现方法
2011/12/26 PHP
解析thinkphp中的M()与D()方法的区别
2013/06/22 PHP
PHP生成图片验证码、点击切换实例
2014/06/25 PHP
php中实现用数组妩媚地生成要执行的sql语句
2015/07/10 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
Jquery全选与反选点击执行一次的解决方案
2015/08/14 Javascript
jQuery代码实现图片墙自动+手动淡入淡出切换效果
2016/05/09 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
JavaScript代码实现图片循环滚动效果
2020/03/19 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
jQuery插件zTree实现删除树子节点的方法示例
2017/03/08 Javascript
JS+html5 canvas实现的简单绘制折线图效果示例
2017/03/13 Javascript
如何编写jquery插件
2017/03/29 jQuery
浅谈vue中.vue文件解析流程
2018/04/24 Javascript
vscode下vue项目中eslint的使用方法
2019/01/13 Javascript
javascript设计模式 ? 原型模式原理与应用实例分析
2020/04/10 Javascript
[01:00:14]DOTA2官方TI8总决赛纪录片 真视界True Sight
2019/01/16 DOTA
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
详解Python3定时器任务代码
2019/09/23 Python
Pytorch 的损失函数Loss function使用详解
2020/01/02 Python
Python Sqlalchemy如何实现select for update
2020/10/12 Python
HTML5 transform三维立方体实现360无死角三维旋转效果
2014/08/22 HTML / CSS
英国领先的在线高尔夫商店:Scottsdale Golf
2019/08/26 全球购物
黄河象教学反思
2014/02/10 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
电子商务专业自荐信
2014/06/02 职场文书
幼儿园迎国庆65周年活动策划方案
2014/09/16 职场文书
侵犯商业秘密的律师函
2015/05/27 职场文书
Python中使用ipython的详细教程
2021/06/22 Python
苹果电脑mac os中货币符号快捷输入
2022/02/17 杂记