Camel PAHO MQTT 5在路由中使用相同的clientId时引发异常

wrrgggsh  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(511)

当多次使用paho-mqtt5:test和相同的clientId时,会抛出异常Client not connected,但如果我对每个tofrom使用不同的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")
        }

    }
}
vq8itlhq

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
你的日志显示了什么?

相关问题