KubeMQ
ConnectorsAMQP 1.0Reference

Capabilities

What the KubeMQ AMQP 1.0 connector advertises, supports, and rejects — the no-capabilities rule, supported features, deterministic rejections, and forced caps.

This reference defines exactly what the embedded KubeMQ AMQP 1.0 connector supports, what it rejects, and — critically — what it does not advertise. Use it to decide which client features are safe to rely on and which ones will be refused at attach, transfer, or connection time.

The connector advertises no capabilities

The connector advertises no offered or desired connection capabilities and no offered or desired link/terminus capabilities. There is no ANONYMOUS-RELAY, no queue/topic node capability, no DELAYED_DELIVERY, no SHARED-SUBS, no sole-connection-for-container — nothing. Clients must not depend on AMQP capability negotiation with this connector.

The connector's reply OPEN performative sets only four fieldsContainerID, MaxFrameSize, ChannelMax, and IdleTimeout:

serverOpen := &frames.PerformOpen{
    ContainerID:  "KubeMQ",
    MaxFrameSize: c.maxFrameSize,
    ChannelMax:   c.channelMax,
    IdleTimeout:  advertisedIdle,
}

OfferedCapabilities and DesiredCapabilities are never set on the OPEN reply, and the attach-reply path likewise sets no terminus capabilities. The connector reads a peer's terminus capabilities only to honor a bare-address queue/topic hint — it never echoes or offers capabilities back.

What this means in practice

  • Anonymous senders work, but not via ANONYMOUS-RELAY. A client gets anonymous routing by attaching a sender link with a null target address; the connector then routes each transfer by its properties.to. It is null-target-driven, not capability-driven.
  • This is the root cause of the Java / Qpid JMS anonymous-terminus limitation. Qpid JMS decides whether to use a single anonymous producer link by checking the peer's offered ANONYMOUS-RELAY capability. Because the connector offers none, Qpid JMS falls back to per-destination sender links and exposes no API to force the raw null-target ATTACH the connector routes on. Native clients (Azure/go-amqp, AMQPNetLite, qpid-proton, fe2o3-amqp, rhea) can open a null-target sender directly and use anonymous routing. See Address Mapping.
  • Do not branch your client logic on a negotiated capability — there will be none. Drive behavior from the address (<pattern>/<channel>) and link-properties instead.

Supported features

FeatureSupportNotes
Message body Data (binary)Yesthe primary body section
Message body AmqpValueYesstring / map / list / scalar values
Empty bodyYesaccepted
Settlement accepted / released / modified / rejectedYesmapped to KubeMQ Ack/NAck; released/modified requeue and increment receive-count
Sender settle-mode unsettled (at-least-once)Yesthe default; the queues durability path
Sender settle-mode settled (pre-settled, at-most-once)Yespaired with rcv-settle-mode=first
Receiver settle-mode firstYesthe only supported receiver settle mode
Link credit + drain (FLOW)Yesmanual or windowed credit; drain to exhaust-then-stop
Multi-frame transfers (fragmentation/reassembly)YesMore:true…More:false; bit-exact reassembly up to the 100 MiB cap
Dynamic nodes (dynamic=true, null address)Yesminted _amqp10.tmp.<connID>.<uuid>; node-local, no TTL/persistence
Anonymous terminus (null target, route by to)Yesper-message Write authz; not ANONYMOUS-RELAY
JMS/SQL-92 selector on events/ & events-store/ consume linksYesapache.org:selector-filter:string (3-valued logic)
Consumer groups (x-opt-kubemq-group)Yeslink property on the consume link
Durable subscriptions (events-store, expiry never)Yesdurable identity = stable container-id + link name; node-local
Start positions (x-opt-kubemq-start)Yesfirst / new-only / last / sequence:<n> / time:<RFC3339|unix-secs> / time-delta:<secs>
Native RPC (commands / queries)Yesdynamic reply node + reply-to + correlation-id; no gRPC, no KubeMQ SDK
SASL ANONYMOUS / PLAIN (JWT) / EXTERNAL (mTLS)Yessee Authentication
TLS / mTLS on amqps://:5671Yessee TLS & mTLS

Rejected / unsupported features

These are non-goals — they are refused deterministically, not silently ignored. Each maps to a wire condition from the error conditions.

FeatureBehaviorCondition / mechanism
rcv-settle-mode=secondDETACH at attachamqp:not-implemented
Selector on a queues/ linkDETACH at attachamqp:not-implemented (queues are move-only)
copy distribution-mode on queues/DETACH at attachamqp:invalid-field
AmqpSequence body sectionrejectederrAMQPSequenceUnsupported
AMQP transactions (txn coordinator)not implementedno coordinator node in the connector
Exactly-once deliverynot providedat-least-once (queues) or at-most-once (events) only
Link resumption / delivery-state recovery on re-attachnot supportedre-attach is a fresh link
Message peek / browse / FIFO ordering guaranteenot providedcompeting-consumer move semantics only
Dead-letter exchange (DLX)nonethe broker's MaxReceiveQueue caps backlog; no DLX
Second live attach of the same durable identityDETACHamqp:not-allowed (durable subscription in use)
Receiver attach on responses/<id>DETACHamqp:not-allowed
AMQP-over-WebSocketnot supportedraw TCP / TLS only
vhost / virtual hostnoneOPEN hostname accepted but ignored; flat address space
Config hot-reloadnot supportedconnector config is read at start
Capability negotiation (offered/desired)none advertiseddrive behavior from address + link-props

The AmqpSequence body section is rejected. Send Data (binary / BytesMessage) or AmqpValue (text / object) instead — an AmqpSequence body fails translation. This is one of two Qpid-JMS-relevant limitations, alongside the anonymous-terminus restriction in Address Mapping.

Inert / accepted-but-ignored

These are accepted on the wire without error but carry no connector semantics (documented so you do not expect behavior that is not there):

  • Message priority — accepted, not honored for ordering.
  • group-id / group-sequence — accepted, not used for grouping/ordering.
  • footer section — accepted, passed through where applicable, not interpreted.
  • OPEN hostname — accepted, ignored (no vhost).
  • Idle-timeout from the client — honored by the connector emitting empty frames at half the client's advertised interval, but it is not a feature you negotiate via capabilities.

Limits & forced caps

LimitValueEnforcement / condition
Max channel length255 bytescharset validation → amqp:not-found
Max multi-frame message size100 MiBoversize → amqp:link:message-size-exceeded
Receiver settle modesfirst onlysecondamqp:not-implemented
Connection / session / link capsfrom configover-cap → amqp:resource-limit-exceeded
Durable identity components40 chars each + FNV suffixsanitized to a stable durable id

See Configuration for the CONNECTORS_AMQP10_* knobs behind these caps, and Connections & Observability for the metrics that count limit breaches.

Was this page helpful?

On this page