有没有一种方法可以确定当 运行 使用并发消费者时处理器是否卡住了?

Is there a way to determine if processor stuck when run with concurrentConsumers?

在某个时候,一个 someQueue's 尺寸开始变大。消息已入队,但未出队。这样的队列被 <from uri="activemq:queue:someQueue?concurrentConsumers=5"/> 消耗并且似乎并行处理器工作正常,因为数据似乎已被处理 - 触发了更多路由。

我想同时工作的处理器之一卡住了。怎么检查是什么原因?如何检查它是否真的卡住了,而不在处理器中添加额外的 watch dogs/timer 线程?如何查看处理器工作时间?有没有办法找到导致它的消息?

一段时间后,当队列变大时,路由停止处理数据,并且没有其他并行处理器运行。

我现在使用的只是保持线程代码安全,并使用 activemq:dstat 显示状态。我还考虑将 JPDA 连接到 Karaf 以查看内部发生了什么,但也许还有其他更简单的方法可以找到问题所在。

<route id="someRoute" startupOrder="7">
        <from uri="activemq:queue:someQueue?concurrentConsumers=5"/>
        <process ref="someProcesor"/>  
        <choice>
            <when>
                <simple>${header.ProcesedSuccesfull}</simple>                    
                    <to uri="activemq:queue:otherQueue"/>                                                               
            </when>
            <otherwise>                    
                <log loggingLevel="ERROR" message="error" loggerRef="myLogger"/>
            </otherwise>
        </choice>
    </route>

您可以看到飞行存储库,以及等待管理器 mbean [1]。后者可以告诉您有多少线程被阻塞,等待某些外部条件触发,然后再继续。

您可以使用 hawtio [2] 网络控制台从网络浏览器中查看,然后触发卡住的线程解除阻塞并继续 reject/fail 消息传递,但这会使线程继续 运行 在您的用例中,以便它可以接收新消息。

  1. https://github.com/apache/camel/blob/master/camel-core/src/main/java/org/apache/camel/api/management/mbean/ManagedAsyncProcessorAwaitManagerMBean.java
  2. http://hawt.io/