ActiveMQ Composite Destinations
Composite queue allows one-to-many
relationship. Send a message to One Queue (A) and it will forward the message
to Queue B, Queue C and Topic D.
To map Composite destination you need to add following
section in virtualDestinations
tag.
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeQueue
name="TEST.QUEUE.A">
<forwardTo>
<queue
physicalName="TEST.QUEUE.B" />
<queue
physicalName="TEST.QUEUE.C" />
<queue physicalName="TEST.TOPIC.D"
/>
</forwardTo>
</compositeQueue>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
By default, subscribers cannot consume messages directly
from a composite queue or topic - it is a logical construct only. Given the
configuration above, subscribers can only consume messages from TEST.QUEUE.B, TEST.QUEUE.C and TEST.TOPIC.D; but NOT TEST.QUEUE.A.
Using filtered
destinations
You may wish to create a virtual
destination which forwards messages to multiple destinations but applying a
selector first to decide if the message really does have to go to a particular
destination.
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeQueue name="TEST.QUEUE.A">
<forwardTo>
<filteredDestination selector="criteria = ‘B’” queue="TEST.QUEUE.B"
/>
<filteredDestination selector="criteria = ‘C’” queue="TEST.QUEUE.C"
/>
<filteredDestination selector="criteria = ‘D’” queue="TEST.TOPIC.D"
/>
</forwardTo>
</compositeQueue>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
In the case above, message from
TEST.QUEUE.A will be forwarded to filtered destinations with selector criteria.
Result is same as having selector based consumer on TEST.QUEUE.B
Important Aspects
of Composite Destinations:
-
Listener Queues (under forwardTo Tag) will not be created automatically. If queues are
not present, message will be LOST.
-
If you want to store message in composite queue,
make forwardOnly flag as ‘false’. It’s true by default.
<compositeQueue name="TEST.QUEUE.A" forwardOnly="false">
<forwardTo>
<queue physicalName="TEST.QUEUE.B" />
</forwardTo>
</compositeQueue>
-
Composite queue can send the message to Virtual
Topic, which will be further consumed by multiple Virtual Destinations.
-
Virtual Topic Selector Aware Consumers will not
pull the message if consumer is not active; On the contrary, Filtered Composite
destinations pull the message despite of consumer’s active status. This is very
helpful in real world scenarios.
-
Important:
Composite Destinations Supports wildcards. This is also valid for Filtered Destinations.
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeQueue name="TEST.QUEUE.A">
<forwardTo>
<filteredDestination selector="criteria
= ‘B’” queue="TEST.B.>."/>
<queue physicalName="COMPOSITE.WILD.>."/>
</forwardTo>
</compositeQueue>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors>
In the settings above, message
will be forwarded to all the queues starting with “COMPOSITE.WILD”. Also, the
message with filtered destinations will be forwarded to all the queues starting
with ‘TEST.B’.
Good summary
ReplyDeleteComposite Destinations can also be accomplished from the client side:
http://activemq.apache.org/composite-destinations.html
This is useful for when endpoints are dynamic and subject to change with each publish.