66 lines
3.7 KiB
Plaintext
66 lines
3.7 KiB
Plaintext
= Retroactive Addresses
|
|
:idprefix:
|
|
:idseparator: -
|
|
|
|
A "retroactive" address is an address that will preserve messages sent to it for queues which will be created on it in the future.
|
|
This can be useful in, for example, publish-subscribe use cases where clients want to receive the messages sent to the address _before_ they actually connected and created their multicast "subscription" queue.
|
|
Typically messages sent to an address before a queue was created on it would simply be unavailable to those queues, but with a retroactive address a fixed number of messages can be preserved by the broker and automatically copied into queues subsequently created on the address.
|
|
This works for both anycast and multicast queues.
|
|
|
|
== Internal Retroactive Resources
|
|
|
|
To implement this functionality the broker will create 4 internal resources for each retroactive address:
|
|
|
|
. A non-exclusive xref:diverts.adoc#diverting-and-splitting-message-flows[divert] to grab the messages from the retroactive address.
|
|
. An address to receive the messages from the divert.
|
|
. *Two* xref:ring-queues.adoc#ring-queue[ring queues] to hold the messages sent to the address by the divert - one for anycast and one for multicast.
|
|
The general caveats for ring queues still apply here.
|
|
See xref:ring-queues.adoc#ring-queue[the chapter on ring queues] for more details.
|
|
|
|
These resources are important to be aware of as they will show up in the web console and other management or metric views.
|
|
They will be named according to the following pattern:
|
|
|
|
----
|
|
<internal-naming-prefix><delimiter><source-address><delimiter>(divert|address|queue<delimiter>(anycast|multicast))<delimiter>retro
|
|
----
|
|
|
|
For example, if an address named `myAddress` had a `retroactive-message-count` of 10 and the default `internal-naming-prefix` (i.e. `$.artemis.internal.`) and the default delimiter (i.e. `.`) were being used then resources with these names would be created:
|
|
|
|
. A divert on `myAddress` named `$.artemis.internal.myAddress.divert.retro`
|
|
. An address named `$.artemis.internal.myAddress.address.retro`
|
|
. A multicast queue on the address from step #2 named `$.artemis.internal.myAddress.queue.multicast.retro` with a `ring-size` of 10.
|
|
. An anycast queue on the address from step #2 named `$.artemis.internal.myAddress.queue.anycast.retro` with a `ring-size` of 10.
|
|
|
|
This pattern is important to note as it allows one to configure address-settings if necessary.
|
|
To configure custom address-settings you'd use a match like:
|
|
|
|
----
|
|
*.*.*.<source-address>.*.retro
|
|
----
|
|
|
|
Using the same example as above the `match` would be:
|
|
|
|
----
|
|
*.*.*.myAddress.*.retro
|
|
----
|
|
|
|
NOTE: Changing the broker's `internal-naming-prefix` once these retroactive resources are created will break the retroactive functionality.
|
|
|
|
== Configuration
|
|
|
|
To configure an address to be "retroactive" simply configure the `retroactive-message-count` `address-setting` to reflect the number of messages you want the broker to preserve, e.g.:
|
|
|
|
[,xml]
|
|
----
|
|
<address-settings>
|
|
<address-setting match="orders">
|
|
<retroactive-message-count>100</retroactive-message-count>
|
|
</address-setting>
|
|
</address-settings>
|
|
----
|
|
|
|
The value for `retroactive-message-count` can be updated at runtime either via `broker.xml` or via the management API just like any other address-setting.
|
|
However, if you _reduce_ the value of `retroactive-message-count` an additional administrative step will be required since this functionality is implemented via ring queues.
|
|
This is because a ring queue whose ring-size is reduced will not automatically delete messages from the queue to meet the new ring-size in order to avoid unintended message loss.
|
|
Therefore, administrative action will be required in this case to manually reduce the number of messages in the ring queue via the management API.
|