当前位置: 首页 > 编程日记 > 正文

MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用

参看官方文档:

http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic=/com.ibm.mq.amqtat.doc/tt00000_.htm

*  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的消息发布代码:

Java代码  收藏代码
  1. package com.etrip.wsmqtt.server;  
  2. import com.ibm.micro.client.mqttv3.MqttClient;  
  3. import com.ibm.micro.client.mqttv3.MqttDeliveryToken;  
  4. import com.ibm.micro.client.mqttv3.MqttMessage;  
  5. import com.ibm.micro.client.mqttv3.MqttTopic;  
  6. /** 
  7.  * 使用 Java 为 MQ Telemetry Transport 创建异步发布程序 
  8.  *  
  9.  *  
  10.  *  
  11.  * 
  12.  * 消息发布的类的具体的实现 
  13.  *  
  14.  * @author longgangbai 
  15.  *  
  16.  */  
  17. public class WSMQTTServerPubAsync {  
  18. public static void main(String[] args) {  
  19. try {  
  20. //创建MqttClient对象  
  21. MqttClient client = new MqttClient(WSMQTTServerCommon.TCPAddress, WSMQTTServerCommon.clientId);  
  22. //创建MQTT相关的主题  
  23. MqttTopic topic = client.getTopic(WSMQTTServerCommon.topicString);
  24. //创建MQTT的消息体  
  25. MqttMessage message = new MqttMessage();  
  26. //设置消息传输的类型  
  27. message.setQos(2);  
  28. //设置是否在服务器中保存消息体  
  29. message.setRetained(false);  
  30. //设置消息的内容  
  31. message.setPayload(WSMQTTServerCommon.publication.getBytes());
  32. //创建一个MQTT的回调类  
  33. WSMQTTServerCallBack callback = new WSMQTTServerCallBack(WSMQTTServerCommon.clientId);  
  34. //MqttClient绑定  
  35. client.setCallback(callback);
  36. //MqttClient连接  
  37. client.connect();
  38. System.out.println("Publishing \"" + message.toString()  
  39. "\" on topic \"" + topic.getName() + "\" with QoS = "  
  40. + message.getQos());
  41. System.out.println("For client instance \"" + client.getClientId()  
  42. "\" on address " + client.getServerURI() + "\"");  
  43. //发送消息并获取回执  
  44. MqttDeliveryToken token = topic.publish(message);
  45. System.out.println("With delivery token \"" + token.hashCode()  
  46. " delivered: " + token.isComplete());  
  47. Thread.sleep(100000000000000l);
  48. //关闭连接  
  49. if (client.isConnected())  
  50. client.disconnect(WSMQTTServerCommon.quiesceTimeout);
  51. System.out.println("Disconnected: delivery token \"" + token.hashCode()  
  52. "\" received: " + token.isComplete());  
  53. catch (Exception e) {  
  54. e.printStackTrace();
  55. }
  56. }
  57. }

MQTT消息发布回调代码:

Java代码  收藏代码
  1. package com.etrip.wsmqtt.server;  
  2. import com.ibm.micro.client.mqttv3.*;  
  3. /** 
  4.  * 发布消息的回调类 
  5.  *  
  6.  * 必须实现MqttCallback的接口并实现对应的相关接口方法 
  7.  *      ◦CallBack 类将实现 MqttCallBack。每个客户机标识都需要一个回调实例。在此示例中,构造函数传递客户机标识以另存为实例数据。在回调中,将它用来标识已经启动了该回调的哪个实例。 
  8.  *  ◦必须在回调类中实现三个方法: 
  9.  *  
  10.  *  public void messageArrived(MqttTopic topic, MqttMessage message) 
  11.  *  接收已经预订的发布。 
  12.  *  
  13.  *  public void connectionLost(Throwable cause) 
  14.  *  在断开连接时调用。 
  15.  *  
  16.  *  public void deliveryComplete(MqttDeliveryToken token)) 
  17.  *      接收到已经发布的 QoS 1 或 QoS 2 消息的传递令牌时调用。 
  18.  *  
  19.  *  
  20.  *  ◦由 MqttClient.connect 激活此回调。 
  21.  *  
  22.  * @author longgangbai 
  23.  */  
  24. public class WSMQTTServerCallBack implements MqttCallback {  
  25. private String instanceData = "";  
  26. public WSMQTTServerCallBack(String instance) {  
  27. instanceData = instance;
  28. }
  29. /** 
  30.        * 接收到消息的回调的方法 
  31.        */  
  32. public void messageArrived(MqttTopic topic, MqttMessage message) {  
  33. try {  
  34. System.out.println("Message arrived: \"" + message.toString()  
  35. "\" on topic \"" + topic.toString() + "\" for instance \""  
  36. + instanceData + "\"");  
  37. catch (Exception e) {  
  38. e.printStackTrace();
  39. }
  40. }
  41. /** 
  42.        * 消息连接丢失 
  43.        */  
  44. public void connectionLost(Throwable cause) {  
  45. System.out.println("Connection lost on instance \"" + instanceData  
  46. "\" with cause \"" + cause.getMessage() + "\" Reason code "   
  47. + ((MqttException)cause).getReasonCode() + "\" Cause \""   
  48. + ((MqttException)cause).getCause() +  "\"");      
  49. cause.printStackTrace();
  50. }
  51. /** 
  52.        *  
  53.        */  
  54. public void deliveryComplete(MqttDeliveryToken token) {  
  55. try {  
  56. System.out.println("Delivery token \"" + token.hashCode()  
  57. "\" received by instance \"" + instanceData + "\"");  
  58. catch (Exception e) {  
  59. e.printStackTrace();
  60. }
  61. }
  62. }

常量类:

Java代码  收藏代码
  1. package com.etrip.wsmqtt.server;  
  2. import java.util.UUID;  
  3. /** 
  4.  *  
  5.  * 消息发布消息的常量字段 
  6.  *  
  7.  * @author longgangbai 
  8.  */  
  9. public final class WSMQTTServerCommon {  
  10. //发布broker的ip和端口  
  11. public static final String  TCPAddress =System.getProperty("TCPAddress", "tcp://192.168.208.46:1883");  
  12. //客户端的Id  
  13. public static String clientId =String.format("%-23.23s",  System.getProperty("clientId", (UUID.randomUUID().toString())).trim()).replace('-', '_');  
  14. //发布消息的主题  
  15. public static final String topicString = System.getProperty("topicString", "china/beijing");  
  16. //发布的消息  
  17. public static final String publication =System.getProperty("publication", "Hello World " + String.format("%tc", System.currentTimeMillis()));  
  18. //超时时间  
  19. public static final int quiesceTimeout = Integer.parseInt(System.getProperty("timeout", "10000"));  
  20. public static final int  sleepTimeout = Integer.parseInt(System.getProperty("timeout", "10000"));  
  21. public static final boolean cleanSession =Boolean.parseBoolean(System.getProperty("cleanSession", "false"));  
  22. public static final int QoS =Integer.parseInt(System.getProperty("QoS", "1"));  
  23. public static final boolean retained =Boolean.parseBoolean(System.getProperty("retained", "false"));  
  24. }

相关文章:

WMI技术介绍和应用——查询驱动信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。 如何使用WMI查询所有驱动信息?(转载请指明出于breaksoftware的csdn博客) CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT * FR…

NumericUpDown

NumericUpDown控件主要功能是为一个TextBox控件添加上下按钮,当单击按钮时实现数字的加减,同时也可以提供静态数据,实现这些数据的上下选择。 属性列表: TargetControlID:该控件的目标作用控件。 Width&…

提高建模效率,改变手工作坊式生产,AutoML的技术研究与应用进展如何了?

整理 | 王银出品 | AI科技大本营(ID:rgznai100)【导读】12 月 5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑协办的中国大数据技术大会(BDTC 2019)在北京长城饭店隆重举…

.net使用memcached

Windows中memached安装 -------------服务器端配置 1>开始>运行:CMD(确定) 2>cd C:\memcached(回车) 3>memcached -d install(回车 这步执行安装) 4>memcached -d start(回车 这步执行启动memcache服务器,默认分配64M内存&…

22张精炼图笔记,深度学习专项学习必备

作者 | DL&CV_study9编辑 | Elle来源 | CSDN 博客本文为人工智能学习笔记记录。【深度学习基础篇】一、深度学习基本概念监督学习:所有输入数据都有确定的对应输出数据,在各种网络架构中,输入数据和输出数据的节点层都位于网络的两端&…

WMI技术介绍和应用——查询文件夹信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。 本节主要介绍Win32_Directory类。通过该类我们将可以获得部分常用的文件夹信息。在该类中,有属性Name&#x…

CSLA .NET概述

CSLA是Component-based, Scalable, Logical Architecture的简写,CSLA .NET是Rockford Lhotka基于.Net设计的一套N-tier分布式框架。 CSLA .NET包含如下功能: l n-Level undo capability 译:n层撤销功能 l Tracking broke…

简短的几句js实现css压缩和反压缩功能

写在前面 最近一直在整理css,但因为现在Visual Studio 2013太智能了,它每每在我按ctrlED进行格式化代码的时候,就会将css进行层次格式化(如下图所示),而这个格式让我老大实在无法忍受,我老大认为…

迁移学习前沿研究亟需新鲜血液,深度学习理论不能掉链子

作者 | Frederico Guth,Tefilo Emidio de Campos编译 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】人类可以从很少的样本中学习,显示出了人类卓越的泛化能力,而这一点学习算法仍远做不到。当前,最成功的模型需要大量标记好的…

WMI技术介绍和应用——查询磁盘分区和逻辑磁盘信息

本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。(转载请指明出于breaksoftware的csdn博客) 本节主要介绍Win32_DiskPartition和Win32_LogicalDisk两…

用 jQuery 的 AJAX 功能发现的一个错误/注意点:HTTP Error 411

今天程序中有个地方需要 Ajax 方式 POST 数据,发现在 IE 6.0 下正常,而 FireFox 2.0.0.9 下则出错。通过 FireBug 抓取 ajax 回发后得到的页面信息如下:HTTP Error 411 - Length required 经过 google 搜索发现,这个 HTTP 状态码对…

jquery 取消 radio checked 属性,重新选中的问题解决

<input type"radio" name"test"/> <input type"radio" name"test" id "input2"/> (说明&#xff1a;使用的jquery 版本是 1.10.2。) 使用 jquery 的removeAttr(),清除掉 radio 的checked属性后。使用 attr(…

使用×××版软件中常见的一些错误代码

1、错误代码&#xff08;691&#xff09;&#xff1a;由于域上的用户名或密码无效而拒绝访问。如果是使用的易游提供的服务器&#xff0c;请在帐务系统确认使用的帐号是否状态正常&#xff0c;刚设置好的帐号需要等5分钟才能使用。如果是外部服务器请直接找服务器提供商。2、错…

程序员在地铁写代码遭疯狂吐槽!网友:装什么装

01作为了解程序员这个行业的人来说程序员的工作真的很累加班已经成为他们的标签有的时候网站出事或者需求比较紧急的时候可能路边也是他们的工作场地所以这个时候对于程序员们的工作来说也是不分场合的02之前看到网上有人拍到程序员在地铁上写代码的照片并将之发到网络上 图片一…

如何定制一款12306抢票浏览器——构架

快春节了&#xff0c;火车票一票难求。虽然黄牛市场冷淡了&#xff0c;但是互联网“娱乐界”却越来越闹腾了。先是猎豹等浏览器推出抢票专版&#xff08;插件&#xff09;&#xff0c;然后是铁道部约谈金山&#xff0c;之后流传工信部叫停抢票插件&#xff0c;之后再是工信部出…

一些链接, 关于不可变数据

这篇笔记介绍不可变数据, Persistent Data Structure 和 Immutable. 但是不深入数据结构实现, 函数式编程理论. 定义 https://en.wikipedia.org/wiki/Persistent_data_structure In computing, a persistent data structure is a data structure that always preserves the pre…

囚犯学会编程之后会发生什么?

作者 | Simone Stolzoff译者 | 苏本如&#xff0c;责编 | 郭芮出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】Slack是硅谷一家多元化的公司&#xff0c;它雇佣了三名以前被监禁的程序员。但事实上&#xff0c;当一个人从监狱获释时&#xff0c;监禁的耻辱…

如何定制一款12306抢票浏览器——用户界面

用户界面 我不打算写个Windows界面。因为这个软件的全部就是个浏览器。我准备将”浏览器“进行到底&#xff0c;所以我选择使用html作为我们的用户界面。我也并不打算从头开始写一个浏览器&#xff0c;我使用了《内嵌IE网页窗口中消除IE默认脚本设置影响的方法》中基于WTL的浏览…

Study on Android【四】--显示控件使用

Android的界面显示同样也是基于控件的。通常是用View&#xff08;包括ViewGroup&#xff09;控件配上XML的样式来做的。具体细节不想说了&#xff0c;可以参考 Samples里的ApiDemos/View&#xff0c;和View的Doc&#xff0c;以及Implementing a UI这篇Doc。其他还有很多&#x…

修改Vim配色方案

1. 查看备选的配色方案/usr/share/vim/vim74/colors2. 查看当前使用的配色方案在命令模式下输入 :colorscheme可见当前使用的配色方案为ron3.选择和设置配色方法编辑 ~/.vimrc文件&#xff0c;如选择ron.vim对应的配色方案&#xff0c;则添加 colorscheme ron4. 设置某项颜色--…

如何定制一款12306抢票浏览器——启动“人”线程

启动“人”线程 在《如何定制一款12306抢票浏览器——构架》一文中&#xff0c;我们提到“人”线程。对于熟悉Window编程的同学来说&#xff0c;线程间通信和信息传递不是难题。但是由于浏览器和我们“人”线程之间传递的是COM对象&#xff0c;这个过程就没有那么简单了。&…

看看你是《老朋友》(青春六人行)里的哪一个

&#xff08;点击“which friends character are you?”连接可以进入问卷页面&#xff09; Which Friends Character Are You? You are Rachel. Youre very selfish and pay great attention to image. Spoiled when you were young, you were always the popular and sn…

360金融沈赟:只有适配实践的技术才能实现价值掘金

金融科技应用的新场景、新需求层出不穷,已成为创新技术的理想“试验田”。然而当“创新”浪潮褪去&#xff0c;行业回归审慎与冷静后不难发现&#xff0c;并非所有创新技术都会深入金融土壤。对此&#xff0c;360金融首席数据科学家沈赟认为&#xff0c;只有适配实践的技术才能…

swift(一)基础变量类型

import Foundationprintln("Hello, World!")/*int a; */ var a 10 //隐式类型转换 a 9 println(a)let b 10 println(b)/* 类型标注 *///var x:Int //x 10.3不支持隐式转换let x: Int 10/* 名称不用在符合标示符的规范 */ let 常量 10/* 基本数据类型&#xff1…

如何定制一款12306抢票浏览器——实现自动查询和预订功能

检查是否进入订票页面 判断是否进入订票页面&#xff0c;我是确定了两个标准&#xff1a;&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 1 网址是否为http://www.12306.cn/mormhweb/kyfw/ 2 该页面否有查询按钮 BOOL CDeal12306WebPage::IsQueryPage( CComPt…

以数据为中心,立足六大技术支柱,英特尔推动神经拟态计算、量子计算前沿探索

近日&#xff0c;英特尔中国研究院院长宋继强围绕 “英特尔如何构建技术基石&#xff0c;驱动未来计算”为主题做了演讲。他阐述了英特尔将坚持“以数据为中心”的目标&#xff0c;并指出依托于XPU产品组合&#xff0c;英特尔通过异构整合和oneAPI软件平台来推动实现超异构计算…

Fedora 7 播放器totem

说实话&#xff0c;我喜欢这个东东&#xff0c;简约而不简单。我以前一直用mplayer&#xff0c;不过还是喜欢totem的长相。很多人说不能播放&#xff0c;可以这么做&#xff0c;让它支持全部(用mplayer的codecs)&#xff1a;(1)首先将系统已有的totem移去 # yum remove totem(2…

如何定制一款12306抢票浏览器——处理预订页面和验证码自动识别功能

判断是否进入预订页面我们先看一下预订页面的结构&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09;可以见得&#xff0c;这个页面也是嵌入了两个IFrame。关于IFrame的跨域问题&#xff0c;我已经在前一篇文章中讲述了解决办法。我判断是否是预订页面是通过两个依…

利用MTCNN和FaceNet实现人脸检测和人脸识别 | CSDN博文精选

作者 | pan_jinquan来源 | CSDN博文精选&#xff08;*点击阅读原文&#xff0c;查看作者更多文章&#xff09;人脸检测和人脸识别技术算是目前人工智能方面应用最成熟的技术了。本博客将利用MTCNN和FaceNet搭建一个实现人脸检测和人脸识别的系统。基本思路也很简单&#xff0c;…

[导入]郁闷`````[原]

阅读全文 类别&#xff1a;职场生涯 查看评论文章来源:http://hi.baidu.com/huqing7002/blog/item/b69a27082063fbd263d98619.html转载于:https://www.cnblogs.com/huqing7002/archive/2007/12/14/1007049.html