使用XA事务时,使用Spring Integration和WebSphere有效地使用消费者

时间:2014-09-30 10:11:42

标签: java websphere spring-integration tibco ems

我正在使用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服务器的连接(指示主机,端口,用户,密码),仍然会不断重新创建消费者,但由于某些原因,这些重新创建不会影响端到端的延迟。在Spring中,连接显然比在WAS中更好地管理。

  • 如何配置WAS以便消费者像Spring一样快速触发?

如果与之前的更改一起,我还删除了DefaultMessageListenerContainer中对事务管理器的引用,那么消费者就会停止销毁和构建。

  • WebSphere的事务管理器可能存在什么问题?为什么消费者在WAS&#39;交易经理正在使用?是否有可以调整的配置?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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>