MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用
参看官方文档:
* Java 为 MQ Telemetry Transport 创建异步发布程序
*在此任务中,您将遵循教程来修改第一个发布程序。通过修改,
*使应用程序能够发送发布而不等待传递确认信息。传递确认
*信息由您创建的回调类来接收。
*
*
*
*4.使客户机断开连接
* a.除去其中包含 token.waitForCompletion 表达式的语句。 主线程将继续执行,而不等待传递发布。
* b.测试客户机是否已断开连接。 将错误返回到 MqttCallback 中的 lostConnection 方法之后,MQTT 客户机将断开连接,客户机应用程序也可能断开连接。测试是否有打开的连接。
* c.使用常量 Example.quiesceTimeout 来设置使客户机停顿的最长时间。
* if (client.isConnected())
* client.disconnect(Example.quiesceTimeout);
*当满足下面三种情况的组合形式时,客户机就完成了:
* a.已经对在此会话中(如果重新启动了会话,则是在先前会话中)已发布的所有消息调用了回调。
* b.消息未完成,然而停顿时间间隔已到期。缺省情况下,停顿时间间隔为 30 秒。通过将要等待的毫秒数作为 client.disconnect 的一个参数来传递,即可更改停顿超时。
* c.在发布了某些消息并由客户机进行排队之后,但是在发送这些消息之前调用了 client.disconnect。已排队的消息尚未处于“未完成”状态。如果会话可重新启动,那么重新启动会话时就会重新发送消息。
* 缺省情况下,停顿时间间隔为 30 秒。
MQTT的消息发布代码:
- package com.etrip.wsmqtt.server;
- import com.ibm.micro.client.mqttv3.MqttClient;
- import com.ibm.micro.client.mqttv3.MqttDeliveryToken;
- import com.ibm.micro.client.mqttv3.MqttMessage;
- import com.ibm.micro.client.mqttv3.MqttTopic;
- /**
- * 使用 Java 为 MQ Telemetry Transport 创建异步发布程序
- *
- *
- *
- *
- * 消息发布的类的具体的实现
- *
- * @author longgangbai
- *
- */
- public class WSMQTTServerPubAsync {
- public static void main(String[] args) {
- try {
- //创建MqttClient对象
- MqttClient client = new MqttClient(WSMQTTServerCommon.TCPAddress, WSMQTTServerCommon.clientId);
- //创建MQTT相关的主题
- MqttTopic topic = client.getTopic(WSMQTTServerCommon.topicString);
- //创建MQTT的消息体
- MqttMessage message = new MqttMessage();
- //设置消息传输的类型
- message.setQos(2);
- //设置是否在服务器中保存消息体
- message.setRetained(false);
- //设置消息的内容
- message.setPayload(WSMQTTServerCommon.publication.getBytes());
- //创建一个MQTT的回调类
- WSMQTTServerCallBack callback = new WSMQTTServerCallBack(WSMQTTServerCommon.clientId);
- //MqttClient绑定
- client.setCallback(callback);
- //MqttClient连接
- client.connect();
- System.out.println("Publishing \"" + message.toString()
- + "\" on topic \"" + topic.getName() + "\" with QoS = "
- + message.getQos());
- System.out.println("For client instance \"" + client.getClientId()
- + "\" on address " + client.getServerURI() + "\"");
- //发送消息并获取回执
- MqttDeliveryToken token = topic.publish(message);
- System.out.println("With delivery token \"" + token.hashCode()
- + " delivered: " + token.isComplete());
- Thread.sleep(100000000000000l);
- //关闭连接
- if (client.isConnected())
- client.disconnect(WSMQTTServerCommon.quiesceTimeout);
- System.out.println("Disconnected: delivery token \"" + token.hashCode()
- + "\" received: " + token.isComplete());
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
MQTT消息发布回调代码:
- package com.etrip.wsmqtt.server;
- import com.ibm.micro.client.mqttv3.*;
- /**
- * 发布消息的回调类
- *
- * 必须实现MqttCallback的接口并实现对应的相关接口方法
- * ◦CallBack 类将实现 MqttCallBack。每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。在回调中,将它用来标识已经启动了该回调的哪个实例。
- * ◦必须在回调类中实现三个方法:
- *
- * public void messageArrived(MqttTopic topic, MqttMessage message)
- * 接收已经预订的发布。
- *
- * public void connectionLost(Throwable cause)
- * 在断开连接时调用。
- *
- * public void deliveryComplete(MqttDeliveryToken token))
- * 接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。
- *
- *
- * ◦由 MqttClient.connect 激活此回调。
- *
- * @author longgangbai
- */
- public class WSMQTTServerCallBack implements MqttCallback {
- private String instanceData = "";
- public WSMQTTServerCallBack(String instance) {
- instanceData = instance;
- }
- /**
- * 接收到消息的回调的方法
- */
- public void messageArrived(MqttTopic topic, MqttMessage message) {
- try {
- System.out.println("Message arrived: \"" + message.toString()
- + "\" on topic \"" + topic.toString() + "\" for instance \""
- + instanceData + "\"");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 消息连接丢失
- */
- public void connectionLost(Throwable cause) {
- System.out.println("Connection lost on instance \"" + instanceData
- + "\" with cause \"" + cause.getMessage() + "\" Reason code "
- + ((MqttException)cause).getReasonCode() + "\" Cause \""
- + ((MqttException)cause).getCause() + "\"");
- cause.printStackTrace();
- }
- /**
- *
- */
- public void deliveryComplete(MqttDeliveryToken token) {
- try {
- System.out.println("Delivery token \"" + token.hashCode()
- + "\" received by instance \"" + instanceData + "\"");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
常量类:
- package com.etrip.wsmqtt.server;
- import java.util.UUID;
- /**
- *
- * 消息发布消息的常量字段
- *
- * @author longgangbai
- */
- public final class WSMQTTServerCommon {
- //发布broker的ip和端口
- public static final String TCPAddress =System.getProperty("TCPAddress", "tcp://192.168.208.46:1883");
- //客户端的Id
- public static String clientId =String.format("%-23.23s", System.getProperty("clientId", (UUID.randomUUID().toString())).trim()).replace('-', '_');
- //发布消息的主题
- public static final String topicString = System.getProperty("topicString", "china/beijing");
- //发布的消息
- public static final String publication =System.getProperty("publication", "Hello World " + String.format("%tc", System.currentTimeMillis()));
- //超时时间
- public static final int quiesceTimeout = Integer.parseInt(System.getProperty("timeout", "10000"));
- public static final int sleepTimeout = Integer.parseInt(System.getProperty("timeout", "10000"));
- public static final boolean cleanSession =Boolean.parseBoolean(System.getProperty("cleanSession", "false"));
- public static final int QoS =Integer.parseInt(System.getProperty("QoS", "1"));
- public static final boolean retained =Boolean.parseBoolean(System.getProperty("retained", "false"));
- }
MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用的更多相关文章
- MQTT的学习研究(十四) MQTT moquette 的 Callback API 消息发布订阅的实现
在moquette-mqtt中提供了回调callback模式的发布和订阅但是在订阅之后没有发现有消息接收的方法,参看moquette-mqtt中Block,Future式的发布订阅基础是callbac ...
- MQTT的学习研究(十二) MQTT moquette 的 Future API 消息发布订阅的实现
MQTT moquette 的Server发布主题 package com.etrip.mqtt.future; import java.net.URISyntaxException; import ...
- MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例
package com.etrip.push; import com.ibm.mqtt.MqttAdvancedCallback; import com.ibm.mqtt.MqttClient; im ...
- MQTT的学习研究(四)moquette-mqtt 的使用之mqtt Blocking API客户端订阅并接收主题信息
在上面两篇关于mqtt的broker的启动和mqtt的服务端发布主题信息之后,我们客户端需要订阅相关的信息并接收相关的主题信息. package com.etrip.mqtt; import java ...
- MQTT的学习研究(三)moquette-mqtt 的使用之mqtt服务发布主题信息
接着上一篇的moquette-mqtt 的使用之broker启动之后,我们需要启动moquette-mqtt 的服务端发布消息. 在moquette-mqtt 的mqtt-client中三种方式实现发 ...
- MQTT的学习研究(二)moquette-mqtt 的使用之mqtt broker的启动
在MQTT 官网 (http://mqtt.org/software)中有众多MQTT的实现方式.具体参看官网,Moquette是基于Apache Mina 的模型的一个Java MQTT broke ...
- MQTT协议学习研究 & Mosquitto简要教程(安装和使用)
若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...
- MQTT的学习研究(十)【转】mosquitto——一个开源的mqtt代理
MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽.不可靠或间歇性的通信.值得一提的是mqtt提供三种不同 ...
- MQTT的学习研究(六) MQTT moquette 的 Blocking API 订阅消息客户端使用
* 使用 Java 为 MQ Telemetry Transport 创建订户 * 在此任务中,您将遵循教程来创建订户应用程序.订户将针对主题创建预订并接收该预订的发布. * 提供了一个示例订户应用程 ...
随机推荐
- 【高可用HA】Apache (4) —— Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk
Mac下配置Apache Httpd负载均衡(Load Balancer)之mod_jk httpd版本: httpd-2.4.17 jk版本: tomcat-connectors-1.2.41 参考 ...
- /usr/include/glib-2.0/glib/gtypes.h:34:24: fatal error: glibconfig.h: No such file or directory
cc -DDEBUG -mtune=core2 -O2 \ -onvideo nvideo.c \ -I/usr/include/atk-1.0 \ -I/usr/include/cairo \ -I ...
- 预留端口避免占用ip_local_reserved_ports
问题描述: 业务遇到这个情况,在重启服务时,出现1986端口被占用而无法启动,非得等该端口释放后才启动成功. 问题分析: 1986端口被该服务器上的客户端随机选取源端口给占用掉了. 解决方案: 使 ...
- 透明遮罩图层VS高斯模糊滤镜 效果分析
前端流行布局中最常见的弹出图层有popup, 对话框, tooltip等, 他们都使用了新的图层,但是实现办法各不相同, 有 的是通过半通明的黑白图层实现的, 有的是通过滤镜实现的, 我们来研究一下两 ...
- debian配置ftp
大家好,最近几天我在配置vsftpd,总结出如何更快的配置vsftpd1.我的系统是debian 5.02.安装 vsftpd, apt-get install vsftpd3.配置 vsftpdcd ...
- Qt学习之路(tip): parent参数
这是一篇很简单的文章,仅仅是用来说明一下一个参数的作用,因此我把它写成了tip,而不是接下来的17. 程序写的多了,你会发现几乎所有的Qt类的构造函数都会有一个parent参数.这个参数通常是QO ...
- Spring in Action 4th 学习笔记 之 AOP
前提:本文中的AOP仅限于Spring AOP. 先说说为什么需要AOP 最简单的一个例子就是日志记录,如果想记录一些方法的执行情况,最笨的办法就是修改每一个需要记录的方法.但这,真的很笨... 好的 ...
- c# winform 自动关闭messagebox 模拟回车
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- Unity3D深入浅出 -组件与节点之间的调用关系
一.transform组件用途 1.维护场景树 2.对3D物体的平移,缩放,旋转 二.场景树定义 在Hierarchy视图中显示的: 一个game_scene场景,下面有Main Camera节点,D ...
- java反射详解 (转至 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html)
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...