我有一種情況,我需要排空JMS(特別是Tibco EMS)隊列。用例是如果我們要大量中斷,隊列將會積累起來,處理它將會花費太長時間。所以,我們想排空隊列,並執行冷啓動類型的例程來獲取當前狀態。如何用快速生產者正確排空隊列?
我到目前爲止的代碼做,這是如下:
int count = 0;
Message msg = null;
while ((msg = connection.receive(timeout)) != null) {
count++;
}
System.out.println(count + " msgs removed from queue: " + queueName);
基本上它循環接收消息,直到timeout
期滿時接收到消息之前,表明隊列爲空。
我的問題處理此值timeout
。假設隊列中有一個非常快速的生產者,設置一個500ms的超時值似乎有點任意。我們可能無限循環(即生產者每500ms產生> = 1個消息)
另一種方法是使用receiveNoWait()。就我的理解而言,如果可用,則會提取消息,或者返回空值,但不涉及超時。然而,根據THIS文章:
並非所有的JMS提供者應立即用消息返回如果你調用receiveNoWait(),並有可能對券商的消息,所以它值得等待一秒鐘左右剛需確定隊列真的被排空了。
那麼有沒有一個更強大的方式來做到這一點從編程方法?或者是否有Tibco EMS管理員提供的排水功能?