基于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 相关文章推荐
自适应高度框架 ----属个人收藏内容
Jan 22 Javascript
js iframe跨域访问(同主域/非同主域)分别深入介绍
Jan 24 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
Apr 12 Javascript
JS隐藏参数post传值实例
Apr 18 Javascript
Javascript添加监听与删除监听用法详解
Dec 19 Javascript
JavaScript实现横线提示输入验证码随输入验证码输入消失的方法
Sep 24 Javascript
javascript中BOM基础知识总结
Feb 14 Javascript
JS实现websocket长轮询实时消息提示的效果
Oct 10 Javascript
JS的Ajax与后端交互数据的实例
Aug 08 Javascript
详解mpvue小程序中怎么引入iconfont字体图标
Oct 01 Javascript
详解vuex commit保存数据技巧
Dec 25 Javascript
原生js滑动轮播封装
Jul 31 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
海贼王:最美的悬赏令!
2020/03/02 日漫
自己做矿石收音机
2021/03/02 无线电
Cannot modify header information错误解决方法
2008/10/08 PHP
那些年一起学习的PHP(二)
2012/03/21 PHP
Mac系统完美安装PHP7详细教程
2017/06/06 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
常用简易JavaScript函数
2009/04/09 Javascript
目前流行的JavaScript库的介绍及对比
2013/09/29 Javascript
javascript验证身份证完全方法具体实现
2013/11/18 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
jQuery对象的selector属性用法实例
2014/12/27 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
星期几的不同脚本写法(推荐)
2016/06/01 Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
2016/07/09 Javascript
JS+CSS3实现超炫的散列画廊特效
2016/07/16 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
原生JavaScript来实现对dom元素class的操作方法(推荐)
2017/08/16 Javascript
jQuery选择器之基本过滤选择器用法实例分析
2019/02/19 jQuery
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
vue 中使用print.js导出pdf操作
2020/11/13 Javascript
[41:05]Serenity vs Pain 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
带你了解python装饰器
2017/06/15 Python
python for循环输入一个矩阵的实例
2018/11/14 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
Selenium 安装和简单使用的实现
2020/12/04 Python
英国皇室御用百货:福南梅森(Fortnum & Mason)
2017/12/03 全球购物
服装仓管员岗位职责
2014/06/17 职场文书
社区娱乐活动方案
2014/08/21 职场文书
工伤事故赔偿协议书(标准)
2014/09/29 职场文书
婚宴新娘致辞
2015/07/28 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
设置IIS Express并发数
2022/07/07 Servers