通过集群的方式解决基于MQTT协议的RabbitMQ消息收发
在完成了基于AMQP协议的RabbitMQ消息收发后,我们要继续实现基于MQTT协议的RabbitMQ消息收发。
由于C#的RabbitMQ.Client包中只实现了基于AMQP协议的消息收发功能的封装,所以要实现基于MQTT协议的收发,我们要下载新的包。
在NuGet的解决方案中,我们选择了简单实用的M2Mqtt。
关于M2Mqtt的资料,可以参考: https://m2mqtt.wordpress.com/ https://github.com/eclipse/paho.mqtt.m2mqtt
消费者代码:
using System;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages; namespace MQTTDemo
{
class Client
{
static void Main()
{
// create client instance
MqttClient client = new MqttClient("127.0.0.1"); // register to message received
client.MqttMsgPublishReceived += client_MqttMsgPublishReceived; string clientId = Guid.NewGuid().ToString();
client.Connect(clientId); client.Subscribe(new string[] { "test" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });
} static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
string msg = System.Text.Encoding.Default.GetString(e.Message);
Console.WriteLine(msg);
}
}
}
生产者代码:
using System;
using System.Text;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages; namespace MQTTServer
{
class Server
{
static void Main()
{
// create client instance
MqttClient client = new MqttClient("127.0.0.1"); string clientId = Guid.NewGuid().ToString();
client.Connect(clientId); client.Publish("test", Encoding.UTF8.GetBytes("hello"), MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE, false); Console.WriteLine("Publish!!!"); Console.ReadKey();
client.Disconnect();
}
}
}
消费者监听的队列名会基于产生的Guid进行前后封装,“test”表示的是topic值,选择QOS_LEVEL_AT_MOST_ONCE而不是QOS_LEVEL_EXACTLY_ONCE是因为测试发现QOS_LEVEL_EXACTLY_ONCE消息会被收到多次(我也不知道为啥)。
消费者监听的队列会在消费者程序结束后自动删除,生产者不产生队列。
在rabbitmq-plugins enable rabbitmq_mqtt之后,我们就可以愉快地通过MQTT收发消息了。
然而,我们发现只能通过127.0.0.1和localhost访问RabbitMQ服务器,而本机IP访问失败。
查阅了大量资料后,我发现这是由于rabbitmq默认的config中有这么一段文字,所以我们之能在localhost中访问服务器。
%% The default "guest" user is only permitted to access the server
%% via a loopback interface (e.g. localhost).
%% {loopback_users, [<<"guest">>]},
所以我们取消了{loopback_users, []}的注释
%% Uncomment the following line if you want to allow access to the
%% guest user from anywhere on the network.
%% {loopback_users, []},
值得注意的是,由于我们在config中仅仅取消了一行注释,所以这段代码是整个代码块的最后一行。于是我们应该将句末的逗号一同去掉。
然而,我发现怎么更改默认启动的rabbitmq对应的comfig文件,都无法成功地使用我更改后的config文件,察看了log发现用的是不存在的rabbitmq.conf文件。
修改成rabbitmq.conf后服务启动失败,所以我放弃了直接在默认启动服务中更改。
由于之前配置过rabbitmq集群,所以我打算采用集群的方式解决问题。
操作可以参考https://www.cnblogs.com/lucifer1997/p/9324130.html,其中我将ClusterNode1改为了mqtt,同时在rabbitmq-mqtt.config中对{loopback_users, []}进行了更改。
如果要修改默认的mqtt用户、密码、虚拟用户、交换机信息,可以参照http://www.rabbitmq.com/mqtt.html在rabbitmq-mqtt.config中进行修改。
在命令行操作之前先把原来开启的rabbitmq_mqtt停用,避免两个服务同时监听1883端口导致报错。 rabbitmq-plugins disable rabbitmq_mqtt
同时在操作了rabbitmq-plugins-mqtt enable rabbitmq_management之后执行rabbitmq-plugins-mqtt enable rabbitmq_mqtt。
如此就可以在集群后实现远程MQTT收发,同时还可以实现AMQP与MQTT之间的收发。
通过集群的方式解决基于MQTT协议的RabbitMQ消息收发的更多相关文章
- Elastic Stack之ElasticSearch分布式集群二进制方式部署
Elastic Stack之ElasticSearch分布式集群二进制方式部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家都知道ELK其实就是Elasticsearc ...
- Elastic Stack之ElasticSearch分布式集群yum方式搭建
Elastic Stack之ElasticSearch分布式集群yum方式搭建 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搜索引擎及Lucene基本概念 1>.什么 ...
- 大数据学习day18----第三阶段spark01--------0.前言(分布式运算框架的核心思想,MR与Spark的比较,spark可以怎么运行,spark提交到spark集群的方式)1. spark(standalone模式)的安装 2. Spark各个角色的功能 3.SparkShell的使用,spark编程入门(wordcount案例)
0.前言 0.1 分布式运算框架的核心思想(此处以MR运行在yarn上为例) 提交job时,resourcemanager(图中写成了master)会根据数据的量以及工作的复杂度,解析工作量,从而 ...
- hadoop 集群常见错误解决办法
hadoop 集群常见错误解决办法 hadoop 集群常见错误解决办法: (一)启动Hadoop集群时易出现的错误: 1. 错误现象:Java.NET.NoRouteToHostException ...
- RocketMQ集群搭建方式
各角色介绍 Producer:消息的发送者:举例:发信者 Consumer:消息接收者:举例:收信者 Broker:暂存和传输消息:举例:邮局 NameServer:管理Broker:举例:各个邮局的 ...
- Android消息推送(二)--基于MQTT协议实现的推送功能
国内的Android设备,不能稳定的使用Google GCM(Google Cloud Messageing)消息推送服务. 1. 国内的Android设备,基本上从操作系统底层开始就去掉了Googl ...
- .net平台 基于 XMPP协议的即时消息服务端简单实现
.net平台 基于 XMPP协议的即时消息服务端简单实现 昨天抽空学习了一下XMPP,在网上找了好久,中文的资料太少了所以做这个简单的例子,今天才完成.公司也正在准备开发基于XMPP协议的即时通讯工具 ...
- Kubernetes 企业级集群部署方式
一.Kubernetes介绍与特性 1.1.kubernetes是什么 官方网站:http://www.kubernetes.io • Kubernetes是Google在2014年开源的一个容器集群 ...
- activeMQ主要的几类集群部署方式
官方主从实现的文档:http://activemq.apache.org/masterslave.html 一.activeMQ主要的几类部署方式比较 1.默认的单机部署(kahadb) acti ...
随机推荐
- ArrayList、Vector、HashMap、HashSet
1. list 和 set 的有序无序是否可重复 List是有序可重复的: Set是无序不可重复的: 2.ArrayList.Vector.HashMap.HashSet的默认初始容量.加载因子.扩 ...
- angular2-搭建环境
npm 模块将被下载安装到[全局目录]中.[全局目录]通过 npm config set prefix "目录路径" 来设置.通过 npm config get prefix 来 ...
- HashWithIndifferentAccess
The params method returns the parameters passed to the action, such as those fromthe form or query p ...
- ansible使用2-inventory & dynamic inventory
默认位置 /etc/ansible/hosts 标准 mail.example.com [webservers] foo.example.com bar.example.com [dbservers] ...
- java:错误Error,异常Excepition
java中throw异常后代码还会继续执行吗 今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(i ...
- Hadoop常用操作
Hadoop常用操作 1.Hadoop安装 略 2.Hadoop配置 略 3.Hadoop多目录配置 namenode和datanode节点下都可以进行多个目录的配置,但是意义不同.namenode的 ...
- vos限制客户呼出时间
问题: 公司希望自己的卡线晚上 21:00-24:00 早上00:00-7:30不能打出电话,以防遭投拆, 那么如何设置? 方法: 找到客户使用的落地网关, 落地网关——补充设置——
- 国外统计学课程主页Statistical Books, Manuals and Journals
国外统计学课程主页Statistical Books, Manuals and Journalshttp://statpages.info/javasta3.html
- Vim中根据正则对选中文本对齐(比如ini文件的=号对齐)
vimrc增加如下内容即可: vnoremap <M-=> :call Duiqi('\v(^\s*\S+)\s+(.*)')<CR> "reg匹配的第2段文字对齐 ...
- IOS NSThread(线程同步)
@interface HMViewController () /** 剩余票数 */ @property (nonatomic, assign) int leftTicketsCount; @prop ...