2014-10-01 50 views
0

我正在使用DMLC來偵聽Tibco EMS隊列(Tomcat)。過了一段時間,消息沒有被傳送。重新啓動後,消息再次傳遞。我正在使用SingleConnectionFactory。SpringJMS DMLC消息直到重新啓動纔會被拾取

Connection Factory: 
<bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiTemplate" ref="jndiTemplate" /> 
    <property name="jndiName"  value="${connectionQueueFactory}" /> 
    <property name="cache" value="false"/> 
    <property name="lookupOnStartup" value="false"/> 
    <property name="proxyInterface" value="javax.jms.ConnectionFactory"/> 
</bean> 

Authenticated Connection Factory: 
<bean id="authenticationConnectionFactory" 
    class="com.my.service.AuthenticationConnectionFactory"> <-- extends SingleConnectionFactory 
    <property name="targetConnectionFactory" ref="jmsConnectionFactory" /> 
    <property name="username" value="${userName}" /> 
    <property name="password" value="${password}" /> 
    <property name="sessionCacheSize" value="1"/> 
</bean> 

Destination Resolver: 
<bean id="destinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver"> 
    <property name="jndiTemplate" ref="jndiTemplate" /> 
    <property name="cache" value="true"/> 
</bean> 

Container: 
<jms:listener-container concurrency="10-15" container-type="default" 
         connection-factory="simpleAuthenticationConnectionFactory" 
         destination-type="queue" 
         cache="consumer" 
         prefetch="1" 
         destination-resolver="destinationResolver" 
         acknowledge="transacted"> 
       ..... listeners..... 
    </jms:listener-container> 

謝謝。

回答

0

acknowledge="transacted"如果在處理期間拋出異常,則不會確認該消息,這可能會導致此行爲,因爲EMS守護程序認爲您的應用程序仍在忙於處理已交付但未確認的消息。

但是transacted也是唯一的確認模式,保證在發生異常情況下重新傳送。

這意味着你不能讓異常拋出,除非你的應用程序正在關閉,這可能是一個真正的痛苦。我在文章The Chain of Custody Problem中涵蓋了各種選項。簡短版本爲:

  1. 丟棄該消息並忽略該錯誤;
  2. 將消息(和/或錯誤)發送到由人員監視的錯誤日誌或隊列;
  3. 將消息(和/或錯誤)發送到由發送應用程序處理的錯誤隊列。

所有這些選項都有問題,這就是爲什麼Fire-and-Forget messaging sucks,但在你的情況下,你可能會發現選項2是最務實的。

+0

湯姆,謝謝你的回答。但是,我不會在我的聽衆中拋出異常。我捕獲異常,並根據異常類型,提交會話或回滾(使用會話感知消息監聽器)。 – user4054431 2014-10-05 06:49:04

+0

嘗試偵聽$ sys.monitor消息以查看EMS守護進程認爲正在發生的事情。要麼它沒有收到確認,要麼會話沒有正確回滾。 – 2014-10-06 11:23:41

相關問題