ActiveMQ to RabbitMQ
Classic and Artemis to RabbitMQ, including JMS-to-AMQP semantic mapping, selector replacement with exchange routing, and the transaction and acknowledgement differences that surface under load rather than in testing.
RabbitMQ Migrations
Migrating a message broker means migrating every application that talks to it. When you migrate to RabbitMQ from IBM MQ, ActiveMQ or a cloud queue, we map the protocol and semantic differences that break in production — not just the ones that break at compile time — then run both systems in parallel until the evidence says it is safe to cut over.
Customers




Partners



Named by the RabbitMQ Core Team
AceMQ is the Featured Authorized Partner for RabbitMQ, named by the RabbitMQ Core Engineering Team — the people who write and maintain the broker. That recognition covers RabbitMQ support, licensing and professional services, and it makes AceMQ the only RabbitMQ partner with a direct line to the core team. When an escalation needs an answer that is not in the documentation, it does not stop at a support tier.
You do not have to take our word for it — RabbitMQ lists AceMQ on its own site.
See AceMQ listed on rabbitmq.comIs This You?
Your IBM MQ or ActiveMQ licensing renewal is approaching and the number has become hard to justify
You're moving from on-premise brokers to Kubernetes and need the messaging layer to come with you
A previous migration attempt stalled because nobody could prove messages weren't being lost
Your legacy broker is running on an OS or hardware platform that's going out of support
You have JMS-based applications and no clear picture of what changes when you move to AMQP
Different teams own different producers and consumers, and no one owns the cutover
You need to migrate without a big-bang weekend outage the business will not approve
You're consolidating several brokers acquired through M&A onto one platform
Your .NET Framework applications depend on MSMQ and you are moving them to modern .NET
Outcomes
Concrete state changes, not deliverable counts. This is what actually differs about your RabbitMQ estate when the engagement closes.
Before
Paying enterprise licensing on a legacy broker for capability you have largely outgrown.
Running on RabbitMQ with the licensing line eliminated or substantially reduced, and a documented capability comparison showing nothing critical was lost.
Before
No way to prove during cutover whether messages are being dropped between systems.
Parallel-run reconciliation with message-level counts on both sides, so the cutover decision is made on evidence rather than confidence.
Before
JMS-coupled application code with broker semantics assumed throughout.
Applications migrated to AMQP with the semantic differences — acknowledgement, transactions, selectors, ordering — explicitly handled and tested.
Before
A migration plan that requires a single high-risk weekend cutover for every application at once.
An application-by-application canary cutover with per-application rollback, so a problem affects one flow rather than all of them.
Before
Broker infrastructure tied to physical hardware or a datacenter you are exiting.
RabbitMQ running on Kubernetes with the Cluster Operator, sized and configured for your actual throughput, portable across environments.
Scope
Classic and Artemis to RabbitMQ, including JMS-to-AMQP semantic mapping, selector replacement with exchange routing, and the transaction and acknowledgement differences that surface under load rather than in testing.
Queue manager topology to RabbitMQ exchanges and queues, channel and connection model differences, and the licensing reduction case — usually the reason the project is funded in the first place.
Migrating existing RabbitMQ clusters onto Kubernetes with the Cluster Operator — persistent volume sizing, network policy for inter-node Erlang distribution, and rolling update strategy that doesn't cost you quorum members.
Azure Service Bus, Amazon SQS/SNS, or Google Pub/Sub to RabbitMQ, and the reverse where a managed service is genuinely the better answer. We will tell you which direction the evidence supports.
Windows and .NET Framework applications built on MSMQ and System.Messaging, moved to RabbitMQ with the .NET client. Transactional queues and distributed transactions are scoped first, because they are the part with no direct equivalent.
Consolidating multiple RabbitMQ clusters — often inherited through acquisition — onto a single governed platform with consistent versions, policies, and operational practice.
Publisher confirms, consumer acknowledgement verification, and message-level reconciliation across both systems during parallel run — so 'no messages lost' is a measured claim rather than an assurance.
The Engagement
Every phase has a defined duration and a concrete artifact handed over at the end of it. You always know what stage you're in and what you've received.
We inventory every queue, topic, exchange, and destination on the source broker, and — more importantly — every application that connects to it. Migrations fail on the producers and consumers nobody remembered, so this phase is deliberately exhaustive about who talks to what.
You receive
We design the RabbitMQ topology — exchanges, routing, queue types, and clustering — that matches your actual messaging patterns rather than mechanically translating the old one. Then we map the semantic differences: acknowledgement models, transaction behavior, message selectors, ordering guarantees, and dead-letter handling all differ between brokers in ways that surface only under load.
You receive
Both brokers run simultaneously with traffic mirrored to RabbitMQ. This is where the migration is actually de-risked: we reconcile message counts, compare consumer behavior, and validate throughput against real production load rather than a synthetic test. Nothing is cut over until the numbers reconcile.
You receive
We cut over application by application, starting with the lowest-risk flow, with rollback available at each step. Once every flow is stable on RabbitMQ and a defined soak period passes, we help you decommission the source broker and stop the licensing.
You receive
Message broker migration services start with a translation of concepts: a queue manager becomes a cluster and virtual hosts, a JMS topic becomes a topic exchange, and a syncpoint transaction becomes publisher confirms plus consumer acknowledgements. The tables below are the starting map we use in discovery. The right-hand column names what does not carry over one to one, because that is where migrations fail.
Our IBM MQ to RabbitMQ migration services start from this map: in discovery, every queue manager, channel and client in the estate is placed against one of these rows.
| IBM MQ | RabbitMQ | What to check |
|---|---|---|
| Queue manager | A RabbitMQ cluster, with one virtual host per application boundary | RabbitMQ has no queue manager object. Isolation and permissions move to virtual hosts and users. |
| Local queue | A queue, as a quorum queue where messages must survive the loss of a node | Queue type sets durability and replication. Classic queues are not replicated. |
| Topic and subscription | A topic exchange with one queue per subscriber | Topic strings and routing keys use different separators and wildcards, so every subscription pattern needs translating. |
| Syncpoint (unit of work) | Publisher confirms on the producer, manual acknowledgement on the consumer | There is no two-phase commit. Flows that depend on XA need an idempotent consumer or an outbox pattern. |
| Backout threshold and dead-letter queue | A dead letter exchange, plus the quorum queue delivery-limit | Dead lettering is set by policy or queue argument. A message returned more times than the delivery-limit is dead-lettered. |
| Sender and receiver channels between queue managers | Shovel or Federation between clusters | Decide per flow whether the link moves messages or only replicates routing. |
| MQI and JMS clients | The RabbitMQ JMS client (JMS 2.0 and 3.0 editions) or a native AMQP client | The JMS 3.x client needs Java 11 or later. Native clients mean code changes, which discovery specifies per application. |
| Wire protocol | AMQP 0-9-1 by default, and AMQP 1.0 natively from RabbitMQ 4.0 | AMQP 1.0 in RabbitMQ does not support transactions or resuming links. |
Where an outbox table replaces an XA transaction, Debezium Server can publish the outbox rows to a RabbitMQ exchange as change events. See Debezium consulting for change data capture
| ActiveMQ / JMS | RabbitMQ | What to check |
|---|---|---|
| JMS topic | A topic exchange; each subscriber gets its own queue | The RabbitMQ JMS client uses jms.durable.topic and jms.temp.topic exchanges. |
| Virtual topic | A topic exchange with one queue per consuming group | Consumer groups are rebuilt as bindings, so the group list must come from discovery. |
| Message selector on a topic | Topic selector, using the RabbitMQ JMS Topic Exchange plugin | The plugin must be installed on the RabbitMQ server. |
| Message selector on a queue | Routing keys or a headers exchange | The RabbitMQ JMS client does not support queue selectors, so the filter moves into routing. |
| Transacted session | Local transaction in the JMS client, or confirms and acknowledgements | The client documents that local transactions do not guarantee atomicity, and XA interfaces are not implemented. |
| Dead-letter queue | A dead letter exchange | Redelivery limits and expiry rules need re-expressing as policy. |
| Queue browser | The JMS queue browser in the RabbitMQ JMS client | The client's browser consumes messages and requeues them, so they are briefly unavailable to other consumers. |
| OpenWire or Core protocol clients | RabbitMQ JMS client or an AMQP client | Artemis clients that already use AMQP 1.0 can connect to RabbitMQ 4.x natively, within the AMQP 1.0 limits above. |
Moves between these two brokers go both ways. Some teams move to RabbitMQ on cost projections at message volume, and others move off it. This section is for the RabbitMQ-bound direction, and discovery tells you honestly if the evidence points the other way.
| Azure Service Bus | RabbitMQ | What to check |
|---|---|---|
| Queue | A queue, as a quorum queue for durable work | Check message size, time-to-live and lock settings against the target queue arguments. |
| Topic and subscriptions | A topic or fanout exchange with one queue per subscription | Subscription filter rules become bindings or a headers exchange. |
| Sessions (session ID, FIFO) | Single Active Consumer on a queue, plus a consistent-hash exchange to spread session keys over several queues | A Service Bus session is an exclusive lock per session ID. RabbitMQ has no per-key lock, so ordering is rebuilt with partitioned queues. |
| Peek-lock receive | Manual acknowledgement with a bounded prefetch | Unacknowledged messages return to the queue when the consumer's channel closes. |
| Dead-letter queue and maximum delivery count | A dead letter exchange, plus the quorum queue delivery-limit | Service Bus moves a message to its DLQ after the maximum delivery count. The delivery-limit does the same job in RabbitMQ. |
| AMQP 1.0 clients | RabbitMQ 4.x native AMQP 1.0, with /queues/ and /exchanges/ addresses | Addressing and Service Bus-specific features do not exist on RabbitMQ, so each client is re-pointed and retested. |
| Amazon SQS / SNS | RabbitMQ | What to check |
|---|---|---|
| Standard queue | A queue | Consumers that assume no ordering usually move unchanged. |
| FIFO queue and message group ID | Single Active Consumer plus a consistent-hash exchange keyed on the group ID | SQS processes messages with the same group ID in sequence. Ordering in RabbitMQ holds per queue, with one active consumer. |
| Visibility timeout (default 30 seconds, up to 12 hours) | Manual acknowledgement with a bounded prefetch | Long-running handlers need acknowledgement timing designed, not copied. |
| Dead-letter queue with maxReceiveCount | A dead letter exchange, plus the quorum queue delivery-limit | SQS counts receives, RabbitMQ counts returns to the queue. Thresholds do not map directly. |
| HTTP API and long polling | Push consumers over a long-lived AMQP connection | Every SQS client changes. Plan for connection recovery from day one. |
| SNS topic fan-out | A fanout or topic exchange | Check filter policies and cross-account delivery before cutover. |
Microsoft's System.Messaging API is .NET Framework only and has no .NET (Core and later) edition, so moving an application to modern .NET means rebuilding its queue code anyway. That makes it a natural point to move to RabbitMQ.
| MSMQ | RabbitMQ | What to check |
|---|---|---|
| Private and public queues | Queues in a virtual host, as quorum queues for durable work | Queue paths and naming conventions are mapped in discovery. |
| Transactional queues with distributed transactions | Publisher confirms and manual acknowledgement, with idempotent consumers | Distributed transactions are MSMQ's defining feature and have no RabbitMQ equivalent. This is the redesign cost to scope first. |
| System.Messaging code | The RabbitMQ .NET client | Every call site changes. Discovery lists them per application. |
| Dead-letter and journal queues | A dead letter exchange, with audit copies kept in a bound queue or a stream | Decide which journal copies auditors still need. |
| Store-and-forward between machines | Shovel or Federation, or clients connecting to the cluster directly | Decide per site whether it connects to the cluster directly or runs a Shovel. |
The safest way to move a flow is to publish every message to both brokers and cut consumers over only when the two sides reconcile. Producers keep writing to the source broker and also publish to RabbitMQ with publisher confirms on. Consumers move flow by flow, lowest risk first, and rollback is a configuration change, not a restore.
| Stage | What happens | Exit gate |
|---|---|---|
| 1. Shadow | Producers dual-publish. No RabbitMQ consumer is live. | Message counts per destination match on both sides for the agreed soak period. |
| 2. Consumer trial | Consumers for the lowest-risk flow read from RabbitMQ in parallel, writing to a test target. | Outputs of both paths reconcile, and every duplicate or gap is explained. |
| 3. Flip one flow | That flow's consumers move to RabbitMQ. Producers still dual-publish. | The flow is stable for the agreed soak period, and rollback has been rehearsed. |
| 4. Stop dual publish | Producers stop writing to the source broker for that flow. | The source queue is drained and written sign-off is recorded. |
| 5. Repeat, then retire | Remaining flows repeat stages 2 to 4. The source broker is retired after the final soak. | Decommissioning plan executed and the licence or hosting line stopped. |
Rule we hold
Never combine a platform migration with a version upgrade in the same production window. If the target RabbitMQ version needs to change, that is a separate change in its own window.
Dual publishing doubles producer writes and can produce duplicates on retry, so consumers on the RabbitMQ side are built to be idempotent before stage 2 starts.
Across roughly 9 IBM MQ conversations since 2025, the drivers were licence cost and vendor support experience. Most plans were phased: the simplest workloads moved first, and IBM MQ stayed alongside RabbitMQ where it still fits. We have also scoped moves from ActiveMQ and Azure Service Bus, and one from MSMQ.
American National Insurance engaged AceMQ for a phased migration away from IBM MQ. Windows-based queues moved first, and a validated roadmap covers the mainframe queues that follow. We translated IBM MQ messaging patterns into RabbitMQ exchanges and bindings, gave code refactoring guidance, handled data to HIPAA requirements throughout, and ran both systems in parallel with behaviour validation before each cutover. The RabbitMQ target runs on Kubernetes. The Windows workloads are migrated, operations stayed continuous, and IBM MQ licensing cost is being removed progressively.
The full account is on the use-case page: American National IBM MQ to RabbitMQ migration
What we do not do
We deliver migration services remotely, guided by your engineers. We give you a per-application change specification rather than rewriting your application code, and we say in discovery if RabbitMQ is the wrong target.
For the whole-estate plan, from discovery to decommissioning, see legacy messaging modernization
Customer Success
See how enterprises trust AceMQ for their most critical RabbitMQ workloads.
Global Automotive Manufacturer
Replacing fragile SQL-trigger-based ingestion with a reliable event-driven architecture for plant-floor data movement and low-latency operations.
Fortune 500 Financial Services Company
Improving RabbitMQ reliability, queue behavior, and operational guidance for a payment system processing over 200 production changes weekly.
Global Aviation Technology Provider
Troubleshooting cluster failover, partition handling, and quorum queue issues in a high-stakes aviation operational environment.
State-Run Virtual Education Platform
Standardizing RabbitMQ deployment and training staff while migrating infrastructure from VMware to Nutanix.
International Payment Exchange Service
Reducing manual error-queue operations by improving retry handling, dead-lettering, and downstream flow management across RabbitMQ, BizTalk, and D365.
Fortune 500 Software Company
Migration to supported RabbitMQ versions with managed services, standardization, compliance posture, and Tanzu commercial licensing.
Global Telecom Leader
Resolving weekly RabbitMQ crashes, optimizing for 300,000+ connected devices, and architecting horizontal scaling strategy.
Fortune 500 Industrial Conglomerate
Enterprise-grade RabbitMQ support with code-level remediation and patch management for regulated production environments.
FAQ
Through parallel running and reconciliation rather than assurance. Both brokers run simultaneously with traffic mirrored to RabbitMQ, and we reconcile message counts on both sides continuously. Cutover happens only when the numbers agree against agreed go/no-go criteria. We also verify publisher confirms and consumer acknowledgement are correctly implemented, since most real message loss originates in application code rather than the broker.
For a moderately complex estate — a few dozen destinations and ten to twenty connected applications — nine to sixteen weeks end to end is typical. Discovery and parallel run take most of that time; the cutover itself is short. Large estates with hundreds of destinations, or environments with heavy JMS coupling in application code, run considerably longer. We scope after discovery rather than guessing up front.
The differences that matter are semantic rather than syntactic. Message selectors have no direct AMQP equivalent and must be re-expressed as exchange routing or header exchanges. Transaction and acknowledgement models differ. JMS topic durable subscriptions map differently to RabbitMQ. Ordering guarantees differ under redelivery. These compile fine and fail under production load, which is exactly why the parallel-run phase exists.
Usually yes, though the extent varies considerably. Applications using a JMS abstraction layer or a framework like Spring may need only configuration and dependency changes. Applications with broker-specific behavior assumed throughout need real work. Discovery produces a per-application change specification so you can see the cost before committing, and we frequently find the effort is concentrated in two or three applications rather than spread evenly.
Yes, and we prefer to. We cut over application by application starting with the lowest-risk flow, with rollback available at each stage. This means a problem affects one flow rather than every flow simultaneously, and it removes the need for a single high-risk window that the business has to approve. It takes longer in calendar terms and is substantially less risky.
We will say so during discovery, before you have spent the budget. Some workloads genuinely belong on Kafka — high-throughput event streaming with replay requirements is the clearest case — and some are best served by a managed cloud service. We also support Kafka and the major cloud brokers, so the recommendation is not constrained by what we can deliver. A migration to the wrong target is worse than no migration.
Yes. We produce a decommissioning plan for the source broker and support you through the soak period before it is switched off. Where the migration is licensing-driven, we help document the capability comparison your procurement or audit team needs. For VMware and Broadcom licensing specifically, AceMQ is the Expert Advantage Partner of the Year for the Americas and handles entitlement and true-up questions directly.
Let's talk
Tell us what you're migrating from and what's driving it. We'll scope the real work — including the applications that always get forgotten until cutover weekend.
Send us a message and we'll follow up within 1 hour — or book a free 30-min consultation directly.
305-204-2607info@acemq.comPrefer to talk now? Call us directly or use the consultation tab to find a time that works.