当多次使用paho-mqtt5:test
和相同的clientId
时,会抛出异常Client not connected
,但如果我对每个to
和from
使用不同的clientId
,则会正常工作
2021-10-05 19:25:28,650 ERROR [org.apa.cam.pro.err.DefaultErrorHandler] (Camel (camel-1) thread #0 - timer://test) Failed delivery for (MessageId: 871E4623819E4FB-000000000000001B on ExchangeId: 871E4623819E4FB-000000000000001B). Exhausted after delivery attempt: 1 caught: Client is not connected (32104)
Message History (complete message history is disabled)
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[route1 ] [route1 ] [from[timer://test?period=1000] ] [ 0]
...
[route1 ] [to1 ] [paho:test ] [ 0]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
: Client is not connected (32104)
at org.eclipse.paho.mqttv5.client.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:32)
at org.eclipse.paho.mqttv5.client.internal.ClientComms.sendNoWait(ClientComms.java:231)
at org.eclipse.paho.mqttv5.client.MqttAsyncClient.publish(MqttAsyncClient.java:1530)
at org.eclipse.paho.mqttv5.client.MqttClient.publish(MqttClient.java:564)
at org.apache.camel.component.paho.mqtt5.PahoMqtt5Producer.process(PahoMqtt5Producer.java:55)
at org.apache.camel.support.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:66)
at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:172)
at org.apache.camel.processor.errorhandler.RedeliveryErrorHandler$SimpleTask.run(RedeliveryErrorHandler.java:463)
at org.apache.camel.impl.engine.DefaultReactiveExecutor$Worker.schedule(DefaultReactiveExecutor.java:179)
at org.apache.camel.impl.engine.DefaultReactiveExecutor.scheduleMain(DefaultReactiveExecutor.java:64)
at org.apache.camel.processor.Pipeline.process(Pipeline.java:184)
at org.apache.camel.impl.engine.CamelInternalProcessor.process(CamelInternalProcessor.java:398)
at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:210)
at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:76)
at java.base/java.util.TimerThread.mainLoop(Timer.java:556)
at java.base/java.util.TimerThread.run(Timer.java:506)
这是我抛出异常的代码
@ApplicationScoped
class TestRouter : RouteBuilder() {
override fun configure() {
val mqtt5Component = PahoMqtt5Component()
mqtt5Component.configuration = PahoMqtt5Configuration().apply {
brokerUrl = "tcp://192.168.99.101:1883"
clientId = "paho123"
isCleanStart = true
}
context.addComponent("paho-mqtt5", mqtt5Component)
from("timer:test?period=1000").setBody(constant("Testing timer2")).to("paho-mqtt5:test")
from("paho-mqtt5:test").process { e ->
val body = (e.`in`?.body as? ByteArray)?.let { String(it) }
println("test body 1 => $body")
}
}
}
1条答案
按热度按时间vq8itlhq1#
@威廉,这是意料之中的行为
消息代理使用客户端ID来区分客户端,以便它可以对不再使用的客户端连接执行内务处理
此外,客户可能有经纪人跟踪的“最后遗嘱
在当前“clientId”的末尾附加一个随机数是可以接受的,因为除了您之外,可能没有人会关心这个问题
如果您有权访问单个登录帐户,也可以使用该登录帐户,但您仍然希望使每个会话都是唯一的,以防它们运行多个会话
也许我不明白你的问题是什么
每个客户端必须具有唯一的ID
您观察到的是什么让您认为它正在为单个客户端创建多个连接?
是否有可能您打开了多个窗口,而每个窗口都生成了不同的clientId?
通过监视服务器所看到的内容,这是诊断问题的好方法
我的paho-mqtt客户端(Javascript)作为“webclient”进行连接,我附加了一个randome编号(webclient 173)来标识此客户端
要排除故障,我建议您关闭客户机上的所有连接,并监视MQTT进程的日志
安装好监视器后,从当前没有连接的客户端打开连接
这是一个连接到我的Mosquitto日志文件的示例
$ tail -f/变量/日志/蚊子/蚊子.日志
1635169943:未指定遗嘱消息。
1635169943:正在将连接确认发送到Web客户端173(0,0)
1635169943:已收到来自Web客户端的SUBSCRIBE 173
1635169943:测试主题(QoS 0)
1635169943:正在将SUBACK发送到Web客户端173
1635170003:收到来自Web客户端的PINGREQ 173
1635170003:正在将PINGRESP发送到Web客户端173
1635170003:收到来自Web客户端的PINGREQ 173
1635170003:正在将PINGRESP发送到Web客户端173
你的日志显示了什么?