2012-07-11 131 views
0

我遇到的問題是這樣的: 使用服務混合和駱駝路由我發送一個JSON消息通過activeMQ消費者。 問題是這個消費者處理這個消息的時間是X,因此消費者在消息消費期間可能會停止或崩潰。在這種情況下,消息將成爲消費者的一半,並且已經從隊列中刪除,因爲它已交付。ServiceMix,Apache ActiveMQ,駱駝發送「完成」消費消息

是否有可能使隊列在消耗時不移除消息,而是等待消費者的某些確認消息,在刪除消息之前完成此消息的處理?

在典型的文件系統導入文件中,您將刪除文件或將其重命名爲僅在文件完全處理完成並且事務完全提交時完成。那麼,如何在ESB世界中,我們可以說,保持消息,直到我完成,我告訴你刪除它。

我使用spring jms:listener-container和jms:listeners來消耗當前的消息。

回答

1

您的問題是JMS事務每天解決的問題。

從ActiveMQ的一些注意事項吧here

你可以很容易地在JMS使用本地事務,並設置這樣的監聽器容器(上sessionTransacted注意真):

<bean id="myListenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="concurrentConsumers" value="1" /> 
    <property name="connectionFactory" ref="jmsConnectionFactory" /> 
    <property name="destination" ref="myQueue" /> 
    <property name="messageListener" ref="myConsumerBean" /> 
    <property name="sessionTransacted" value="true" /> 
</bean> 

那麼你有一個交易會話。如果消息偵聽器未能使用消息,則消息將回滾到隊列。除非消息偵聽器bean中的「onMessage」方法成功返回(沒有拋出異常),否則該事務將不會提交(=從隊列中移除消息)。我想這是你想要的