2012-01-08 84 views
3

我有一個接收來自隊列消息的客戶端。我目前有一個執行onMessage()MessageListener我可以直接向隊列發送消息請求嗎?

一旦收到消息,它將被進一步處理,然後保存到onMessage()方法的數據庫中;客戶然後確認收到的消息。

只要數據庫啓動就沒有問題。但是,如果數據庫關閉,客戶端將不會確認。

爲了迎合這一點,我希望客戶端按計劃的時間間隔向隊列發送預定的請求,以發送任何未確認的消息。

事實上,我這樣做的唯一方法是重新啓動客戶端,這不是理想的。有沒有辦法觸發隊列重新發送未確認的消息而不重新啓動?

我有onMessage()

//code to connect to queue 
try { 
if (DB is available){ 
     //process message 
     //save required details to DB 
     msg.acknowledge(); 
    } 
    else{ 
     //schedule to request same message later from queue 
    } 
} catch (Exception e) {} 
+0

如果數據庫關閉,爲什麼不等到啓動前再嘗試繼續。這樣就沒有必要重播消息 – 2012-01-08 11:05:36

+0

你的意思是阻止直到數據庫啓動?我不確定這是否可以......除非我誤解你的評論。 – gkinu 2012-01-08 14:23:02

+0

如果你阻塞,直到數據庫啓動會發生什麼?該線程是否有更重要的事情要做? ;)如果是這樣,我會在另一個線程,會話或連接中運行更重要的事情。 – 2012-01-08 14:25:46

回答

0

經過一些研究,我偶然發現了session.recover(),我可以用它來觸發重新傳遞。我看到有RedeliveryPolicy類可以用來設置消息重發選項。現在我的代碼如下所示:

ConnectionFactory factory = new ActiveMQConnectionFactory(url); 
RedeliveryPolicy policy = new RedeliveryPolicy(); 
policy.setBackOffMultiplier((short) 2); 
policy.setRedeliveryDelay(30000); 
policy.setInitialRedeliveryDelay(60000); 
policy.setUseExponentialBackOff(true); 
((ActiveMQConnectionFactory)factory).setRedeliveryPolicy(policy); 

final Session session = connection.createSession(false, 
       Session.CLIENT_ACKNOWLEDGE); 
... 
... 
... 
.. 


//inside onMessage() 
try { 
    if (DB is available){ 
     //process message 
     //save required details to DB 
     msg.acknowledge(); 
    } 
    else{ 
     session.recover(); 
    } 
    } catch (Exception e) {} 
0

我認爲標準的行爲已經做你想要什麼:如果消息代理是使用相同的數據庫,並且數據庫不可用,也不會接受消息,因此客戶端將對其進行後臺處理,直到消息代理再次準備就緒。

如果它們不共享相同的數據庫並且消息代理已打開,則它將假脫機消息並在onMessage引發異常時重試。 消息代理將嘗試根據其可配置策略重新發送。

+0

謝謝。我想我的問題是如何以及在哪裏配置activeMQ重新發送未確認的消息,而不是從客戶端初始化重新發送請求。我怎樣才能做到這一點? – gkinu 2012-01-08 14:20:54

相關問題