Chapter 2. The Integrated ActiveMQ Artemis Messaging Broker

2.1. ActiveMQ Artemis

Apache ActiveMQ Artemis is an open source project for an asynchronous messaging system. It is high performance, embeddable, clustered and supports multiple protocols. JBoss EAP 7 uses Apache ActiveMQ Artemis as its Jakarta Messaging broker and is configured using the messaging-activemq subsystem. This fully replaces the HornetQ broker but retains protocol compatibility with JBoss EAP 6.

The core ActiveMQ Artemis is Jakarta Messaging-agnostic and provides a non-Jakarta Messaging API, which is referred to as the core API. ActiveMQ Artemis also provides a Jakarta Messaging client API which uses a facade layer to implement the Jakarta Messaging semantics on top of the core API. Essentially, Jakarta Messaging interactions are translated into core API operations on the client side using the Jakarta Messaging client API. From there, all operations are sent using the core client API and Apache ActiveMQ Artemis wire format. The server itself only uses the core API. For more details on the core API and its concepts, refer to the ActiveMQ Artemis documentation.

2.2. Apache ActiveMQ Artemis Core API and Jakarta Messaging Destinations

Let’s quickly discuss how Jakarta Messaging destinations are mapped to Apache ActiveMQ Artemis addresses.

Apache ActiveMQ Artemis core is Jakarta Messaging-agnostic. It does not have any concept of a Jakarta Messaging topic. A Jakarta Messaging topic is implemented in core as an address (the topic name) with zero or more queues bound to it. Each queue bound to that address represents a topic subscription. Likewise, a Jakarta Messaging queue is implemented as an address (the Jakarta Messaging queue name) with one single queue bound to it which represents the Jakarta Messaging queue.

By convention, all Jakarta Messaging queues map to core queues where the core queue name has the string jms.queue. prepended to it. For example, the Jakarta Messaging queue with the name orders.europe would map to the core queue with the name jms.queue.orders.europe. The address at which the core queue is bound is also given by the core queue name.

For Jakarta Messaging topics the address at which the queues that represent the subscriptions are bound is given by prepending the string jms.topic. to the name of the Jakarta Messaging topic. For example, the Jakarta Messaging topic with name news.europe would map to the core address jms.topic.news.europe.

In other words if you send a Jakarta Messaging message to a Jakarta Messaging queue with name orders.europe, it will get routed on the server to any core queues bound to the address jms.queue.orders.europe. If you send a Jakarta Messaging message to a Jakarta Messaging topic with name news.europe, it will get routed on the server to any core queues bound to the address jms.topic.news.europe.

If you want to configure settings for a Jakarta Messaging queue with the name orders.europe, you need to configure the corresponding core queue jms.queue.orders.europe:

<!-- expired messages in JMS Queue "orders.europe" will be sent to the JMS Queue "expiry.europe" -->
<address-setting match="jms.queue.orders.europe">
   <expiry-address>jms.queue.expiry.europe</expiry-address>
   ...
</address-setting>