...
The default configuration is fine for locally-deployed listeners, but it can be problematic in a distributed context. For instance, if the listener is restarted while a message is sent to the topic, that message may be missed. Furthermore, if there is a networking hiccup between fedora's local broker and the remote listener, that too can result in lost messages. Instead, in this case, a queue may be better suited.
ActiveMQ supports “virtual destinations”, allowing your broker to automatically forward messages from one location to another. If fedora4 is deployed in Tomcat, the ActiveMQ configuration will be located in WEB-INF/classes/config/activemq.xml
. That file can be edited to include the following block:
Code Block |
---|
language | xml |
---|
title | activemq.xml customization: supporting a queue/fedora endpoint |
---|
linenumbers | true |
---|
|
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeTopic name="fedora">
<forwardTo>
<queue physicalName="fedora"/>
</forwardTo>
</compositeTopic>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors> |
Now a consumer can pull messages from a queue without risk of losing messages.
This configuration, however, will not allow any other applications to read from the original topic
. If it is necessary to have /topic/fedora
available to consumers, this configuration will be useful:
Code Block |
---|
language | xml |
---|
title | activemq.xml customization: supporting topic and queue endpoints |
---|
linenumbers | true |
---|
|
<destinationInterceptors>
<virtualDestinationInterceptor>
<virtualDestinations>
<compositeTopic name="fedora" forwardOnly="false">
<forwardTo>
<queue physicalName="fedora"/>
</forwardTo>
</compositeTopic>
</virtualDestinations>
</virtualDestinationInterceptor>
</destinationInterceptors> |
Now, both /topic/fedora
and /queue/fedora
will be available to consumers.
Distributed Brokers
The above example will allow you to distribute the message consumers across multiple machines without missing messages, but it can also be useful to distribute the message broker across multiple machines. This can be especially useful if you want to further decouple the message producers and consumers. It can also be useful for high-availability and failover support.
ActiveMQ supports a variety of distributed broker topologies. To push messages from both the message queue and topic to a remote broker, this configuration can be used:
Code Block |
---|
language | xml |
---|
title | activemq.xml customization: distributed brokers |
---|
linenumbers | true |
---|
|
<networkConnectors>
<networkConnector name="fedora_bridge" dynamicOnly="true" uri="static:(tcp://remote-host:61616)">
<dynamicallyIncludedDestinations>
<topic physicalName="fedora"/>
<queue physicalName="fedora"/>
</dynamicallyIncludedDestinations>
</networkConnector>
</networkConnectors> |
Protocol Support
...