2016-12-01 28 views
0

我的環境:spring 4.1JBoss EAP 6.4IBM MQ 8.0春JMS消息重新傳遞工作不正常的CLIENT_ACKNOWLEDGE模式

消息未在Listener拋出RuntimeException的情況下重新發送。

我已經中JmsConfig如下:

@Bean 
DefaultMessageListenerContainer defaultMessageListenerContainer(QueueConnectionFactory connectionFactory, JndiDestinationResolver dr, MessageListener ml) { 
    DefaultMessageListenerContainer mlc = new DefaultMessageListenerContainer(); 
    mlc.setConnectionFactory(connectionFactory); 
    mlc.setMessageListener(ml); 
    mlc.setDestinationName(jndiInQueue); 
    mlc.setDestinationResolver(dr); 
    mlc.setSessionTransacted(true); 
    mlc.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); 
    return mlc; 
} 

如果我使用一個JmsTransactionManager並將其傳遞給上面的方法,並使用像這樣:

mlc.setTransactionManager(tm)

以下警告被寫入日誌:

It is not valid to commit a non-transacted session,和行爲是一樣的,沒有重發年。

ConnectionFactory是通過JNDI獲得的,不知是否通過jndi採購ConnectionFactory與此有關?

AbstractMessageListenerContainer Javadoc中:

爲了始終如一地與任何容器的變體還船安排,考慮「CLIENT_ACKNOWLEDGE」模式或 - 優選 - 設定「sessionTransacted」爲「真」,而不是

SO上有一個similar question

回答

0

將您的ack模式轉換爲Session.SESSION_TRANSACTED而不是CLIENT_ACKNOWLEDGE。

客戶端確認模式不工作,因爲大多數人都想要它..並且是JMS中常見的「陷阱」。它確認當前消息和會話中以前的所有消息。這不是每個消息的確認。

編輯:

還要檢查post-- IBM MQ可能需要您使用的連接工廠類的「XA」版本有關。

裁判:Websphere Liberty profile - transacted Websphere MQ connection factory

+0

我曾嘗試Session.SESSION_TRANSACTED,沒有工作。 – kmansoor