PAHO MQTT 5路由使用相同clientId时抛出Client not connected异常
Apache Camel集成Paho MQTT5 相同clientId连接异常解决方案
根因说明
MQTT协议明确要求同一MQTT broker上不允许同时存在两个使用相同clientId的连接。你当前在组件全局配置了固定的clientId,Camel会为生产者(to节点)、消费者(from节点)两个不同的paho-mqtt5端点分别初始化独立的MQTT客户端实例,两个实例用相同clientId发起连接时,后建立的连接会被broker强制踢掉先建立的连接,最终触发错误码为32104的Client is not connected报错。
可选解决方案
方案1:分端点配置独立clientId
取消全局clientId配置,为每个端点单独设置不同的clientId,这是你已经验证可行的方案,参考代码如下:
@ApplicationScoped class TestRouter : RouteBuilder() { override fun configure() { val mqtt5Component = PahoMqtt5Component() mqtt5Component.configuration = PahoMqtt5Configuration().apply { brokerUrl = "tcp://192.168.99.101:1883" isCleanStart = true // 移除全局clientId配置 } context.addComponent("paho-mqtt5", mqtt5Component) // 生产者单独配置clientId from("timer:test?period=1000") .setBody(constant("Testing timer2")) .to("paho-mqtt5:test?clientId=paho-producer-123") // 消费者单独配置clientId from("paho-mqtt5:test?clientId=paho-consumer-123") .process { e -> val body = (e.`in`?.body as? ByteArray)?.let { String(it) } println("test body 1 => $body") } } }
方案2:开启全局共享连接
如果业务需要使用固定clientId且希望复用同一个连接,可以开启Paho MQTT5组件的共享连接配置,开启后同一Camel上下文内的所有paho-mqtt5端点会复用同一个客户端连接,不会出现clientId冲突问题:
val mqtt5Component = PahoMqtt5Component() mqtt5Component.configuration = PahoMqtt5Configuration().apply { brokerUrl = "tcp://192.168.99.101:1883" clientId = "paho123" isCleanStart = true // 开启共享连接 isSharedConnection = true } context.addComponent("paho-mqtt5", mqtt5Component)
方案3:开启自动生成clientId
如果你的业务场景不需要固定clientId,可以直接开启自动生成配置,Camel会为每个端点自动生成唯一的clientId,无需手动维护:
val mqtt5Component = PahoMqtt5Component() mqtt5Component.configuration = PahoMqtt5Configuration().apply { brokerUrl = "tcp://192.168.99.101:1883" isCleanStart = true // 开启自动生成唯一clientId isAutoGeneratedClientId = true } context.addComponent("paho-mqtt5", mqtt5Component)
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

