「回溯式」位址是一種可以保存發送到該位址的訊息的位址,以供未來於該位址上建立的佇列使用。這在發布/訂閱的使用案例中很有用,例如,當客戶端希望接收在他們實際連接並建立多播「訂閱」佇列之前發送到該位址的訊息時。通常,在佇列建立之前發送到位址的訊息對於這些佇列是不可用的,但是使用回溯式位址,代理程式可以保留固定數量的訊息,並自動複製到後續於該位址上建立的佇列中。這適用於單播和多播佇列。

1. 內部回溯資源

為了實現此功能,代理程式將為每個回溯式位址建立 4 個內部資源

  1. 一個非獨佔的 轉向器 (divert),用於從回溯式位址獲取訊息。

  2. 一個用於接收來自轉向器訊息的位址。

  3. 兩個 環形佇列,用於保存轉向器發送到該位址的訊息 - 一個用於單播,另一個用於多播。環形佇列的一般注意事項仍然適用於此處。請參閱 關於環形佇列的章節以獲取更多詳細資訊。

這些資源非常重要,需要注意,因為它們將顯示在網路主控台和其他管理或指標檢視中。它們將按照以下模式命名

<internal-naming-prefix><delimiter><source-address><delimiter>(divert|address|queue<delimiter>(anycast|multicast))<delimiter>retro

例如,如果一個名為 myAddress 的位址的 retroactive-message-count 為 10,並且使用了預設的 internal-naming-prefix(即 $.artemis.internal.)和預設的分隔符(即 .),則將會建立具有以下名稱的資源

  1. myAddress 上名為 $.artemis.internal.myAddress.divert.retro 的轉向器。

  2. 一個名為 $.artemis.internal.myAddress.address.retro 的位址。

  3. 在步驟 #2 的位址上名為 $.artemis.internal.myAddress.queue.multicast.retro 的多播佇列,ring-size 為 10。

  4. 在步驟 #2 的位址上名為 $.artemis.internal.myAddress.queue.anycast.retro 的單播佇列,ring-size 為 10。

此模式非常重要,需要注意,因為它允許在必要時配置位址設定。若要配置自訂位址設定,您可以使用類似如下的匹配項

*.*.*.<source-address>.*.retro

使用與上述相同的範例,match 將會是

*.*.*.myAddress.*.retro
一旦建立這些回溯資源,變更代理程式的 internal-naming-prefix 將會破壞回溯功能。

2. 設定

若要將位址設定為「回溯式」,只需配置 retroactive-message-count address-setting 以反映您希望代理程式保留的訊息數量,例如

<address-settings>
   <address-setting match="orders">
      <retroactive-message-count>100</retroactive-message-count>
   </address-setting>
</address-settings>

retroactive-message-count 的值可以在執行時透過 broker.xml 或管理 API 更新,就像任何其他位址設定一樣。但是,如果您減少 retroactive-message-count 的值,則需要額外的管理步驟,因為此功能是透過環形佇列實現的。這是因為環形大小減小的環形佇列不會自動從佇列中刪除訊息以滿足新的環形大小,以避免意外的訊息丟失。因此,在這種情況下,需要管理操作才能透過管理 API 手動減少環形佇列中的訊息數量。