我正在将 Spring Integration (2.2.0) 与 WebSphere (8.0.0.x) 一起使用,以便通过 JMS (Tibco EMS) 发送消息。
组件之间的通信工作正常,但我们观察到消息传递之间存在巨大的延迟。这些与我们在 EMS 日志中看到的一致:
2014-09-30 06:04:19.940 [user@host]: Destroyed consumer (connid=19202559, sessid=28728543, consid=328585032) on queue 'test.queue3.request'
2014-09-30 06:04:19.969 [user@host]: Created consumer (connid=19202564, sessid=28728551, consid=328585054) on queue 'test.queue2.request'
2014-09-30 06:04:20.668 [user@host]: Destroyed consumer (connid=19202562, sessid=28728549, consid=328585048) on queue 'test.queue1.request'
2014-09-30 06:04:20.733 [user@host]: Created consumer (connid=19202567, sessid=28728555, consid=328585071) on queue 'test.queue5.request'
2014-09-30 06:04:20.850 [user@host]: Destroyed consumer (connid=19202563, sessid=28728550, consid=328585051) on queue 'test.queue4.request'
2014-09-30 06:04:21.001 [user@host]: Destroyed consumer (connid=19202564, sessid=28728551, consid=328585054) on queue 'test.queue2.request'
2014-09-30 06:04:21.701 [user@host]: Created consumer (connid=19202571, sessid=28728561, consid=328585093) on queue 'test.queue3.request'
2014-09-30 06:04:21.762 [user@host]: 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 服务器的连接(在此指明主机、端口、用户、密码),消费者仍会不断地重新创建,但出于某种原因,这些重新创建不会影响端到端延迟。与 WAS 相比,Spring 对连接的管理显然更好。
- 如何配置 WAS 让消费者像在 Spring 中一样快速触发?
如果与之前的更改一起,我还删除了 DefaultMessageListenerContainer 中对事务管理器的引用,那么消费者将完全停止销毁和构建。
- WebSphere 的事务管理器可能有什么问题?为什么在使用 WAS 的事务管理器时,消费者会破坏和构建?有什么可以调整的配置吗?