Camel 停止从 JMS 队列中取出消息

问题描述 投票:0回答:0

我们在 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”的上下文,但这从未返回到提示符。

唯一的解决方案是停止服务器并重新启动它,并重新排队“丢失”的消息。这不是一个很好的解决方案。

版本:

  • 骆驼 - 2.15.4
  • ActiveMQ-5.12.0

我们只是想知道我们如何才能获得更多关于这里发生的事情的信息。

更新:

在更多地查看日志之后,我意识到它正在“卡住”与 HTTP 端点的对话。看起来我们从来没有从目标 URL 得到回复,而且它永远不会断开连接。

那么,在 HTTP URI 中添加超时(比如 60 秒)的最佳参数是什么? CAMEL HTTP Component 里面好像定义了几个

apache-camel osgi activemq apache-karaf
© www.soinside.com 2019 - 2024. All rights reserved.