基于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 相关文章推荐
json跟xml的对比分析
Jun 10 Javascript
javascript中JSON.parse()与eval()解析json的区别
May 19 Javascript
微信小程序 picker 组件详解及简单实例
Jan 10 Javascript
详解VueJs异步动态加载块
Mar 09 Javascript
vue如何获取点击事件源的方法
Aug 10 Javascript
qrcode生成二维码微信长按无法识别问题的解决
Apr 04 Javascript
Vue中computed、methods与watch的区别总结
Apr 10 Javascript
详解JavaScript中的坐标和距离
May 27 Javascript
JS实现的tab切换并显示相应内容模块功能示例
Aug 03 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 Javascript
原生js实现滑块区间组件
Jan 20 Javascript
AudioContext 实现音频可视化(web技术分享)
Feb 24 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
PHP6 mysql连接方式说明
2009/02/09 PHP
php获取文件大小的方法
2014/02/26 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
分享php代码将360浏览器导出的favdb的sqlite数据库文件转换为html
2015/12/09 PHP
PHP闭包定义与使用简单示例
2018/04/13 PHP
Dom加载让图片加载完再执行的脚本代码
2008/05/15 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
php和js对数据库图片进行等比缩放示例
2014/04/28 Javascript
jQuery中eq()方法用法实例
2015/01/05 Javascript
jQuery实现鼠标双击Table单元格变成文本框及输入内容后更新到数据库的方法
2015/11/25 Javascript
js简单判断移动端系统的方法
2016/02/25 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
防止Layui form表单重复提交的实现方法
2019/09/10 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
在vue中created、mounted等方法使用小结
2020/07/21 Javascript
用Python计算三角函数之atan()方法的使用
2015/05/15 Python
Python中在脚本中引用其他文件函数的实现方法
2016/06/23 Python
Python实现压缩和解压缩ZIP文件的方法分析
2017/09/28 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
pycharm运行程序时在Python console窗口中运行的方法
2018/12/03 Python
Python根据欧拉角求旋转矩阵的实例
2019/01/28 Python
Python (Win)readline和tab补全的安装方法
2019/08/27 Python
详解python播放音频的三种方法
2019/09/23 Python
python 制作网站小说下载器
2021/02/20 Python
细说CSS3中的选择符
2008/10/17 HTML / CSS
中国跨境海淘网站:考拉海购
2016/08/01 全球购物
四种会话跟踪技术
2015/05/20 面试题
歌唱比赛获奖感言
2014/01/21 职场文书
干部鉴定材料
2014/05/18 职场文书
学生安全责任书范本
2014/07/24 职场文书
餐饮周年庆活动方案
2014/08/14 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
在Django中使用MQTT的方法
2021/05/10 Python
Python基础学习之奇异的GUI对话框
2021/05/27 Python