基于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 相关文章推荐
event.keyCode键码值表 附只能输入特定的字符串代码
May 15 Javascript
JavaScript 基础知识 被自己遗忘的
Oct 15 Javascript
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 Javascript
js的alert弹出框出现乱码解决方案
Sep 02 Javascript
javascript类型转换示例
Apr 29 Javascript
优化Node.js Web应用运行速度的10个技巧
Sep 03 Javascript
PHP守护进程实例
Mar 06 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
Feb 22 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
Mar 17 Javascript
angular2路由切换改变页面title的示例代码
Aug 23 Javascript
如何从头实现一个node.js的koa框架
Jun 17 Javascript
layui 阻止图片上传的实例(before方法)
Sep 26 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
解决phpmyadmin 乱码,支持gb2312和utf-8
2006/11/20 PHP
PHP文件操作实现代码分享
2011/09/01 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
smarty缓存用法分析
2014/12/16 PHP
PHP实现的简单在线计算器功能示例
2017/08/02 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
接收键盘指令的脚本
2006/06/26 Javascript
jquery动态加载图片数据练习代码
2011/08/04 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
JavaScript常用小技巧小结
2014/12/29 Javascript
jQuery制作拼图小游戏
2015/01/12 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
JavaScript canvas仿代码流瀑布
2020/02/10 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
[01:19:46]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
深度定制Python的Flask框架开发环境的一些技巧总结
2016/07/12 Python
python用模块zlib压缩与解压字符串和文件的方法
2016/12/16 Python
python实现桌面气泡提示功能
2019/07/29 Python
使用pandas实现连续数据的离散化处理方式(分箱操作)
2019/11/22 Python
Pandas之read_csv()读取文件跳过报错行的解决
2020/04/21 Python
Python实现疫情通定时自动填写功能(附代码)
2020/05/27 Python
Python读取多列数据以及用matplotlib制作图表方法实例
2020/09/23 Python
CSS3 伪类选择器 nth-child()说明
2010/07/10 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
中英文自我评价语句
2013/12/20 职场文书
中学生运动会入场词
2014/02/12 职场文书
个人求职信范文
2014/05/24 职场文书
2014年精神文明建设工作总结
2014/11/19 职场文书
工程款催款函
2015/06/24 职场文书
关于军训的感想
2015/08/07 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server