# Capabilities (/connectors/rabbitmq/reference/capabilities)



This reference defines exactly what the embedded KubeMQ RabbitMQ (AMQP 0-9-1) connector
**supports**, the capabilities it **forces during negotiation**, the methods it **rejects**,
and the arguments it accepts but **silently ignores**. Use it to decide which client features
are safe to rely on and which ones will be refused. Every claim here is grounded in the
connector source and integration tests.

## Supported AMQP methods [#supported-amqp-methods]

The connector implements the AMQP 0-9-1 (RabbitMQ dialect) method set needed for real
applications:

| Class          | Methods                                                                                                                                                                                |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Connection** | `connection.start` / `start-ok` / `tune` / `tune-ok` / `open` / `open-ok` / `close` / `close-ok`                                                                                       |
| **Channel**    | `channel.open` / `close` / `flow` (replies `flow-ok`, no-op)                                                                                                                           |
| **Exchange**   | `exchange.declare` (incl. `passive`), `exchange.delete`                                                                                                                                |
| **Queue**      | `queue.declare` (incl. `passive`, server-named), `queue.bind`, `queue.unbind`, `queue.purge`, `queue.delete`                                                                           |
| **Basic**      | `basic.publish`, `basic.consume`, `basic.cancel`, `basic.deliver`, `basic.get`, `basic.ack`, `basic.nack`, `basic.reject`, `basic.qos`, `basic.recover` (requeue=true), `basic.return` |
| **Confirm**    | `confirm.select` (publisher confirms)                                                                                                                                                  |

Exchanges and bindings are **virtual** connector-side routing — every AMQP queue is backed by
a single KubeMQ **Queue** channel (`amqp.{vhost}.{queue}`). See
[Channel Mapping](/connectors/rabbitmq/reference/channel-mapping) and
[Architecture](/connectors/rabbitmq/concepts/architecture).

## Forced / negotiated capabilities [#forced--negotiated-capabilities]

The connector pins the connection tuning values during `connection.tune`. A client may request
lower values, but cannot exceed these ceilings:

| Capability      | Value                                                                        |
| --------------- | ---------------------------------------------------------------------------- |
| ChannelMax      | `2047`                                                                       |
| FrameMax        | `131072` (floor `4096`)                                                      |
| Heartbeat       | `60`s (final = min non-zero of both sides; 2× idle → `client.timeout`)       |
| MaxBodySize     | `104857600` (100 MiB)                                                        |
| MaxConnections  | `1000` (`0` = unlimited)                                                     |
| Protocol header | exactly `AMQP\x00\x00\x09\x01` (8 bytes); mismatch → echo header + TCP close |
| SASL mechanism  | **PLAIN only** (AMQPLAIN / EXTERNAL → `503`)                                 |

See [Configuration](/connectors/rabbitmq/concepts/configuration) to tune ChannelMax / FrameMax /
Heartbeat / MaxBodySize / MaxConnections.

## Not implemented (`540`) [#not-implemented-540]

These methods are **advertised as unsupported** and always return `540 not-implemented`:

* `tx.*` (transactions) — on a confirm-mode channel, `tx.select` returns `406` instead;
* `exchange.bind` / `exchange.unbind` (exchange-to-exchange bindings);
* `basic.publish(immediate=true)`;
* `basic.recover-async` (and `basic.recover(requeue=false)`);
* `connection.update-secret`;
* non-PLAIN SASL (AMQPLAIN / EXTERNAL) → `503`.

See [Error & Reason Codes](/connectors/rabbitmq/reference/error-codes) for the full
close-code table.

## Inert arguments (accepted, badged, no effect) [#inert-arguments-accepted-badged-no-effect]

<Callout type="warn">
  **Inert arguments (gotcha #7).** These exchange/queue arguments are accepted (and badged in
  the dashboard topology view) but **never alter behavior**. Do not rely on them — a queue
  declared with, e.g., `x-max-length` is not actually enforcing it.
</Callout>

The connector's `inertArgNames` set — accepted, WARN-logged once, and badged in the topology
view:

* `alternate-exchange`;
* priority queues (`x-max-priority`) — the `priority` property is carried as a tag, but
  ordering is not honored;
* `x-max-length` / `x-max-length-bytes` / `x-overflow`;
* `x-queue-type` / `x-queue-mode`;
* single-active-consumer (`x-single-active-consumer`);
* `x-expires` (queue-level TTL);
* consumer `x-priority`.

Two more inputs are inert but **not** in the badge set:

* `x-message-ttl` (queue-level TTL) — silently ignored; only the per-message `expiration`
  property drives TTL (gotcha #1 / gotcha #7);
* `prefetch-size` on `basic.qos` — accepted but ignored (only `prefetch-count` is honored).

## The nine gotchas [#the-nine-gotchas]

These connector behaviors deviate from RabbitMQ classic. Each is a documented contract, not a
bug — most stay invisible until a corner case hits production.

| # | Gotcha                                                                                                                                                                                                                                      | Where documented                                                                                                                                     |
| - | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1 | **TTL never dead-letters** — expired messages are eager-dropped even with a DLX                                                                                                                                                             | [Reliability](/connectors/rabbitmq/how-to/reliability), [Migrating from RabbitMQ](/connectors/rabbitmq/reference/migration-from-rabbitmq)            |
| 2 | **DLX rejected-trigger only** — only `reject/nack(requeue=false)` triggers DLX                                                                                                                                                              | [Reliability](/connectors/rabbitmq/how-to/reliability)                                                                                               |
| 3 | **Publisher confirms have no rollback** — already-delivered queues stay; retry duplicates                                                                                                                                                   | [Reliability](/connectors/rabbitmq/how-to/reliability)                                                                                               |
| 4 | **`basic.get` \~1s latency floor** — polling is slow; prefer `basic.consume`                                                                                                                                                                | [Queues & Consumers](/connectors/rabbitmq/how-to/queues-and-consumers)                                                                               |
| 5 | **Requeue at tail, not head** — fairness differs from RabbitMQ classic                                                                                                                                                                      | [Queues & Consumers](/connectors/rabbitmq/how-to/queues-and-consumers)                                                                               |
| 6 | **Exclusive queues + direct reply-to are node-local** — need LB session affinity                                                                                                                                                            | [RPC pattern](/connectors/rabbitmq/how-to/rpc), [Migrating from RabbitMQ](/connectors/rabbitmq/reference/migration-from-rabbitmq)                    |
| 7 | **Inert queue arguments** — priority / max-length / queue-type / etc. accepted but never apply                                                                                                                                              | this page, [Exchanges & Routing](/connectors/rabbitmq/concepts/exchanges-and-routing)                                                                |
| 8 | **Reserved `"default"` vhost + name charset** — `;:*>` / whitespace / trailing-`.` rejected                                                                                                                                                 | [Channel Mapping](/connectors/rabbitmq/reference/channel-mapping), [Migrating from RabbitMQ](/connectors/rabbitmq/reference/migration-from-rabbitmq) |
| 9 | **Publish-then-close loses unconfirmed messages** — a fire-and-forget `basic.publish` then an immediate channel/connection close silently drops still-buffered publishes (≤ 64), with no client error; use a confirm channel before closing | [Reliability](/connectors/rabbitmq/how-to/reliability), [Migrating from RabbitMQ](/connectors/rabbitmq/reference/migration-from-rabbitmq)            |

## Related [#related]

<Cards>
  <Card title="Channel Mapping" href="/connectors/rabbitmq/reference/channel-mapping" description="How every AMQP queue maps to amqp.{vhost}.{queue}, the name charset, and property/header mapping." />

  <Card title="Error & Reason Codes" href="/connectors/rabbitmq/reference/error-codes" description="The 311–541 close-code table and the triggers behind each rejection above." />

  <Card title="Connections & Observability" href="/connectors/rabbitmq/reference/connections-endpoint" description="The dashboard endpoints, metrics, and inert-argument badges that surface these caps." />

  <Card title="Migrating from RabbitMQ" href="/connectors/rabbitmq/reference/migration-from-rabbitmq" description="The thirteen deviations from RabbitMQ classic and the connection-string swap." />
</Cards>
