爲了通過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的交易經理使用時,爲什麼消費者會破壞和構建?有沒有可以調整的配置?
募集日誌級別,但我沒有看到任何例外。在進一步測試開關事件時,我已經確定了與使用事務相關的問題,並着眼於受管理的連接。 – 2014-10-01 13:15:59
DefaultMessageListenerContainer文檔聲明:「請注意,爲了與所有J2EE服務器(特別是JBoss)兼容,指定外部事務管理器時,此偵聽器容器將自動重新獲取每個事務的所有JMS句柄。這種非緩存行爲可以通過「cacheLevel」/「cacheLevelName」屬性重寫,即使在涉及外部事務管理器的情況下,也強制對Connection(或者Session和MessageConsumer)進行緩存。「_那不是我們所知在這裏看到?但是,設置cacheLevel =「3」沒有改進 – 2014-10-03 11:42:59