基于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 相关文章推荐
表单(FORM)的一些实用效果代码
Mar 25 Javascript
jquery控制listbox中项的移动并排序的实现代码
Sep 28 Javascript
判断js对象是否拥有某一个属性的js代码
Aug 16 Javascript
基于iframe实现类似于ajax的页面无刷新
May 31 Javascript
jquery通过closest选择器修改上级元素的方法
Mar 17 Javascript
jQuery Ajax使用实例
Apr 16 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
JS设计模式之惰性模式(二)
Sep 29 Javascript
jQuery完成表单验证的实例代码(纯代码)
Sep 30 jQuery
使用JS中的Replace()方法遇到的问题小结
Oct 20 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
详解Vue的常用指令v-if, v-for, v-show,v-else, v-bind, v-on
Oct 12 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
2020/03/24 PHP
javascript web对话框与弹出窗口
2009/02/22 Javascript
jquery 学习之二 属性(html()与html(val))
2010/11/25 Javascript
自动最大化窗口的Javascript代码
2013/05/22 Javascript
Jquery通过Ajax方式来提交Form表单的具体实现
2013/11/07 Javascript
jQuery获取访问者IP地址的方法(基于新浪API与QQ查询接口)
2016/05/25 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
jQuery图片加载显示loading效果
2016/11/04 Javascript
Angular.JS通过指令操作DOM的方法
2017/05/10 Javascript
移动端网页开发调试神器Eruda的介绍与使用技巧
2017/10/30 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
js中bool值的转换及“&amp;&amp;”、“||”、 “!!”详解
2017/12/21 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
深入理解js 中async 函数的含义和用法
2018/05/13 Javascript
angular的输入和输出的使用方法
2018/09/22 Javascript
element ui table(表格)实现点击一行展开功能
2018/12/04 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python使用CMD模块更优雅的运行脚本
2015/05/11 Python
学习python之编写简单乘法口诀表实现代码
2016/02/27 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
修复CentOS7升级Python到3.6版本后yum不能正确使用的解决方法
2018/01/26 Python
Python遍历文件夹 处理json文件的方法
2019/01/22 Python
Python GUI编程完整示例
2019/04/04 Python
CentOS6.9 Python环境配置(python2.7、pip、virtualenv)
2019/05/06 Python
Python3.8对可迭代解包的改进及用法详解
2019/10/15 Python
Django url 路由匹配过程详解
2021/01/22 Python
Python调用SMTP服务自动发送Email的实现步骤
2021/02/07 Python
使用before和:after伪类制作css3圆形按钮
2014/04/08 HTML / CSS
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
公司庆典活动邀请函
2014/01/09 职场文书
绿色环保演讲稿
2014/05/10 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
python实现简单聊天功能
2021/07/07 Python