# Replace JMS, ActiveMQ, or AMQP 1.0 with KubeMQ (/deploy/scenarios/replace/replace-amqp-1-0)



<Callout type="info">
  You need a license key to start KubeMQ — it's free, about 2-3 minutes (it includes creating a free account). 

  [Get one](/deploy/license-key)

  . Step 1 below starts the broker with the connector enabled.
</Callout>

JMS applications, ActiveMQ's Java clients, and native AMQP 1.0 clients all reach KubeMQ
through the **same connector** — one AMQP 1.0 listener on ports 5672 (plain) and 5671
(TLS). Enable it once, then jump to the section for your client.

**Drop-in level:** varies by client — JMS is a **client-swap**, native AMQP 1.0 is
**endpoint/client**, and ActiveMQ is **client-swap** (Java) or **endpoint** (STOMP,
MQTT) — see the [drop-in levels legend](/deploy/scenarios/replace#drop-in-levels).

## 1 · Enable the connector [#1--enable-the-connector]

The AMQP 1.0 connector is disabled by default — enable it and publish its ports:

<RunKubeMQ env="{ CONNECTORS_AMQP10_ENABLE: 'true' }" ports="[5672, 5671, 8080]" />

## JMS (Qpid JMS) [#jms]

**Client:** Apache Qpid JMS **2.x** (jakarta namespace), or the **1.x** line if your
codebase still targets `javax.jms`.

Swap only the `ConnectionFactory` — the JMS calls you already wrote (`createSession`,
`createProducer`, `createConsumer`, and so on) do not change.

```java
// Before — any other JMS provider
// ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://old-broker:61616");

// After — Qpid JMS over KubeMQ's AMQP 1.0 connector
ConnectionFactory cf = new JmsConnectionFactory("amqp://kubemq-host:5672");
```

**Verify:** send a `TextMessage` to `queues/orders` and receive it back with
`AUTO_ACKNOWLEDGE`. Open the KubeMQ dashboard's AMQP 1.0 page — you should see one
connection, one sender link, and one receiver link.

## Native AMQP 1.0 (go-amqp) [#native-amqp-1-0]

**Client:** `github.com/Azure/go-amqp` v1.7.0 (AMQP.NET Lite and Apache Qpid Proton
clients migrate the same way — change only the endpoint).

```go
// Before
// conn, err := amqp.Dial(ctx, "amqp://old-broker:5672", nil)

// After
conn, err := amqp.Dial(ctx, "amqp://kubemq-host:5672",
    &amqp.ConnOptions{SASLType: amqp.SASLTypePlain("svc-orders", "<kubemq-jwt>")})
```

**Verify:** attach a sender to `/queues/orders`, send one message, then attach a
receiver and accept it. Expected output:

```text
received: {"id":"1","item":"widget"}
```

## ActiveMQ [#activemq]

**Client:** Apache Qpid JMS — the same client as the [JMS](#jms) section above.
ActiveMQ's own **OpenWire** protocol is **not supported**; a Java/JMS ActiveMQ
application migrates by swapping its `ConnectionFactory` to Qpid JMS, exactly like the
JMS path.

```java
// Before — ActiveMQ Classic or Artemis (OpenWire)
// ConnectionFactory cf = new ActiveMQConnectionFactory("tcp://activemq:61616");

// After — Qpid JMS over KubeMQ
ConnectionFactory cf = new JmsConnectionFactory("amqp://kubemq-host:5672");
```

**Verify:** same as [JMS](#jms) — send and receive a `TextMessage` on `queues/orders`.

<Callout type="info">
  Not a Java client? ActiveMQ's STOMP and MQTT clients don't ride this connector —
  repoint them at KubeMQ's own [STOMP](/deploy/scenarios/replace/replace-stomp) or
  [MQTT](/deploy/scenarios/replace/replace-mqtt) on-ramp instead.
</Callout>

## What carries over — and what doesn't [#what-carries-over--and-what-doesnt]

Queues, Events, and durable Events Store subscriptions carry over cleanly on every path
above. JMS/AMQP transactions (including XA) and a client-settable dead-letter queue do
not — a poison message past `MaxReceiveCount` is silently dropped, not dead-lettered.

<Cards>
  <Card title="AMQP 1.0 connector — Getting Started" href="/connectors/amqp/tutorials/getting-started" description="The full connector walkthrough — address mapping, flow control, and a round-trip example in six languages." />

  <Card title="Migrating from JMS" href="/connectors/how-to/migration/from-jms" description="The full ConnectionFactory cutover — destination mapping, selectors, security, and the documented JMS gaps." />

  <Card title="Migrating from ActiveMQ" href="/connectors/how-to/migration/from-activemq" description="Route an ActiveMQ workload by client type — JMS, STOMP, or MQTT — with the OpenWire caveat." />

  <Card title="Migrating from AMQP 1.0" href="/connectors/how-to/migration/from-amqp-1-0" description="Native AMQP 1.0 address mapping, RPC, and the transaction/settlement deviations." />
</Cards>

## Didn't work? [#didnt-work]

<Callout type="warn">
  * **Connection refused on 5672** — the AMQP 1.0 connector is opt-in; confirm
    `CONNECTORS_AMQP10_ENABLE=true` was set on the container that's running (the literal
    `10` stays attached to `AMQP` with no underscore — `CONNECTORS_AMQP_1_0_ENABLE` does
    not bind).
  * **`JMSSecurityException` / SASL auth failure** — if the server has authentication
    enabled, pass a KubeMQ JWT as the SASL PLAIN password; the username is audit-only.
  * **ActiveMQ client won't connect** — check it isn't still using OpenWire
    (`tcp://...:61616`); OpenWire has no KubeMQ equivalent, so Java clients move to Qpid
    JMS and non-Java clients move to the STOMP or MQTT on-ramp.
</Callout>
