我正在使用spring integration 4.1.0使用jms-int从TIBCO EMS队列实现消息消耗:message-driven-channel-adapter
我有9个不同的消息驱动通道适配器在不同的队列中的不同服务器上监听
下面是如何定义消息驱动的通道适配器
<int-jms:message-driven-channel-adapter
id="mdca1" connection-factory="connectionFactory1"
channel="jmsChannel1" destination="queueName1"
error-channel="errorChannel" max-concurrent-consumers="5" auto-startup="true"/>
<int-jms:message-driven-channel-adapter
id="mdca2" connection-factory="connectionFactory2"
channel="jmsChannel2" destination="queueName2"
error-channel="errorChannel" max-concurrent-consumers="5" auto-startup="true"/>
<bean id="connectionFactory1" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="tcf1"/>
<property name="sessionCacheSize" value="${sessionCacheSize}"/>
<property name="cacheProducers" value="${cacheProducers}"/>
<property name="cacheConsumers" value="${cacheConsumers}"/>
</bean>
<bean id="tcf1" class="${connectionFactoryClassName}">
<property name="serverUrl" value="${serverUrl1}" />
<property name="userName" value="${username1}" />
<property name="userPassword" value="${password1}" />
</bean>
<bean id="connectionFactory2" class="org.springframework.jms.connection.CachingConnectionFactory">
<property name="targetConnectionFactory" ref="tcf2"/>
<property name="sessionCacheSize" value="${sessionCacheSize}"/>
<property name="cacheProducers" value="${cacheProducers}"/>
<property name="cacheConsumers" value="${cacheConsumers}"/>
</bean>
<bean id="tcf2" class="${connectionFactoryClassName}">
<property name="serverUrl" value="${serverUrl2}" />
<property name="userName" value="${username2}" />
<property name="userPassword" value="${password2}" />
</bean>
我将我的应用程序部署在Tomcat上,一切正常 . 所有适配器都从队列中读取消息并发送以进行处理 .
但由于某种原因,一段时间后消息不会从队列中获取 . 目前我必须重新启动tomcat以使适配器再次工作 . 我在UI中有一个按钮来启动/停止适配器,但是一旦适配器停止从队列中选择消息,该按钮就不起作用了 . 当适配器拾取消息时,启动/停止按钮也能正常工作 . 我可以停止并且适配器停止选择消息,我可以启动并且适配器开始选择消息 . 问题是,当我的适配器运行一段时间后,在说5到10小时后,队列中有一条消息,即使适配器处于运行状态,它也不会被选中 . 按钮也会停止工作 .
任何人都可以帮助解决问题吗?为什么适配器在5-10小时后的某段时间内出现故障?
任何帮助都非常感谢 .
更新:这是侦听器失败时来自jstack的堆栈跟踪 .
"TIBCO EMS TCPLink Reader (Server-15108908)" daemon prio=10 tid=0x00007f1874115000 nid=0xc8f runnable [0x00007f18b2f1d000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:152)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read(BufferedInputStream.java:254)
- locked <0x00000006c2d8ea68> (a java.io.BufferedInputStream)
at java.io.DataInputStream.readInt(DataInputStream.java:387)
at com.tibco.tibjms.TibjmsxLinkTcp._readWireMsg(TibjmsxLinkTcp.java:625)
at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.work(TibjmsxLinkTcp.java:280)
at com.tibco.tibjms.TibjmsxLinkTcp$LinkReader.run(TibjmsxLinkTcp.java:259)
"org.springframework.jms.listener.DefaultMessageListenerContainer#1-5" prio=10 tid=0x00000000019de000 nid=0xc8e in Object.wait() [0x00007f18b301e000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c2eabdf8> (a java.lang.Object)
at com.tibco.tibjms.TibjmsxSessionImp._getSyncMessage(TibjmsxSessionImp.java:2288)
at com.tibco.tibjms.TibjmsxSessionImp._receive(TibjmsxSessionImp.java:2122)
- locked <0x00000006c2eabdf8> (a java.lang.Object)
at com.tibco.tibjms.TibjmsMessageConsumer._receive(TibjmsMessageConsumer.java:276)
at com.tibco.tibjms.TibjmsMessageConsumer.receive(TibjmsMessageConsumer.java:481)
at org.springframework.jms.connection.CachedMessageConsumer.receive(CachedMessageConsumer.java:82)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:413)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:293)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
at java.lang.Thread.run(Thread.java:745)
"org.springframework.jms.listener.DefaultMessageListenerContainer#3-2" prio=10 tid=0x00007f18ac001000 nid=0xc8d in Object.wait() [0x00007f18b311f000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x00000006c2e30270> (a java.lang.Object)
at com.tibco.tibjms.TibjmsxSessionImp._getSyncMessage(TibjmsxSessionImp.java:2288)
at com.tibco.tibjms.TibjmsxSessionImp._receive(TibjmsxSessionImp.java:2122)
- locked <0x00000006c2e30270> (a java.lang.Object)
at com.tibco.tibjms.TibjmsMessageConsumer._receive(TibjmsMessageConsumer.java:276)
at com.tibco.tibjms.TibjmsMessageConsumer.receive(TibjmsMessageConsumer.java:481)
at org.springframework.jms.connection.CachedMessageConsumer.receive(CachedMessageConsumer.java:82)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveMessage(AbstractPollingMessageListenerContainer.java:413)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:293)
at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:246)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1142)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1134)
at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1031)
at java.lang.Thread.run(Thread.java:745)
任何意见?
1 回答
这通常是由下游流中的某些组件不间断地挂起容器线程引起的(例如,从没有超时的套接字读取,没有数据到达) .
要进行诊断,请在发生挂起时进行线程转储(例如jstack),以找出侦听器容器线程正在执行的操作 .