0

我正在将 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 的事务管理器时,消费者会破坏和构建?有什么可以调整的配置吗?
4

2 回答 2

2

你不应该看到消费者像这样被回收,除非你的监听器抛出异常。容器消费者默认是长寿的。我建议您打开容器的 DEBUG(甚至 TRACE)日志记录,以了解发生了什么。

于 2014-09-30T10:31:55.183 回答
0

建议用CachingConnectionFactory装饰器包装你的连接工厂并配置会话缓存策略:

<bean id="cacheConnFactory"
    class="org.springframework.jms.connection.CachingConnectionFactory">
    <property name="targetConnectionFactory" ref="connectionFactory" />
    <property name="cacheProducers" value="true" />
    <property name="cacheConsumers" value="true" />
    <property name="sessionCacheSize" value="10" />
</bean>

在您的 DMLC 中使用上述连接工厂以及cacheLevel如下设置:

<bean id="adp1Container"
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"
    p:taskExecutor-ref="taskExecutor"
    p:destinationName="requestQueue1"
    p:connectionFactory-ref="cacheConnFactory"
    p:destinationResolver-ref="jmsDestinationResolver"
    p:transactionManager-ref="transactionManager">
    <property name="sessionTransacted" value="true" />
    <property name="cacheLevel" value="3" /> <!-- Consumer Level -->
</bean>
于 2014-10-01T07:19:17.570 回答