基于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 相关文章推荐
jQuery 动画基础教程
Dec 25 Javascript
解析Jquery取得iframe中元素的几种方法
Jul 04 Javascript
详解JavaScript的流程控制语句
Nov 30 Javascript
Vue.js学习笔记之 helloworld
Aug 14 Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 Javascript
bootstrap table分页模板和获取表中的ID方法
Jan 10 Javascript
微信小程序 天气预报开发实例代码源码
Jan 20 Javascript
微信小程序中form 表单提交和取值实例详解
Apr 20 Javascript
使用vue自定义指令开发表单验证插件validate.js
May 23 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
May 29 jQuery
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
Jun 10 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生成随机数的三种方法
2014/09/10 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
Apache服务器下防止图片盗链的办法
2015/07/06 PHP
php json转换相关知识(小结)
2018/12/21 PHP
教你如何解密js/vbs/vbscript加密的编码异处理小结
2008/06/25 Javascript
提高网站性能之 如何对待JavaScript
2009/10/31 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
struts2+jquery组合验证注册用户是否存在
2014/04/30 Javascript
13个PHP函数超实用
2015/10/21 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
JavaScript实现审核流程状态的动态显示进度条
2017/03/15 Javascript
vue 添加vux的代码讲解
2017/11/30 Javascript
Bootstrap popover 实现鼠标移入移除显示隐藏功能方法
2018/01/24 Javascript
angular2/ionic2 实现搜索结果中的搜索关键字高亮的示例
2018/08/17 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
150行Node.js实现的dns代理工具
2019/08/02 Javascript
Vue如何获取数据列表展示
2019/12/11 Javascript
使用原生JS实现滚轮翻页效果的示例代码
2020/05/31 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
如何在Python中编写并发程序
2016/02/27 Python
python的pandas工具包,保存.csv文件时不要表头的实例
2018/06/14 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
django 实现将本地图片存入数据库,并能显示在web上的示例
2019/08/07 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
基于python操作ES实例详解
2019/11/16 Python
详解python metaclass(元类)
2020/08/13 Python
Python如何使用vars返回对象的属性列表
2020/10/17 Python
北大研究生linux应用求职信
2013/10/29 职场文书
毕业生找工作推荐信
2013/11/21 职场文书
监察建议书
2015/02/04 职场文书
工作简报范文
2015/07/21 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
2021/06/09 Python
MySQL批量更新不同表中的数据
2022/05/11 MySQL