基于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 相关文章推荐
JQERY limittext 插件0.2版(长内容限制显示)
Aug 27 Javascript
读jQuery之三(构建选择器)
Jun 11 Javascript
输入框过滤非数字的js代码
Sep 18 Javascript
js Calender控件使用详解
Jan 05 Javascript
如何利用AngularJS打造一款简单Web应用
Dec 05 Javascript
javascript基于原型链的继承及call和apply函数用法分析
Dec 15 Javascript
JS优化与惰性载入函数实例分析
Apr 06 Javascript
AngularJs1.x自定义指令独立作用域的函数传入参数方法
Oct 09 Javascript
Vue 中如何正确引入第三方模块的方法步骤
May 05 Javascript
javascript实现简易的计算器
Jan 17 Javascript
原生JavaScript实现拖动校验功能
Sep 29 Javascript
javascript中闭包closure的深入讲解
Mar 03 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批量去除文件UTF8 BOM信息
2013/08/05 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
Yii操作数据库的3种方法
2014/03/11 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
ajax页面无刷新 IE下遭遇Ajax缓存导致数据不更新的问题
2012/12/11 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
基于JavaScript实现跳转提示页面
2016/09/24 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
Vue实现web分页组件详解
2017/11/28 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
Python生成不重复随机值的方法
2015/05/11 Python
Python实现PS滤镜的万花筒效果示例
2018/01/23 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
python 字典中取值的两种方法小结
2018/08/02 Python
用django设置session过期时间的方法解析
2019/08/05 Python
Django模板语言 Tags使用详解
2019/09/09 Python
基于python实现雪花算法过程详解
2019/11/16 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
解决pycharm安装第三方库失败的问题
2020/05/09 Python
python3.x中安装web.py步骤方法
2020/06/23 Python
python3.6中anaconda安装sklearn踩坑实录
2020/07/28 Python
Python如何执行系统命令
2020/09/23 Python
CSS3弹性布局内容对齐(justify-content)属性使用详解
2017/07/31 HTML / CSS
EVE LOM英国官网:全世界最好的洁面膏
2017/10/30 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
乌克兰机票、铁路和巴士票、酒店搜索、保险:Tickets.ua
2020/01/11 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
项目合作意向书模板
2014/07/29 职场文书
离婚协议书怎么写(范本参考)
2014/09/30 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技