2014-09-30 42 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

相關問題