獨佔消費者

功能 > 消費者功能 > 獨佔消費者

背景

我們維護佇列中訊息的順序,並依序將它們分派給消費者。然而,如果您有多個 JMS 會話和 MessageConsumer 實例從同一個佇列取用訊息(無論是否在同一個 JVM 中),您將失去依序處理訊息的保證;因為訊息將在不同的執行緒中同時處理。

有時,保證訊息的處理順序非常重要。例如,您不希望在插入完成之前處理對訂單的更新;或者在時間上倒退,用較舊的訂單更新覆蓋較新的訂單更新等等。

因此,人們在 J2EE 叢集中經常要做的是釘選叢集中的一個特定 JVM,使佇列上只有一個消費者,以避免失去排序。這樣做的問題是,如果這個被釘選的 JVM 故障,就沒有人再處理佇列,這可能會是個問題。

獨佔消費者

我們在 4.x 中有一個稱為「獨佔消費者」或「獨佔佇列」的新功能,它可以避免最終用戶必須釘選任何東西。代理程式將選擇單一 MessageConsumer 來接收佇列的所有訊息,以確保排序。如果該消費者發生故障,代理程式將自動故障轉移並選擇另一個消費者。

因此,效果是一個異質的 J2EE 叢集,其中每個 JVM 都具有相同的設定和配置;代理程式會選擇一個消費者作為節點,並依序將所有訊息發送給它,直到它停止運作;然後您會立即故障轉移到另一個消費者。

對於那些在 J2EE 叢集中努力釘選 JMS 消費者的人來說,您會立即意識到這對於建立叢集化、高可用的分散式服務有多麼有用。

範例

使用目的地選項建立獨佔消費者,如下所示

queue = new ActiveMQQueue("TEST.QUEUE?consumer.exclusive=true");
consumer = session.createConsumer(queue);

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛標誌和 Apache ActiveMQ 專案標誌是 Apache 軟體基金會的商標。版權所有 © 2024,Apache 軟體基金會。根據Apache License 2.0授權。