2013-03-06 51 views
3

我有:如果客戶確認沒有完成會發生什麼?

  • 一個HornetQ的-2.2.14-最終獨立服務器
  • 將消息發送客戶端應用程序C1到隊列,其從隊列甲
  • 消耗消息的
  • 客戶端應用程序C2

C1使用JmsTemplate的用於CLIENT_ACKNOWLEDGE模式發送消息:

<bean name="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> 
    <property name="connectionFactory" ref="connectionFactory" /> 
    <property name="sessionAcknowledgeModeName" value="CLIENT_ACKNOWLEDGE" /> 
    <property name="sessionTransacted" value="true" /> 
</bean> 

手動所以C2應確認消息:

@Override 
@Transactional 
public void onMessage(Message message) 
{ 
    try 
    { 
     messageHandlerService.handleReceivedMessage(message); 
     message.acknowledge(); 
    } 
    catch (DeserializeXmlException e) 
    { 
     // TODO log 
     e.printStackTrace(); 
    } 
    catch (InvalidMessageException e) 
    { 
     //TODO log 
     e.printStackTrace(); 
    } 
    catch (JMSException e) 
    { 
     //TODO log 
     e.printStackTrace(); 
    } 
} 

我的問題:

  • 會發生的消息是什麼,當客戶端C2收到消息,但崩潰之前承認呢?
  • 是否有超時機制?如果是,什麼是確認超時默認值?我如何修改它?

回答

5

客戶關閉或回滾時,任何非acked消息都將被髮送回隊列。

在服務器崩潰的情況下,如果消息是非持久性的,就像沒有任何事情發生一樣,消息將被重新傳遞。

請注意,系統可能會在您稱爲ack但在確認實際到達服務器之前崩潰。

通過更改連接工廠的callTimeout來配置確認超時。

請注意,如果您有兩個資源需要更新,並且希望確保ack和數據庫插入(或您下一步要做的任何操作)之間的單個提交,那麼您需要執行XA事務以確保兩個分支都將承諾。

該消息將在崩潰後重新發送。如果您需要100%的收據保證,您需要XA。

+0

確認超時情況如何?我可以改變它(從hornetq或客戶端)? – united 2013-03-06 14:53:35

+0

如果服務器在確認到達服務器之前崩潰,我該怎麼辦? (「message.acnknowledge()」會引發確認異常嗎?) – united 2013-03-06 14:56:07

+0

我編輯了我的問題 – 2013-03-06 16:43:50

相關問題