---
title: "Apache ActiveMQ Artemis transport"
description: "The babelqueue-artemis transport — a canonical-envelope publisher and a URN-routed AMQP 1.0 consumer over JMS (Jakarta Messaging), on the framework-agnostic core."
source: https://babelqueue.com/docs/babelqueue-java/1.x/apache-activemq-artemis/
updated: 2026-06-14T00:00:00.000Z
---
# Apache ActiveMQ Artemis transport
`com.babelqueue:babelqueue-artemis` is an Apache ActiveMQ Artemis transport on the Java core,
built on **JMS** (Jakarta Messaging 3.x). It sends the
[canonical envelope](/docs/spec/1.x/envelope/) as the message body with the
[§7 projection](/docs/spec/1.x/broker-bindings/#apache-activemq-artemis), and consumes by routing
each message to a handler by URN — so a message it produces is consumed by any other BabelQueue
SDK, and vice-versa. Artemis speaks AMQP 1.0, so the other SDKs interoperate over the wire even
though Java uses JMS.
## Install
Maven:
```xml
com.babelqueue
babelqueue-artemis
1.0.0
```
Requirements: **Java 17+**. It pulls `babelqueue-core` transitively; bring your Artemis JMS
client (`org.apache.activemq:artemis-jakarta-client`), which supplies both the `jakarta.jms` API
and the broker connection.
## Produce
```java
import com.babelqueue.artemis.ArtemisPublisher;
import jakarta.jms.*;
import org.apache.activemq.artemis.jms.client.ActiveMQJMSConnectionFactory;
import java.util.Map;
ConnectionFactory factory = new ActiveMQJMSConnectionFactory("tcp://localhost:61616");
try (JMSContext ctx = factory.createContext("user", "pass")) {
Session session = ctx.createSession(Session.CLIENT_ACKNOWLEDGE);
MessageProducer producer = session.createProducer(session.createQueue("orders"));
String id = ArtemisPublisher.create(session, producer)
.publish("urn:babel:orders:created", Map.of("order_id", 1042L));
}
```
`publish(urn, data)` returns the message `meta.id`; overloads add a `traceId` and a relative
`Duration delay` (native JMS 2.0 `setDeliveryDelay`).
## Consume
```java
import com.babelqueue.artemis.*;
import jakarta.jms.*;
Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE);
MessageConsumer consumer = session.createConsumer(session.createQueue("orders"));
MessageProducer dlqProducer = session.createProducer(null); // anonymous, for .dlq
ArtemisConsumer worker = ArtemisConsumer.builder(consumer, session)
.handler("urn:babel:orders:created", (envelope, message) -> {
// envelope.data(), envelope.traceId(), envelope.attempts() ...
})
.deadLetterQueue(dlqProducer, "orders.dlq")
.maxTries(3)
.build();
connection.start();
worker.run(() -> true); // receive → process → acknowledge
```
A successful handler `acknowledge`s the message. A throwing handler leaves it unacknowledged and
`recover`s the session, so the broker redelivers it and bumps `JMSXDeliveryCount`; once `maxTries`
is reached the envelope goes to `.dlq` with a `dead_letter` block. The consumer routes on
`JMSType`. Unknown-URN strategy is one of `fail` / `delete` / `release` / `dead_letter`.
One message per `poll()` keeps the session-wide `acknowledge()` / `recover()` correct — a JMS
session is single-threaded, so run one `ArtemisConsumer` per thread.
## Contract mapping (§7)
| Envelope | Apache ActiveMQ Artemis (JMS) |
| :--- | :--- |
| body | message body (`TextMessage`, byte-identical across SDKs) |
| `job` (URN) | `JMSType` (consumer routes on this) |
| `trace_id` | `JMSCorrelationID` |
| `meta.id` | `JMSMessageID` (broker-set for JMS; body is authoritative) |
| `meta.schema_version` | property `bq_schema_version` |
| `meta.lang` | property `bq_source_lang` |
| `meta.created_at` | `JMSTimestamp` (Unix ms) |
| `attempts` | `max(body, JMSXDeliveryCount − 1)` (broker counter is 1-based) |
| reserve / ack | `receive` → process → **`acknowledge()`** (CLIENT_ACKNOWLEDGE) |
| retry / delay | `recover()` redelivery · native `setDeliveryDelay` |
| dead-letter | `.dlq` + `dead_letter` block (alongside the native DLA) |
The JMS interfaces are mocked with Mockito — no Artemis, no network. The envelope is unchanged
(`schema_version` stays `1`); Apache ActiveMQ Artemis is purely additive.