项目中经常会遇到这样的场景

1)  用户注册成功之后,不仅仅会有短信通知,可能还会有系统消息弹出,或者是其他形式,但是不论是什么形式,都离不开消息的传递行为

2)    之前在200x年的时候,我们都会使用不停的polling 轮训的方式,对后台不停的刷新,只有后端也或者是数据库中有新加入的数据,立即取出将数据展示在界面上,以便通知用户

3)    在后来也就是大部分现在的模式,都是使用websocket的形式进行服务端反推送的模式,这样效果可以达到,但是如果用户注册成功之后,就退出系统,或者是用户没有手机通知,这个时候,就算用户注册

成功,他也不知道自己已经注册成功了,因为我们都知道websocket本身是不具备消息持久化的

综上所述,我们可以使用ActiveMQ/RabbitMQ+MQTT协议+前端mqtt.js 实现消息的同步以及持久化,这样就解决了,如果该用户注册之后,立即退出,等他上线之后,会通知他,之前注册的结果是成功还是

失败

1 工具汇总介绍:

IDE:Eclipse 2019.6 若有版本问题请更换idea2018之后的版本,不在赘述,我这里是用的是基于Eclipse的 spring sts4

ActiveMQ:5.15.12  linux下安装 linux使用centos6.x/7.x均可   RHEL

MQTT:v3版本  (MQTT只是一种协议,并非是一个产品,而ActiveMQ是包含MQTT协议的一款产品)

web:用简单的web html5 渲染一下即可

MQTT.js :https://github.com/mqttjs/MQTT.js 直接下载即可,也可以从其他网站引入,不多可能时间加载会相对较长一点

2 系统准备:

使用上面介绍的开发工具以及相关插件包,进行如下部署

2.1 打开Eclipse,新建一个springboot项目,其实自己演示的话,什么项目类型都无所谓的,一般的webapp项目也可以,maven类型的托管也可以,只不过现在走一把主流用boot而已,也确实简单,项目路

径以及项目名称,坐标地址,打包方式,各位随意,如下图所示:

直接点击finish待项目构建成功之后即可,若项目构建途中失败,可以自己获取依赖包进行安装(关键要看maven仓库的安装路径),后期的工作不在赘述。

包结构如下:

com.mqttapp: 核心包是不能改变位置的,除非是包的层级关系发生变更,否则一般不走变更

com.mqttapp.config:一些常用的mqtt的一些工具方法放在这个包下

com.mqttapp.controller: 对外界的一些接口位置,存放在此处

com.mqttapp.handler: 句柄处理,其实这块就是具体的业务逻辑存放的地方

com.mqttapp.service: 业务接口定义的包

至此后台的单体架构准备完毕,跟着就是对于场景的描述

可以看出,在web端我们可以任意订阅消息Broker中的主题Topic,在订阅成功之后,mqttjs会有各种回调方法,这些回调方法,在实际开发中还是比较有用的

onMessage->onMessageArrived->当有消息到达web端的时候,即刻出发该方法

onConnectionLost->若连接丢失,或者出现了其他连接上的问题,会触发该方法

onConnect 当web端的mqtt与服务端的Broker连接成功之后会触发该方法,这个方法很重要,里面涉及到了订阅主题,以及指定连接消息质量qos等定义

mqttws31.js整体配置如下:

web端页面

mqttws31.min.js 测试

display: inline-block;

padding: 20px;

border: 2px solid #00ff00;

border-radius: 6px;

margin: 20px 0px;

user-select: none;

}

.divblock:active {

background-color: #455072;

border: 1px solid #0044ff;

}

MQTT V3 socket协议测试
mqttweb端

ClientID:

Topic:

var options ={

timeout: 50,

keepAliveInterval: 100,

useSSL: false,

// userName: userName,

// password: password,

onSuccess: onConnect,

onFailure: function(e) {

console.log(e);

s = "{time:" + new Date().Format("yyyy-MM-dd hh:mm:ss") + ", onFailure()}";

console.log(s);

}

};

var client = null;

functionsubscriber(){

// Create a client instance

var clientid = document.getElementById("clientid").value;

client = new Paho.MQTT.Client('127.0.0.1',Number(61614),clientid); // "hostname,port,clientid"

// set callback handlers

client.onConnectionLost = onConnectionLost; // 指定丢失事件

client.onMessageArrived = onMessageArrived; // 当对端消息到达web端之后处理

// connect the client 指定mqtt 事件 onSuccess 回调函数

// client.connect(options);

client.connect(

{

onSuccess: onConnect,

cleanSession:false //这里是表示作为持久化订阅者出现,不清楚在broker中的缓存数据}

);

}

// called when the client connects 成功连接mqtt服务器之后的事件函数

functiononConnect() {

//Once a connection has been made, make a subscription and send a message.

console.log("onConnect");

//这里可以订阅多个不同的主题,只需要迭代对象数组即可

client.subscribe("bigdata",{qos:2}); // 订阅主题带qos的参数

//client.subscribe("hotekey_cloud"); // 订阅主题

}

// called when the client loses its connection mqtt 丢失或连接不存在而触发的事件函数

functiononConnectionLost(responseObject) {

if (responseObject.errorCode !== 0) {

console.log("onConnectionLost:" +responseObject.errorMessage);

}

}

// called when a message arrives 接收到订阅消息

functiononMessageArrived(message) {

console.log("onMessageArrived:" +message.payloadString); //若发布者发送的消息为对象类型,需要使用Json工具进行反序列化为对象,才能获取报文中的数据

}

// 推送消息函数

functionmqttPublish(sendata) {

message = new Paho.MQTT.Message(sendata); // 消息内容

message.destinationName = "bigdata"; // 目标主题

client.send(message); // 推送主题

}

// 用户程序点击事件

functionOnmqtttest() {

message = "message from browser with mqtt protocol"; // 消息内容

mqttPublish(message);

}

我们在定义订阅的主题协议时,可以这么去考虑

1 我们的交互场景有几种?没一种场景是否会再次细分 即主题的分层结构

/Sys/Module/xxxxx

这样的分层结构比较常用,需要注意的是符号 "/"在ActiveMQ的Broker中会以符号"."出现

2 若需要一对一交互,我们在设计topic时,需要加上详细的对象编号或者是用户编号,或者是设别编号 如:

/Sys/Notice/UserRegister/1449

js能订阅mq吗_ActiveMQ+MQTT实现客户端订阅推送模式(一)订阅者相关推荐

  1. Android 二维码被扫后接收通知(使用MQTT协议实现消息推送)

    现如今扫码付款和收款已经很便利了,比如超市买完东西付款时有两种方式 : 顾客可以出示付款码给收银员扫码收款,也可以由顾客扫描超市的收款码进行付款 .两种方式在付款完成后超市端会进行语音播报收到xx元. ...

  2. 使用 WebSocket 客户端连接 MQTT 服务器/vue 项目使用mqtt消息队列实现推送

    简介 近年来随着 Web 前端的快速发展,浏览器新特性层出不穷,越来越多的应用可以在浏览器端或通过浏览器渲染引擎实现,Web 应用的即时通信方式 WebSocket 得到了广泛的应用. WebSock ...

  3. mqtt实例 php_php--mqtt实现推送

    [实例简介] php--mqtt实现推送 本人亲测.详细的请看本人csdn微博 [实例截图] [核心代码] send_mqtt ├── 16x16_loading.gif ├── etc │   └─ ...

  4. 基于mqtt协议的消息推送服务器,基于 MQTT 协议的推送服务

    一.简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级& ...

  5. MQTT+ActiveMQ实现消息推送(移动端)

    这个小程序是我导师给我布置的一个任务,网上教程不是很多,遇到的一些困难都是自己解决的,所以写出来分享一下,有什么问题大家可以留言,尽力帮大家解决. 首先,我们需要先下载activeMQ (官网:htt ...

  6. Android平台上使用MQTT协议实现消息推送功能

    MQTT实现消息推送,效果如下 服务端下载地址:http://activemq.apache.org/download-archives.html jar包地址 百度网盘:https://pan.ba ...

  7. 微信公众号 - Java推送小程序订阅消息给用户

    不啰嗦,我们直接开始! 本文使用体验版小程序进行调试. 一.开发前小程序准备: 1.登录微信公众平台 点开下面链接,使用微信扫码 微信公众平台 然后选择一个小程序并登录 2.在小程序后台找到Appid ...

  8. 使用java实现MQTT协议客户端的接收、发布消息和订阅、退订主题topic

    记录一下我实习的第一个任务,学习MQTT协议 首先呢得了解MQTT是什么,这里推荐一个我学习MQTT的中文文档 MQTT协议的基于TCP/IP协议的一个物联网协议,有几个概念必须要弄懂得主题(topi ...

  9. MQTT+ActiveMQ实现消息推送

    https://blog.csdn.net/m15927408113/article/details/71438922 https://blog.csdn.net/RichieZhu/article/ ...

最新文章

  1. jquery autocomplete实现solr查询字段自动填充并执行查询
  2. 目前网络上开源的网络爬虫以及一些简介和比较
  3. 中文金额大写转换处理
  4. 判断javascript数组的方法
  5. 微软开源项目NeuronBlocks - 像搭积木一样构建NLP深度学习模型
  6. 如何从零开始开发一个实时联机游戏?
  7. Java内存缓存-通过Google Guava创建缓存
  8. Angular应用的依赖注入调试
  9. 程序员最讨厌的9句话
  10. server接收dtu透传代码_Swoole学习笔记二:初探server与client(Client同步)
  11. 64位Win8企业版出现“Unknown Hard Error”系统警告的一个解决方法
  12. ThinkPhp 使用 PHP_XLSXWriter 代替 PHPExcel 百万级数据单次导出
  13. 【热聘】蚂蚁金服-系统软件和安全资深/高级/专家/工程师
  14. Flink 动态配置(参数 算子 CEP)
  15. 第十二章:如何制定里程碑
  16. [Maven实战-许晓斌]-[第二章]-2.4设置HTTP代理
  17. VXLAN的广播域BD。
  18. ADC或DAC中的LSB
  19. (前端)html与css css 18、清除浮动,溢出隐藏
  20. 音频采样及编解码——LPCM 、ADPCM、G711、G726

热门文章

  1. centos7.2 开发 部署 .net core
  2. Json.NET特殊处理64位长整型数据
  3. 走入asp.net mvc不归路:[4]说说Action有哪些常见成员
  4. [转]微软SerialPort秘籍[SerialPort为什么死锁程序的分析]
  5. 【#】Spring3 MVC 注解(二)---@RequestMapping
  6. 关于js中window.location.href、location.href、parent.location.href、top.location.href的用法...
  7. C# 5.0将带来的五大新特性
  8. 深入理解ButterKnife源码并掌握原理(四)
  9. ubuntu 压缩率最高的软件_[图]Linux六大压缩算法横评:Ubuntu 19.10最终选择LZ4
  10. 5.22青海云南同震