我们在 Karaf OSGI 服务器中使用 Camel 和 ActiveMQ。
我们有一个路由,它从 JMS 队列中取出消息并将它们传递到 HTTPS 端点。这是构建路由的 Java 代码:
from(fromURI).autoStartup(true)
.onException(Throwable.class).handled(true).maximumRedeliveries(0)
.to("bean:our.own.OutputErrorHandler").end()
.log(LoggingLevel.INFO, "Received batch to Output for Queue: " + queue.getName())
.setHeader(Exchange.HTTP_METHOD, constant("POST"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
.to("log:DEBUG?showBody=true&showHeaders=true")
.to(outputURI)
.to("log:DEBUG?showBody=true&showHeaders=true")
.routeId(queue.getName() + "-Output-HTTP")
.end();
其中“fromURI”类似于“jms:queue:201.output”,而“outputUri”是 HTTPS 端点 URL。
现在这个工作正常,时间是随机的。有时是几个月或几周,今天只有几个小时。在这一点上,路由停止从队列中取出消息。
请注意,目标 HTTPS enpoint 有点慢,因此队列可能会稍微落后一些。不确定这是否是一个问题。
在 Karaf Console 中我们可以使用 'activemq:dstat' 来显示 'Enqueue #' 高于 'Dequeue #' 并且前者继续上升,这表明 ActiveMQ JMS 队列正在正确接收消息.这是上次失败时的样子:
Name Queue Size Producer # Consumer # Enqueue # Dequeue # Forward #
201.Output 198 0 1 1697 1499 0
虽然它被“停止”,但我在这条路线上做了一个“骆驼:路线信息”并得到:
Camel Route Outward Events-Output-HTTP
Camel Context: core-interfaces
State: Started
State: Started
Statistics
Exchanges Total: 1498
Exchanges Completed: 1498
Exchanges Failed: 0
Exchanges Inflight: 1
Min Processing Time: 28 ms
Max Processing Time: 30328 ms
Mean Processing Time: 1913 ms
Total Processing Time: 2865697 ms
Last Processing Time: 140 ms
Delta Processing Time: -817 ms
Reset Statistics Date: 2023-04-14 10:14:17
First Exchange Date: 2023-04-14 10:14:19
Last Exchange Date: 2023-04-14 13:00:00
注意此命令是在 13:26 执行的,最后交换时间是 13:00。
我试图停止此路由使用“camel:context-stop”的上下文,但这从未返回到提示符。
唯一的解决方案是停止服务器并重新启动它,并重新排队“丢失”的消息。这不是一个很好的解决方案。
版本:
我们只是想知道我们如何才能获得更多关于这里发生的事情的信息。
更新:
在更多地查看日志之后,我意识到它正在“卡住”与 HTTP 端点的对话。看起来我们从来没有从目标 URL 得到回复,而且它永远不会断开连接。
那么,在 HTTP URI 中添加超时(比如 60 秒)的最佳参数是什么? CAMEL HTTP Component 里面好像定义了几个