有没有一种方法可以确定当 运行 使用并发消费者时处理器是否卡住了?
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 消息传递,但这会使线程继续 运行 在您的用例中,以便它可以接收新消息。
在某个时候,一个 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 消息传递,但这会使线程继续 运行 在您的用例中,以便它可以接收新消息。