2014-02-14 42 views
0

我有一種情況,我需要排空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管理員提供的排水功能?

回答

3

在TIBCO EMS管理員可以簡單地發出命令

PURGE QUEUE <queue name> 

從而除去所有消息。對於多個隊列,你可以做

PURGE ALL QUEUES <pattern using '>' and '*' as wildcards> 

注意,除了EMS管理的命令行界面,也有Java的API發出這樣管理員直接從Java程序中的命令。

0

如果在特定時間段之後不需要該消息,則可以設置消息的到期日期。這將確保消息在到期後離開隊列。除了過期之外,還可以使用帶有超時的簡單receive()調用。如果隊列中有消息,則接收將工作。如果消息處於未提交狀態或被某個進程鎖定,則只有接收呼叫才能獲得該消息。