Spring integration 消息驱动通道适配器已停止处理消息
我注意到,在运行了几天之后,它停止使用队列中没有已知原因或跟踪的消息,我必须重新启动它才能继续处理。 这背后是否有任何已知的原因,以及如何找出在这种情况下发生了什么以及如何解决它。 我正在使用WMQ,需要在处理消息时维护事务。谢谢你Spring integration 消息驱动通道适配器已停止处理消息,spring-integration,Spring Integration,我注意到,在运行了几天之后,它停止使用队列中没有已知原因或跟踪的消息,我必须重新启动它才能继续处理。 这背后是否有任何已知的原因,以及如何找出在这种情况下发生了什么以及如何解决它。 我正在使用WMQ,需要在处理消息时维护事务。谢谢你 <jms:message-driven-channel-adapter acknowledge="transacted" destinat
<jms:message-driven-channel-adapter
acknowledge="transacted"
destination="inboundQueue"
channel="inboundChannel"
auto-startup="false"
max-concurrent-consumers="5"
transaction-manager="transactionManager"
recovery-interval="60000"/>
此外,我还想打开这个消费者线程上的调试来打印它试图获取一条消息,是否有办法做到这一点
已编辑*
我看到这已陷入僵局,请让我知道原因和可能的解决方案,谢谢
“receivingTaskExecutor-12”-线程t@961
java.lang.Thread.State:已阻止
位于org.springframework.jms.listener.AbstractJmsListeningContainer.isRunning(AbstractJmsListeningContainer.java:348)
-等待锁定“mqReceivingTaskExecutor-10”拥有的(java.lang.Object)t@878
位于org.springframework.jms.listener.DefaultMessageListenerContainer.ScheduleNewInvokerIfappriate(DefaultMessageListenerContainer.java:715)
位于org.springframework.jms.listener.DefaultMessageListenerContainer.messageReceived(DefaultMessageListenerContainer.java:692)
位于org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:317)
位于org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:243)
位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1102)
位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:996)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
运行(Thread.java:679)
锁定可拥有的同步器:
-锁定(java.util.concurrent.ThreadPoolExecutor$Worker)
“receivingTaskExecutor-10”-线程t@878 java.lang.Thread.State:定时等待 在sun.misc.Unsafe.park(本机方法) -停车等待(java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 位于java.util.concurrent.locks.LockSupport.parknos(LockSupport.java:226) 位于java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2081) 位于java.util.concurrent.LinkedBlockingQueue.offer(LinkedBlockingQueue.java:328) 位于org.springframework.integration.util.CallerBlocksPolicy.rejectedExecution(CallerBlocksPolicy.java:58) 位于java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:822) 位于java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1373) 位于org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor.execute(ThreadPoolTaskExecutor.java:254) 位于org.springframework.jms.listener.DefaultMessageListenerContainer.doResScheduleTask(DefaultMessageListenerContainer.java:682) 位于org.springframework.jms.listener.AbstractJmsListeningContainer.rescheduleTaskIfNecessary(AbstractJmsListeningContainer.java:519) 位于org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1036) -锁定(一个java.lang.Object) 位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146) 位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 运行(Thread.java:679) 锁定可拥有的同步器:
-锁定(java.util.concurrent.ThreadPoolExecutor$Worker)最有可能是堆栈上的某个问题(挂在用户代码的某个地方)。使用
jstack
查看遇到这种情况时容器线程正在做什么。谢谢Gary,因为这是流程的开始,从队列中读取消息,然后发送到下游进行处理,但不确定您指的是什么上堆栈问题。我今天又看到了这个问题。应用程序正在运行,但队列中有500多条消息,由于某些原因,这些消息没有被拾取。我的意思是线程可能卡在适配器下游的某个组件中。杰斯塔克会告诉你的。好的,明白了。我怀疑它与创建会话事务有关,因为它在前面工作得很好。我将不得不等待下一次见到杰斯塔克。我是否可以在此处设置会话超时以查看是否存在问题。简单的答案是确保您的任务执行器有足够的线程来满足容器并发设置,并且您不应该为容器的任务执行器使用调用的BlocksPolicy
。