KubeMQ
DeployScenariosReplace your messaging stack

Replace JMS, ActiveMQ, or AMQP 1.0 with KubeMQ

Move JMS, ActiveMQ (Java), or native AMQP 1.0 clients onto KubeMQ's one AMQP 1.0 connector — per-client on-ramps and verification.

You need a license key to start KubeMQ — it's free, about 2-3 minutes (it includes creating a free account). Get one. Step 1 below starts the broker with the connector enabled.

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.

1 · Enable the connector

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

docker run -d \  --name kubemq \  -p 5672:5672 \  -p 5671:5671 \  -p 8080:8080 \  -e KUBEMQ_TOKEN=YOUR_LICENSE_KEY \  -e CONNECTORS_AMQP10_ENABLE=true \  europe-docker.pkg.dev/kubemq/images/kubemq:next

JMS (Qpid 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.

// 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)

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

// 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:

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

ActiveMQ

Client: Apache Qpid JMS — the same client as the 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.

// 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 — send and receive a TextMessage on queues/orders.

Not a Java client? ActiveMQ's STOMP and MQTT clients don't ride this connector — repoint them at KubeMQ's own STOMP or MQTT on-ramp instead.

What carries over — and what doesn't

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.

Didn't work?

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

Was this page helpful?

On this page