当前位置: 首页 > 知识库问答 >
问题:

如何在无法访问MQTT服务器的情况下启动camel

公冶伟
2023-03-14

我想让我的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]

我的第一个想法是在所有涉及Paho的路线上禁用自动启动,然后手动启动。这不起作用,因为即使路线本身未启动,PahoEndpoint也已启动。

我现在正在寻找另一种方法来处理这个问题。

共有2个答案

俞衡虑
2023-03-14

Camel具有try()catch()功能。

为什么不在调用to()之前添加一个try(),捕获异常,然后记录它呢?比如:

from("timer:heartbeat?period=5000")
    .routeId("send heartbeat")
    .setBody(simple("Hello World!"))
    .doTry()
    .to("paho:myhostnome/heartbeat?brokerUrl={{broker.url}}")
     .doCatch( java.net.ConnectException.class).log("failed")
    .end()
令狐经武
2023-03-14

Apache Camel 2.20以后的版本提供了一个新功能,可以让启动过程使用一个superviser控制器来运行,该控制器负责从CamelContext本身启动。这允许设置更高级的配置,让控制器处理错误,并尝试重新启动失败的路由等。

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

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

 类似资料:
  • 当对部署/实时应用程序进行任何更改时,我们需要“重启”JBoss服务器的情况是什么? 即 -如果只是热交换一些(. js/. css/. jsp)文件完成。 -如果一些类被替换。 -如果我替换完整的. war文件。 ...等等。

  • 问题内容: 我正在学习使用Selenium(v2.20)来领先一些 即将使用它创建浏览器测试的程序员。我想在 陷阱到达之前发现它们,而我却跌入了一个陷阱。 当我创建ChromeDriver时,它始终会弹出“ Google Chrome EULA”并 显示两个按钮:“接受并运行”和“取消”。因为我希望这是一个 自动化测试,所以让用户单击按钮是不可能的。 我查看了Chromium CommandSwi

  • 问题内容: 我在服务器中提取,配置并使用了make作为安装包。 但是,我无法使用 make install 。我得到错误 我运行文件夹 我仍然遇到相同的错误。 如何在没有sudo访问的情况下运行 make install ? 问题答案: 如何安装到主目录下的路径? 然后运行: 同样,如果您的脚本(例如CGI)需要您自己的Python用户版本,则必须明确告诉它们: 而不是使用默认的系统Python,

  • 我已经安装了Jenkins和Sonarqube5.1.1(也尝试了LTS),它运行在Ubuntu服务器上,可以从外部访问。我已经安装了Jenkins SonarQube插件,一切都差不多工作了。如果我在Jenkins中将SonarQube服务器URL设置为localhost,那么一切都很好。但是到SonarQube(在Jenkins内部)的链接将指向localhost,当我从外部访问Jenkins

  • 无法启动nginx服务器OS:ubuntu服务器16.04 systemctl status nginx.status抛出此消息:nginx.service-高性能web服务器和反向代理服务器加载:加载(/lib/systemd/system/nginx.service;enabled;vendor preset:enabled)活动:失败(结果:exit-code)自UTC Thu 2016-1

  • 我有一个Spring boot项目,它有使用kafka进行日志记录的依赖项。我无法摆脱所述依赖项,因为我的逻辑需要来自该依赖项的代码 我已尝试禁用自动配置 我尝试通过bean配置将missingTopicsFatal设置为false 但很明显,设置已经是假的,因为我的应用程序运行时没有失败,只是tomcat不想打开侦听端口 应用程序启动,但spring拒绝打开侦听端口,并继续使用错误进行循环 在本