- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尝试结合 HiveMQ 的两个特性:共享订阅和持久 session 。
如果创建了一个非常简单的消息生成器。和一个非常简单的消费者。当运行多个消费者时,所有消费者都会收到所有消息。
将消费者的 clearSession 设置为 'false' 后,当运行消费者并重启消费者时,消费者在未连接时也会收到消息。太棒了。
现在将其与共享订阅功能相结合。仅使用共享订阅时,clearSession 为“true”。当运行多个消费者时,一条消息只会被一个消费者接收。它应该是循环的,情况也是如此,但是一旦您停止消费者,消息就不再是循环的,但是其中一个消费者收到的消息明显多于其他消费者。
如果我现在再次启用持久 session ,clearSession 为“false”,并启动共享订阅消费者,消费者将再次开始接收所有消息,而不是只将消息传递给一个客户端。
这里有什么问题?这是 HiveMQ 中的错误吗?persistent session 和 shared subscription 不能一起用吗?那真是太可惜了。
2017 年 2 月 15 日更新正如@fraschbi 所建议的那样,我清除了所有数据并再次重新测试了与持久 session 使用者的共享订阅。似乎有效!
但奇怪的是,错过的消息只有在第一个消费者重新连接后才会收到。所有消费者都有相同的代码,他们只是从不同的 clientId 参数开始。请参阅下面的代码。我的测试序列:
所以我的新问题是:为什么只有第一个消费者收到丢失的消息?
注意:这里的技巧仍然是停止客户端时不要取消订阅,因为那样订阅/持久化设置就丢失了!
生产者.scala
object Producer extends App {
val topic = args(0)
val brokerUrl = "tcp://localhost:1883"
val clientId = UUID.randomUUID().toString
val client = new MqttClient(brokerUrl, clientId)
client.connect()
val theTopic = client.getTopic(topic)
var count = 0
sys.addShutdownHook {
println("Disconnecting client...")
client.disconnect()
println("Disconnected.")
}
while(true) {
val msg = new MqttMessage(s"Message: $count".getBytes())
theTopic.publish(msg)
println(s"Published: $msg")
Thread.sleep(1000)
count = count + 1
}
}
消费者.scala
object Consumer extends App {
val topic = args(0)
val brokerUrl = "tcp://localhost:1883"
val clientId = args(1)
// val clientId = UUID.randomUUID().toString
val client = new MqttClient(brokerUrl, clientId)
client.setCallback(new MqttCallback {
override def deliveryComplete(token: IMqttDeliveryToken) = ()
override def messageArrived(topic: String, message: MqttMessage) = println(s"received on topic '$topic': ${new String(message.getPayload)}")
override def connectionLost(cause: Throwable) = println("Connection lost")
})
println(s"Start $clientId consuming from topic: $topic")
val options = new MqttConnectOptions()
options.setCleanSession(false);
client.connect(options)
client.subscribe(topic)
sys.addShutdownHook {
println("Disconnecting client...")
// client.unsubscribe(topic)
client.disconnect()
println("Disconnected.")
}
while(true) {
}
}
最佳答案
我将尝试分别回答您遇到的两个问题。
It should be round-robin and that is also the case, but as soon as you stop a consumer the messages a no longer round-robin but one of the consumers gets significantly more messages then the other(s).
在为共享订阅分发消息时,HiveMQ 确实更喜欢在线客户端。
If I now enable persistent session again, clearSession is 'false', and start the shared subscription consumers, the consumers start to receive all messages again instead of the message is just delivered to one client.
在问题的开头,您说您正在将具有 cleanSession=false
的客户端连接到代理并订阅主题。 (听起来好像您只使用了一个主题。)在重新连接 cleanSession=false
和共享订阅之前,您是否有可能不取消订阅这些客户端?在这种情况下,您场景第一步中的订阅仍会保留给这些客户端,并且自然而然地,他们每个人都会收到消息。
编辑:
So my new question is: why does only the 1st consumer receive the lost messages?
来自 HiveMQ 用户指南:
When a clients offline queue is full, the message for that client won’t be dropped but queued for the next offline client in a shared subscription group.
当所有客户端都离线时,分发不再是轮询。因此,您描述的场景在预期行为范围内。
消息队列的默认值为 1000。因此您可以在客户端离线时发送超过 1000 条消息,或者减小消息队列的大小。
...
<persistence>
<queued-messages>
<max-queued-messages>50</max-queued-messages>
</queued-messages>
...
</persistence>
...
将此添加到您的 config.xml
以减小消息队列大小。
关于具有持久 session 的 HiveMQ 共享订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231122/
我想将 HiveMQ 客户端和 HiveMQ 社区版(代理的实现)合并到一个项目中。我尝试将 HiveMQ 客户端添加为 Hive MQ 社区版(代理)中的 build.gradle 文件的依赖项。它
我正在编写一个主类,它将创建一些客户端并测试它们的订阅和发布。我想显示客户端连接的信息,例如连接的数据和时间、用于连接的 clientId、clientIP,无论它们是否正常连接。我不熟悉使用 Log
我正在使用 HiveMQ Java 客户端连接到 HiveMQ 代理。 Blocking Client Subscriber 不使用任何消息。使用 MQTTBox 发布和订阅工作正常。这是代码。我正在
我正在为我的组织内部运行的专有服务器连接 RESTful API。我们正在使用 HiveMQ,并且我根据 HiveMQ 网站上非常有用的文档创建了一个简单的插件。 我还回顾了缓存和非阻塞哲学,所以我明
我将 HiveMQ 服务器配置为识别 TLS 并创建了 TLS 通信。我想打印出正在使用的密码套件。我已经使用了 getSslConfig() 但我最终得到了它作为输出: 可选[com.hivemq.
我正在尝试使用 HiveMQ 通过简单的身份验证将客户端连接到服务器。在 HiveMQ Client 上,我创建了一个客户端并使用 connectWith() 指定我想通过简单例份验证进行连接。当我输
我正在尝试使用以下指南在我的 Amazon EC2 实例 (ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-20170414) 上设置 H
尝试结合 HiveMQ 的两个特性:共享订阅和持久 session 。 如果创建了一个非常简单的消息生成器。和一个非常简单的消费者。当运行多个消费者时,所有消费者都会收到所有消息。 将消费者的 cle
我正在运行 hivemq mqtt 代理社区版,并希望添加 prometheus 扩展进行监控。 两者均来自 hivemq marketplace 预编译和 github project page .
有没有办法使用某种 setter 方法为客户端分配名称并使用另一种方法检索它?到目前为止,我只是创建了一些方法来打印语句和转换,因此我一直将客户端名称作为字符串手动传递给静态方法,例如 PubSubU
我使用的是 HiveMQ 客户端版本 1.0.1,但我决定更新到最近发布的版本 1.1。我完全从头开始,将项目作为 Gradle 项目导入并尝试构建。只有在忽略一些失败的测试后,构建才能工作。我在 3
我按照教程从从 here 下载的 paho 图形用户界面向 hiveMQ(通过执行我从他们网站下载的 run.bat 文件运行)发送消息,它工作正常并显示客户端连接和发送消息的日志,工作正常,现在我已
我一直在尝试在我的 Android 应用程序中使用 hivemq 实现 mqtt。尽管我使用了他们文档中的相同规范和配置,但我仍然无法建立成功的连接。 我之前能够将 paho 用于 mqtt,但如果应
问题已解决:检查帖子底部 我无法连接到 websockets。端口 1883 工作正常。这是 MQTT.fx 的输出: 2017-01-21 07:46:26,293 INFO --- Broker
因此,我有一个在我的本地计算机上运行的 hivemq 服务器,我正试图将它连接到我可以使用 C# over TLS 中的 M2Mqtt 库连接到服务器的位置。我按照本指南为 C# 创建了证书。 htt
我创建了一个客户端来使用安全连接和加密负载进行测试,因此我想使用默认的 SSL 配置。我尝试这样做,但我得到了一个 ConnectionClosedException 并且服务器立即关闭。我应该在服务
我尝试先设置创建客户端以测试 MQTT 是否正常工作,然后我将实现 connect() 方法。我下载了最新版本的 HiveMQ(一个用 Java 完成的开源 MQTT 实现),在将项目作为 Gradl
我正在尝试为 CentOS 上的 HiveMQ 3.4.2 的 Web UI 启用 ssl 连接。我已经像这样更改了 config.xml 文件 ... true
我想使用 TLS 1.3 与 HiveMQ 进行安全通信。我已经配置了 HiveMQ 社区版服务器 config.xml 文件以指定使用 TLS 1.3 密码套件,并将其指向包含 256 位椭圆曲线
我是一名优秀的程序员,十分优秀!