2010-07-13 99 views
6

我使用ActiveMQ作爲代理來傳遞消息。這些消息是爲了寫在數據庫中。有時,數據庫無法訪問或關閉。在這種情況下,我想回滾我的郵件以便稍後重試此郵件,並且我想繼續閱讀其他郵件。ActiveMQ:死信隊列保持我的消息順序

此代碼工作正常,除了一點:rollbacked消息從閱讀別人阻止我:

private Connection getConnection() throws JMSException { 
    RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy(); 
    redeliveryPolicy.setMaximumRedeliveries(3); // will retry 3 times to dequeue rollbacked messages 
    redeliveryPolicy.setInitialRedeliveryDelay(5 *1000); // will wait 5s to read that message 

    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(user, password, url); 
    Connection connection = connectionFactory.createConnection(); 
    ((ActiveMQConnection)connection).setUseAsyncSend(true); 
    ((ActiveMQConnection)connection).setDispatchAsync(true); 
    ((ActiveMQConnection)connection).setRedeliveryPolicy(redeliveryPolicy); 
    ((ActiveMQConnection)connection).setStatsEnabled(true); 
    connection.setClientID("myClientID"); 
    return connection; 
} 

創建我會這樣說:

session = connection.createSession(true, Session.SESSION_TRANSACTED); 

回滾是求人:

session.rollback(); 

讓我們想象我的隊列中有3條消息:

1: ok 
2: KO (will need to be treated again : the message I want to rollback) 
3: ok 
4: ok 

我的消費者會做(線性序列):

commit 1 
rollback 2 
wait 5s 
rollback 2 
wait 5s 
rollback 2 
put 2 in dead letter queue (ActiveMQ.DLQ) 
commit 3 
commit 4 

但我想:

commit 1 
rollback 2 
commit 3 
commit 4 
wait 5s 
rollback 2 
wait 5s 
rollback 2 
wait 5s 
put 2 in dead letter queue (ActiveMQ.DLQ) 

所以,我如何配置我的消費者後來耽誤我rollbacked消息?

回答

8

這實際上是預期的行爲,因爲消息重試是由客戶端,而不是經紀人處理。因此,由於您有1個會話綁定,並且您的重試策略在DLQ之前爲3次重試設置,則整個重試進程將阻止該特定線程。

所以,我的第一個問題是,如果數據庫插入失敗,難道你不希望所有的其他數據庫插入由於類似的原因失敗嗎?

如果沒有,解決方法是將該隊列的重試策略設置爲0重試,並使用特定的DLQ,以便消息立即失敗並進入DLQ。然後再有一個過程每5秒鐘從DLQ中拉出,並重新處理和/或放回主隊列進行處理。

+0

感謝您對行爲的明確解釋。我們終於選擇了RabbitMQ作爲經紀人,並自行實施了DLQ。 – 2011-03-19 14:54:47

0

您是否在ActiveMQ XML配置文件中使用<strictOrderDispatchPolicy />?我不確定這是否會影響郵件重新傳遞的順序。如果您使用嚴格的訂單派單,請嘗試對該政策進行註釋,以查看是否改變了該行爲。

布魯斯

+0

不,我沒有使用此策略: 這是早於5.6版本,當你在連接工廠設置屬性nonBlockingRedelivery爲true固定。感謝fot鏈接。 – 2010-07-15 07:21:00

0

我有同樣的問題,我還沒有找到解決方案,所以決定在這裏發佈後,我發現一個人爲掙扎着相同。

<property name="nonBlockingRedelivery" value="true" /> 
相關問題