为了通过JMS(Tibco EMS)发送消息,我正在使用WebSphere(8.0.0.x)的Spring Integration(2.2.0)。在使用XA事务处理时使用Spring集成和WebSphere的消费者的高效使用
组件之间的通信工作正常,但我们观察到消息传递跳数之间存在巨大的延迟。这些符合我们在EMS日志中看到的内容:
2014-09-30 06:04:19.940 [[email protected]]: Destroyed consumer (connid=19202559, sessid=28728543, consid=328585032) on queue 'test.queue3.request'
2014-09-30 06:04:19.969 [[email protected]]: Created consumer (connid=19202564, sessid=28728551, consid=328585054) on queue 'test.queue2.request'
2014-09-30 06:04:20.668 [[email protected]]: Destroyed consumer (connid=19202562, sessid=28728549, consid=328585048) on queue 'test.queue1.request'
2014-09-30 06:04:20.733 [[email protected]]: Created consumer (connid=19202567, sessid=28728555, consid=328585071) on queue 'test.queue5.request'
2014-09-30 06:04:20.850 [[email protected]]: Destroyed consumer (connid=19202563, sessid=28728550, consid=328585051) on queue 'test.queue4.request'
2014-09-30 06:04:21.001 [[email protected]]: Destroyed consumer (connid=19202564, sessid=28728551, consid=328585054) on queue 'test.queue2.request'
2014-09-30 06:04:21.701 [[email protected]]: Created consumer (connid=19202571, sessid=28728561, consid=328585093) on queue 'test.queue3.request'
2014-09-30 06:04:21.762 [[email protected]]: Destroyed consumer (connid=19202567, sessid=28728555, consid=328585071) on queue 'test.queue5.request'
显然,消费者不断被破坏和重新创建。这不仅对EMS不利,而且还会消除延迟,因为消息只有在消费者重新联机后才能发送。
这是怎么了消费者的定义:
<jee:jndi-lookup id="rawConnectionFactory" jndi-name="jms/QueueCF"/>
<bean id="jmsDestinationResolver"
class="org.springframework.jms.support.destination.JndiDestinationResolver"/>
<bean id="connectionFactory"
class="org.springframework.jms.connection.UserCredentialsConnectionFactoryAdapter"
p:targetConnectionFactory-ref="rawConnectionFactory"
p:username="${jms.internal.username}"
p:password="${jms.internal.password}"/>
<bean id="taskExecutor"
class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"
p:workManagerName="wm/mc"
p:resourceRef="false"/>
<bean id="transactionManager"
class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/>
<bean id="adp1Container"
class="org.springframework.jms.listener.DefaultMessageListenerContainer"
p:taskExecutor-ref="taskExecutor"
p:destinationName="requestQueue1" p:connectionFactory-ref="connectionFactory"
p:destinationResolver-ref="jmsDestinationResolver"
p:transactionManager-ref="transactionManager" />
<jms:inbound-gateway id="jmsInAdapter1"
request-channel="adapter1logic" container="adp1Container" />
<channel id="adapter1logic" />
更新:
此行为与使用的事务管理器。
如果我们直接在Spring中指定与EMS服务器的连接(指示存在主机,端口,用户,密码),则消费者仍会不断重新创建,但由于某些原因,这些重新创建不会影响端到端延迟。显然,连接在Spring中比在WAS中更好地管理。
- 如何配置WAS,使消费者能够像在Spring中一样快速地触发?
如果和前面的更改一样,我还删除了DefaultMessageListenerContainer中对事务管理器的引用,则消费者将停止销毁并完全构建。
- WebSphere的事务管理器有什么问题?当WAS的交易经理使用时,为什么消费者会破坏和构建?有没有可以调整的配置?
募集日志级别,但我没有看到任何例外。在进一步测试开关事件时,我已经确定了与使用事务相关的问题,并着眼于受管理的连接。 – 2014-10-01 13:15:59
DefaultMessageListenerContainer文档声明:“请注意,为了与所有J2EE服务器(特别是JBoss)兼容,指定外部事务管理器时,此侦听器容器将自动重新获取每个事务的所有JMS句柄。这种非缓存行为可以通过“cacheLevel”/“cacheLevelName”属性重写,即使在涉及外部事务管理器的情况下,也强制对Connection(或者Session和MessageConsumer)进行缓存。“_那不是我们所知在这里看到?但是,设置cacheLevel =“3”没有改进 – 2014-10-03 11:42:59