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’.