基于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左右滚动支持图片放大缩略图图片轮播代码分享
Aug 26 Javascript
Bootstrap基本样式学习笔记之表单(3)
Dec 07 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
Jan 09 jQuery
JS装饰器函数用法总结
Apr 21 Javascript
纯JS实现可用于页码更换的飞页特效示例
May 21 Javascript
animate.css在vue项目中的使用教程
Aug 05 Javascript
js for终止循环 跳出多层循环
Oct 04 Javascript
微信小程序自定义键盘 内部虚拟支付
Dec 20 Javascript
使用jQuery实现掷骰子游戏
Oct 24 jQuery
Node.js+Vue脚手架环境搭建的方法步骤
Mar 08 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
js实现移动端图片滑块验证功能
Sep 29 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
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
php读取纯真ip数据库使用示例
2014/01/26 PHP
php修改文件上传限制方法汇总
2015/04/07 PHP
php操作redis缓存方法分享
2015/06/03 PHP
php中二维数组排序问题方法详解
2015/08/28 PHP
ThinkPHP进程计数类Process用法实例详解
2015/09/25 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
JavaScript OOP面向对象介绍
2010/12/02 Javascript
常用一些Javascript判断函数
2012/08/14 Javascript
深入浅析JavaScript中的constructor
2016/04/19 Javascript
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
nodejs 终端打印进度条实例代码
2017/04/22 NodeJs
微信小程序实现点击文字页面跳转功能【附源码下载】
2017/12/12 Javascript
Angular入口组件(entry component)与声明式组件的区别详解
2018/04/09 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
浅谈Vue.js组件(二)
2019/04/09 Javascript
JS实现吸顶特效
2020/01/08 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
原生js无缝轮播插件使用详解
2020/03/09 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
python django 访问静态文件出现404或500错误
2017/01/20 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
Python pip使用超时问题解决方案
2020/08/03 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
高中化学教学反思
2014/01/13 职场文书
电焊工岗位工作职责
2014/07/09 职场文书
车辆年审委托书范本
2014/09/18 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
论语读书笔记
2015/06/26 职场文书