當消費者連接到佇列時,正常的行為是發送到該消費者的訊息會被該消費者獨佔取得,並且當消費者確認訊息後,訊息會從佇列中移除。

另一種常見的模式是擁有佇列「瀏覽器」,它會將所有訊息發送到瀏覽器,但不會阻止其他消費者接收訊息,也不會在瀏覽器處理完訊息後將其從佇列中移除。這種瀏覽器是「非破壞性」消費者的實例。

如果佇列上的每個消費者都是非破壞性的,那麼我們可以獲得一些有趣的行為。在最後值佇列的情況下,佇列將始終包含每個鍵的最新值。

可以使用以下佇列配置來建立一個強制所有消費者都是非破壞性的佇列

<address name="foo.bar">
   <multicast>
      <queue name="orders1" non-destructive="true" />
   </multicast>
</address>

或者在使用 JMS 用戶端時,在建立消費者使用的目標時使用位址參數來自動建立。

Queue queue = session.createQueue("my.destination.name?non-destructive=true");
Topic topic = session.createTopic("my.destination.name?non-destructive=true");

此外,可以使用 address-setting 配置來預設某個位址下所有佇列的設定

<address-setting match="nonDestructiveQueue">
   <default-non-destructive>true</default-non-destructive>
</address-setting>

預設情況下,default-non-destructivefalse

1. 限制佇列大小

對於最後值佇列以外的佇列,僅擁有非破壞性消費者可能意味著訊息永遠不會被刪除,導致佇列無限制地增長。為了防止這種情況,您可以使用設定預設 expiry-delay 的功能。有關此的更多詳細資訊,請參閱expiry-delay。您也可以使用環形佇列