2016-01-24 47 views
0

假設一個JMS消息得到了在JMS客戶端接收器onMessage方法。代理(IBM MQ)位於其他JVM上。在此之後 - JMS客戶端的JVM崩潰了(在ACKNOWLEDGE發佈之前)。JMS客戶端的JVM粉碎 - 客戶確認模式

我使用的客戶端進行確認。沒有交易。

請問經紀人得到異常(有什麼異常?)當客戶端崩潰了? 消息是否會留在隊列中? 消息是否會重新傳遞以及何時/如何?

回答

1

首先IBM MQ不會在JVM上運行。 IBM MQ隊列管理器運行時包含一組協調的進程。

隊列管理器進程並不確認客戶端應用程序終止,並不會清理。

使用CLIENT_ACKNOWLEDGE模式時,IBM MQ JMS客戶端從SYNC_POINT下的隊列中檢索消息,因此消息不會從隊列中刪除,直到應用程序確認爲止。消息將在應用程序恢復時重新傳遞,即調用connection.start()方法。但是,如果退出計數超過退出閾值(BOTHRESH),則不會將消息重新發送給應用程序。在這種情況下,如果定義了消息,消息將被移動到撤銷隊列(BOQNAME)。如果由於某種原因消息不能移動到退出隊列,則消息將被移至隊列管理器上定義的死信隊列(DLQ)。

+0

我使用的是春天的JMS連接池。所以每個消息的連接都沒有關閉/打開。每條消息都有一個新的會話。因此,在一條消息未被確認之後,在我重新啓動我的應用程序之前它不會重新傳送?這是不夠的..也許有一種方法來檢查每個消息到達,如果隊列中有未傳遞的消息,並要求提供它們? – user5157427

+0

由於使用CLIENT_ACKNOWLEDGE模式接收到消息,因此必須確認將其從隊列中刪除。如果它沒有被確認,並且應用程序沒有調用session.close()方法,則消息不可見於其他消費者,因此不能傳遞給其他消費者。 – Shashi