java - 即使MQTT服务器无法访问,如何启动camel

标签 java apache-camel paho

我想让我的 Apache Camel 应用程序更具弹性,即使在 MQTT 代理无法访问时也能启动。我们在互联网连接可能不稳定的物联网设备上使用 Camel,我希望我们的应用程序即使没有互联网连接也能启动。

示例路线如下所示:

from("timer:heartbeat?period=5000")
    .routeId("send heartbeat")
    .setBody(simple("Hello World!"))
    .to("paho:myhostnome/heartbeat?brokerUrl={{broker.url}}")

只要 MQTT 服务器可用,此功能就可以正常工作。但是,当服务器无法访问时,上下文会在预热 PahoEndpoint 时失败。

Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route send heartbeat: Route(send heartbeat)[[From[timer:heartbeat?period={{heartbe... because of Unable to connect to server
at org.apache.camel.impl.RouteService.warmUp(RouteService.java:147) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.doWarmUpRoutes(DefaultCamelContext.java:3758) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.safelyStartRouteServices(DefaultCamelContext.java:3665) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.doStartOrResumeRoutes(DefaultCamelContext.java:3451) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.doStartCamel(DefaultCamelContext.java:3305) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.access$000(DefaultCamelContext.java:202) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3089) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext$2.call(DefaultCamelContext.java:3085) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.doWithDefinedClassLoader(DefaultCamelContext.java:3108) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.doStart(DefaultCamelContext.java:3085) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.support.ServiceSupport.start(ServiceSupport.java:61) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.impl.DefaultCamelContext.start(DefaultCamelContext.java:3022) ~[camel-core-2.19.3.jar:2.19.3]
at org.apache.camel.spring.boot.RoutesCollector.maybeStart(RoutesCollector.java:242) ~[camel-spring-boot-2.19.3.jar:2.19.3]
at org.apache.camel.spring.boot.RoutesCollector.onApplicationEvent(RoutesCollector.java:217) ~[camel-spring-boot-2.19.3.jar:2.19.3]
... 13 common frames omitted
Caused by: org.eclipse.paho.client.mqttv3.MqttException: Unable to connect to server
at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:79) ~[org.eclipse.paho.client.mqttv3-1.1.0.jar:na]
at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650) ~[org.eclipse.paho.client.mqttv3-1.1.0.jar:na]
at java.lang.Thread.run(Thread.java:745) ~[na:1.8.0_121]
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method) ~[na:1.8.0_121]
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[na:1.8.0_121]
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[na:1.8.0_121]
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[na:1.8.0_121]
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[na:1.8.0_121]
at java.net.Socket.connect(Socket.java:589) ~[na:1.8.0_121]
at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:70) ~[org.eclipse.paho.client.mqttv3-1.1.0.jar:na]

我的第一个想法是禁用所有涉及泛美卫生组织的路线的自动启动并手动启动它们。这不起作用,因为即使路线本身未启动,PahoEndpoint 也会启动。

我现在正在寻找一种替代方法来解决这个问题。

最佳答案

Apache Camel 2.20 及以上版本提供了一项新功能,允许使用监督 Controller 运行启动过程,该 Controller 从 CamelContext 本身接管启动。这允许设置更高级的配置,让 Controller 处理错误,并尝试重试启动失败的路由等。

有一个通过 Spring Boot 配置的示例,但您也可以从 Java API 进行配置:https://github.com/apache/camel-spring-boot-examples/tree/main/supervising-route-controller

在即将发布的版本中,我们将改进这一新功能。 对于旧版本的 Camel,通常组件本身可能会或可能不会提供任何类型的重试机制,您需要进行配置,而不是快速失败。

关于java - 即使MQTT服务器无法访问,如何启动camel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46278550/

相关文章:

regex - 仅当表达式在 apache Camel 选择中起作用时才第一次?

树莓派上的python mqtt脚本发送和接收消息

java - MQTT 订阅数小时后未收到消息

python - AWS IoT 和带有 paho-mqtt 的 Raspberry Pi 无法连接

java - 正确使用图表

java - 在 Android 中使用 JCIFS

java - 使用 ProducerTemplate 设置 activemq 优先级

java - 为什么在将持久 activemq 消息更改为非持久消息时无法获得性能提升?

java - 获取对象在 Java 列表中的索引

java - 通过 android 连接到 Web 服务时遇到问题