好了,你的問題其實是,你停止在處理消息時收聽JMS隊列,然後註冊自己。當然,在處理前一個消息時,你可能會錯過消息。
我建議不要從JMS隊列註銷自己,爲了確保您一次處理一條消息,可以使用單個線程池來處理您的請求。
例如,如果之前你有這樣的事情:
public void onNewJMSMessage(JMSMessage message) {
unregisterMySelf();
processMessage(message);
registerMySelf();
}
用這個代替:
啓動類成員是這樣的:
private ExecutorsService processingPool = Executors.newSingleThreadExecutor();
和
public void onNewJMSMessage(final JMSMessage message) {
processingPool.submit(new Runnable() {
@Override
public void run() {
processMessage(message);
}
});
}
Thi s將保證一次只處理一條消息(如果封閉類是唯一的,否則你將不得不設置一個單例來確保單線程池的唯一性)。
這樣做後,這將主要允許您刪除您的EJB中的Thread.sleep
,這是邪惡的和各種令人頭痛的問題。
你是什麼意思「它會錯過它?」看起來你有一個設計問題,當你說:「它將需要足夠快地恢復......」幾乎不會依賴於某些代碼的執行速度會足夠快的事實。它應該工作,它需要1ms或1小時 – 2012-04-20 07:55:14
我想你是對的。你將如何重新設計它,使訂戶能夠始終接收消息? – rayman 2012-04-20 09:13:05
對不起,我不是JMS專家,所以我不知道它是如何工作的以及你可以做出什麼假設。我不明白你爲什麼會錯過任何信息。如果您忙於做其他事情,則該消息應排隊,但不能丟棄。您的意思是您的用戶在處理收到的消息時會停止收聽新消息,並在他們完成後再次開始收聽? – 2012-04-20 09:30:17