"追溯" 地址是指一个地址,它将保留发送到它的消息,用于将来在该地址上创建的队列。这在发布-订阅用例中很有用,例如,客户机希望接收在它们实际连接和创建其多播 "订阅" 队列之前发送到该地址的消息。通常,在队列在地址上创建之前发送到该地址的消息将无法用于这些队列,但是使用追溯地址,代理可以保留固定数量的消息,并将这些消息自动复制到随后在该地址上创建的队列中。这适用于任何播和多播队列。

1. 内部追溯资源

为了实现此功能,代理将为每个追溯地址创建 4 个内部资源

  1. 一个非独占 转移 用于从追溯地址获取消息。

  2. 一个地址用于接收来自转移的消息。

  3. 两个 环形队列 用于保存通过转移发送到该地址的消息 - 一个用于任何播,另一个用于多播。环形队列的一般注意事项在这里仍然适用。有关更多详细信息,请参阅 关于环形队列的章节

了解这些资源很重要,因为它们将在 Web 控制台和其他管理或指标视图中显示。它们的命名将遵循以下模式

<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.retroring-size 为 10。

  4. 步骤 #2 中地址上的任何播队列,名为 $.artemis.internal.myAddress.queue.anycast.retroring-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 手动减少环形队列中消息数量的管理操作。