基于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 相关文章推荐
js 金额文本框实现代码
Feb 14 Javascript
Javascript自定义排序 node运行 实例
Jun 05 Javascript
JavaScript遍历table表格中的某行某列并打印其值
Jul 08 Javascript
JavaScript中最简洁的编码html字符串的方法
Oct 11 Javascript
Kindeditor在线文本编辑器如何过滤HTML
Apr 14 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
浅谈jQuery中事情的动态绑定
Feb 12 Javascript
浅谈jquery拼接字符串效率比较高的方法
Feb 22 Javascript
JSON与JS对象的区别与对比
Mar 01 Javascript
JavaScript多线程运行库Nexus.js详解
Dec 22 Javascript
微信小程序中的上拉、下拉菜单功能
Mar 13 Javascript
在elementui中Notification组件添加点击事件实例
Nov 11 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实现指定字段的多维数组排序函数分享
2015/03/09 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
Javascript实现的分页函数
2007/02/07 Javascript
Ext 今日学习总结
2010/09/19 Javascript
appendChild() 或 insertBefore()使用与区别介绍
2013/10/11 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
jQuery实现Flash效果上下翻动的中英文导航菜单代码
2015/09/22 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
vue使用vue-cli快速创建工程
2017/07/28 Javascript
vue.js 使用axios实现下载功能的示例
2018/03/05 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
vue实现跨域的方法分析
2019/05/21 Javascript
JavaScript实现世界各地时间显示
2020/09/07 Javascript
Python的词法分析与语法分析
2013/05/18 Python
Python中函数的用法实例教程
2014/09/08 Python
基于Django框架的权限组件rbac实例讲解
2019/08/31 Python
Python 经典算法100及解析(小结)
2019/09/13 Python
10个Python面试常问的问题(小结)
2019/11/20 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
python+selenium实现12306模拟登录的步骤
2021/01/21 Python
css3的过滤效果简单实例
2016/08/03 HTML / CSS
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
工程监理应届生求职信
2013/11/09 职场文书
求职信范文怎么写
2014/01/29 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
经营管理策划方案
2014/05/22 职场文书
询价采购方案
2014/06/09 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
语文教师求职信范文
2015/03/20 职场文书
面试通知短信
2015/04/20 职场文书
golang中的空接口使用详解
2021/03/30 Python
Python机器学习之基础概述
2021/05/19 Python
MySQL约束超详解
2021/09/04 MySQL
win10电脑右下角输入法图标不见了?Win10右下角不显示输入法的解决方法
2022/07/23 数码科技