基于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 相关文章推荐
JavaScript的面向对象(二)
Nov 09 Javascript
使用jquery prev()方法找到同级的前一个元素
Jul 11 Javascript
jquery实现弹出层效果实例
May 19 Javascript
JavaScript实现的简单拖拽效果
Jun 01 Javascript
js实现C#的StringBuilder效果完整实例
Dec 22 Javascript
JS函数的定义与调用方法推荐
May 12 Javascript
jquery点击改变class并toggle的实现代码
May 15 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
Oct 10 Javascript
javascript实现消灭星星小游戏简单版
Nov 15 Javascript
非常优秀的JS图片轮播插件Swiper的用法
Jan 03 Javascript
JS基于贪心算法解决背包问题示例
Nov 27 Javascript
javascript设计模式之装饰者模式
Jan 30 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
PHP与SQL语句写一句话木马总结
2019/10/11 PHP
JQuery扩展插件Validate—6 radio、checkbox、select的验证
2011/09/05 Javascript
js实现页面跳转重定向的几种方式
2014/05/29 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
JS烟花背景效果实现方法
2015/03/03 Javascript
详解JavaScript正则表达式中的global属性的使用
2015/06/16 Javascript
js简单实现表单中点击按钮动态增加输入框数量的方法
2015/08/18 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
2017/01/20 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
JavaScript中变量提升与函数提升经典实例分析
2018/07/26 Javascript
[49:42]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第一局
2016/03/04 DOTA
Python实现简单的多任务mysql转xml的方法
2017/02/08 Python
Python 专题一 函数的基础知识
2017/03/16 Python
Python 异常处理的实例详解
2017/09/11 Python
selenium3+python3环境搭建教程图解
2018/12/07 Python
详解Python打包分发工具setuptools
2019/08/05 Python
django框架auth模块用法实例详解
2019/12/10 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Window系统下Python如何安装OpenCV库
2020/03/05 Python
使用keras2.0 将Merge层改为函数式
2020/05/23 Python
CSS中几个与换行有关的属性简明总结
2014/04/15 HTML / CSS
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
南威尔士家居商店:Leekes
2016/10/25 全球购物
HEMA英国:荷兰原创设计
2018/08/28 全球购物
可口可乐唇膏:Lip Smackers
2019/08/27 全球购物
关于旷工的检讨书
2014/02/02 职场文书
机关单位动员会主持词
2014/03/20 职场文书
小学教师师德演讲稿
2014/05/06 职场文书
2014年秋季开学演讲稿
2014/05/24 职场文书
学校食品安全责任书
2015/01/29 职场文书
幼师辞职信怎么写
2015/02/27 职场文书
CentOS7安装GlusterFS集群以及相关配置
2022/04/12 Servers