2014-09-30 39 views
0

为了通过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的交易经理使用时,为什么消费者会破坏和构建?有没有可以调整的配置?

回答

2

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

+0

募集日志级别,但我没有看到任何例外。在进一步测试开关事件时,我已经确定了与使用事务相关的问题,并着眼于受管理的连接。 – 2014-10-01 13:15:59

+0

DefaultMessageListenerContainer文档声明:“请注意,为了与所有J2EE服务器(特别是JBoss)兼容,指定外部事务管理器时,此侦听器容器将自动重新获取每个事务的所有JMS句柄。这种非缓存行为可以通过“cacheLevel”/“cacheLevelName”属性重写,即使在涉及外部事务管理器的情况下,也强制对Connection(或者Session和MessageConsumer)进行缓存。“_那不是我们所知在这里看到?但是,设置cacheLevel =“3”没有改进 – 2014-10-03 11:42:59

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> 

随着cacheLevel设置使用上述连接工厂在DMLC如下:

<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> 
+0

感谢您的建议。我已经尝试过,将我的DMLC指向CachingConnectionFactory,它又指向一个UserCredentialsConnectionFactoryAdapter,它指向通过JNDI。但是,使用该设置,由于某种原因(我可以在EMS管理控制台中看到该消息)创建消费者,因此不会处理消息。启动时没有错误。 – 2014-10-01 09:11:17

+0

您是否尝试过在我的答案中提供的所有选项?我的意思是在conn工厂缓存策略配置以及sessionTransacted和cacheLevel。 – 2014-10-01 09:14:02

+0

是的,我只是尝试所有这些,因为你sugge STED。但用户的问题仍然存在。它们实际上并不在EMS服务器上进行监听。 – 2014-10-01 11:56:51

相关问题