JMS 規範定義了 3 種確認模式

  • AUTO_ACKNOWLEDGE

  • CLIENT_ACKNOWLEDGE

  • DUPS_OK_ACKNOWLEDGE

Apache ActiveMQ Artemis 支援兩種額外模式:PRE_ACKNOWLEDGEINDIVIDUAL_ACKNOWLEDGE

在某些情況下,您可以承受在發生故障時丟失訊息的風險,因此在將訊息傳遞給用戶端之前,先在伺服器上確認訊息會是合理的。

Apache ActiveMQ Artemis 支援此額外模式,並將其稱為預先確認模式。

在傳遞之前在伺服器上確認的缺點是,如果系統在伺服器上確認訊息之後但在將訊息傳遞給用戶端之前當機,則該訊息將會遺失。在這種情況下,訊息將會遺失,並且在系統重新啟動時將不會被恢復。

根據您的訊息傳遞情境,preAcknowledgement 模式可以避免額外的網路流量和 CPU 負載,但代價是必須處理訊息遺失的情況。

預先確認的一個使用案例範例是股票價格更新訊息。對於這些訊息,在發生當機時遺失一則訊息可能是合理的,因為下一個價格更新訊息很快就會到達,覆蓋先前的價格。

請注意,如果您使用預先確認模式,那麼您將失去所消耗訊息的交易語意,因為很明顯它們是在伺服器上首先被確認的,而不是在您提交交易時確認的。這可能是在說明顯而易見的事情,但我們希望清楚說明這些事情,以避免混淆!

1. 使用 PRE_ACKNOWLEDGE

可以透過將布林 URL 參數 preAcknowledge 設定為 true 來配置此模式。

或者,當使用 JMS API 時,請使用 ActiveMQSession.PRE_ACKNOWLEDGE 常數建立一個 JMS Session。

// messages will be acknowledge on the server *before* being delivered to the client
Session session = connection.createSession(false, ActiveMQJMSConstants.PRE_ACKNOWLEDGE);

2. 個別確認

個別確認的一個有效使用案例是當您需要有自己的排程,並且不知道您的訊息處理何時會完成時。您應該偏好每個執行緒工作者都有一個消費者,但在某些情況下,這取決於您的處理有多複雜而無法實現。為此,您可以使用個別確認。

您基本上是透過使用具有 ActiveMQJMSConstants.INDIVIDUAL_ACKNOWLEDGE 確認模式來建立 session 來設定個別 ACK。個別 ACK 繼承了來自 Client Acknowledge 的所有語意,唯一的例外是訊息是個別確認的。

請注意,為了避免在 MDB 處理上產生混淆,MDB(或 inbound 資源適配器)不支援個別 ACKNOWLEDGE。這是因為您必須在 MDB 內部完成訊息的處理。

3. 範例

請參閱預先確認範例,其中展示了如何將預先確認模式與 JMS 一起使用。