2013-05-10 46 views
0

MessageConsumer.receive(long)允許在接收方上指定超時。解決JMS MessageConsumer.receive(long)在超時範圍內不返回的解決方法

但是,我發現如果你讓生產者消失(例如通過殺死進程),消費者的接收不會總是時間到。事實上,有時候它會永遠等待,這個過程永遠不會退出。

事實證明,我可以在ExceptionListener添加到連接,但是這也有一些缺點: 約比我試圖執行的操作其他事情(1)我可能會出錯; (2)receive()本身仍然不一定完成; (3)顯然我們曾經使用ExceptionListener,它導致了一些我不知道具體細節的其他問題。

對我們來說看起來可行的一個潛在的破解(我們使用的是ActiveMQ)是當停頓發生時,線程將在wait()中(這幾乎肯定是實現特定的,但它看起來像是一個常見的選擇)。所以如果我們遇到異常,我們可以中斷執行receive()調用的線程。

這是一個理智的解決方案嗎?是否有更可靠的,衆所周知的,針對此問題常用的解決方法?

回答

0

而不是使用接收,你可以設置一個消息監聽器。這看起來像是ActiveMQ中的一個bug,你有沒有在JIRA中報告它是一個問題?

+0

不,我沒有......我不太確定這是否是一個報告它的錯誤,因爲整個JMS API對於所有的行爲細節都是如此的淡泊,幾乎所有的東西都被認爲是遵循記錄的行爲... – Trejkaz 2013-05-14 05:57:31

+0

規格明確定義了在預期的時間內返回。我強烈建議,如果你看到一個實施者沒有跟着他們提出一個錯誤。 – 2013-05-15 13:07:10