AMQP 0-8 to 0-9-1
This is a summary of the semantic differences between AMQP 0-8 and 0-9-1.
The advertised version number is major=0,minor=9,revision=1 rather
Frame types 4-7 (OOB and trace frames) have been removed, as they
were not well specified in AMQP 0-8.
- Status code changes:
- NO_ROUTE 312 (missing from spec???)
- NO_CONSUMERS 313
- PRECONDITION_FAILED 406
- UNEXPECTED_FRAME 505
Access tickets have been removed. This involves the removal of the
Access.Request method, and the deprecation of each and every ticket
field in methods that used to require a ticket.
The restrictions on virtual-host names have been removed.
The notions of "known hosts" and of connection redirection have
The (AMQP-specific) "PLAIN" security mechanism is no longer
The meaning of "channel-max" has been clarified: for example, if
channel-max is set to 2, then it is illegal to use channels
numbered 3 or higher for frames carried by the connection.
The meaning of "frame-max" has been clarified: the maximum frame
size is to be interpreted as including the counts for the frame
header and end-byte.
A new rule (named "upper-limit") regarding channel-max has been
added: if the client asks for channel-max higher than that offered
by the server, the connection MUST be closed without attempting a
A similar rule (also named "upper-limit") applies to frame-max: if
the client asks for frame-max higher than that offered by the
server, the connection MUST be closed without attempting a
The extensibility of the exchange-type mechanism is now explicitly
The rules for equivalence of exchange instances in Exchange.Declare
have been more clearly specified, including a specification of how
the "arguments" tables are to be compared.
Auto-deletion of exchanges is no longer supported.
The AMQP 0-8 notion of "content classes" has been removed.
The rules for equivalence of queues in Queue.Declare have been more
The rules regarding deletion of "exclusive" queues have been
more tightly specified.
A single Basic.Publish is now defined to never result in multiple
copies of a message on any particular queue, even in the presence
of multiple independent bindings to the same queue that match the
Durable queues may now bind to transient exchanges. Bindings
between a durable queue and an exchange are as durable as the bound
If two or more different bindings to a single queue apply to a
given publication, only one copy of the published message is placed
on the queue. This was intended, but not specified, in 0-8.
The error code for use of an empty queue name in Queue.Bind (and
other methods that use the most-recently-declared-queue mechanism)
has been changed.
The empty string may now be specified in Queue.Bind's "exchange"
field; it signifies the default exchange (!).
Basic.Recover has changed: the old behaviour is available via a
(deprecated) method Basic.RecoverAsync, which has method ID 100
(which in 0-8 was the ID for Basic.Recover). In 0-9-1, Basic.Recover has ID 110, and now has a required response,
Basic.RecoverOk (ID 111). Also, both Basic.Recover and
Basic.RecoverAsync are permitted on (Tx-)transacted channels in
0-9-1, which was forbidden in 0-8.
Basic.Ack is now required to signal a channel error immediately
upon detecting an invalid deliveryTag, even if the channel is
(Tx-)transacted. Also, it is now explicitly forbidden to
acknowledge a particular deliveryTag more than once.
Consumer tags (in Basic.Consume etc) are defined as local to a
channel now, not local to a connection.
Message priorities have been clarified: priority 9 is the highest
priority level (meaning that messages with priority 9 will be
delivered ahead of any lower-priority messages), and priority 0 is
the lowest priority level.
If a Channel.Close is received while a peer is waiting for a
Channel.CloseOk, a Channel.CloseOk must be sent in response as
usual. Previously, in 0-8, such a Channel.Close was required to be
If a Connection.Close is received while a peer is waiting for a
Connection.CloseOk, a Connection.CloseOk must be sent in response
as usual. Previously, in 0-8, such a Connection.Close was required
to be ignored.
Channel.Flow is specified to not apply to content carried by
Exchange.Declare's Durable field is no longer ignored in cases when
the named exchange already exists at the time of the declaration.
The server now MUST NOT delete an exchange that has bindings on it
if the IfUnused field is true during an Exchange.Delete.
The XML requires an "amq.headers" exchange if the "headers"
exchange type is implemented; the PDF requires an "amq.match"
exchange if the "headers" exchange type is implemented. This is an
error and will be resolved in a future release of the 0-9 series of
specifications; the intention is for "amq.headers" to be
required. "amq.match" is a legacy name and is now deprecated.
It is now explicitly specified that Queue.Delete on an AutoDelete
queue is permitted and meaningful.
The rules on exclusive queues have changed: exclusivity now applies
to all queue operations, not just consuming from the
queue. Furthermore, passive declarations of an exclusively-held
queue on other connections are now disallowed.
Generally, passive declarations are now specified to ignore most of
the parameters given to the declaration other than the name of the
declared entity. This was not specified in 0-8.
The server now MUST NOT delete a queue that has messages in it if
the IfEmpty field is true during a Queue.Delete.
When Queue.Purge is called, sent-but-unacknowledged messages are no
longer purged, even if the channel they were sent down is not
Class Tx has new language around atomicity and
The effects of the "immediate" and "mandatory" flags on
Basic.Publish are explicitly declared to be undefined when used
within a Tx transaction in 0-9-1.
Tx.Rollback has been clarified: unacked messages will NOT be
redelivered in 0-9-1 upon rollback.
The "no-local" field is specified to prohibit delivery to the
connection that published a message in 0-9-1. In 0-8, it was not
specified whether the scope of prohibition was the channel or the
It is made clear in section 1.4.1 of the main spec that strings are
References to "chained bindings", nested message contents
("structured contents"), message selectors, weight, out-of-band
frames etc have been removed.
There is new specification around errors detected during connection
establishment (see the end of sections 2.2.4).
Section 2.2.9 reiterates the lack of requeuing and redelivering on
Section 2.3.7 explains the changes made to the connection and
channel close protocols.
The "Headers" exchange type is now defined (section 126.96.36.199).
The use of UNEXPECTED_FRAME (code 505) is documented in section
The content body size field has been clarified to mean the sum of
the body sizes of the following content body frames.
Heartbeating has been specified (section 4.2.7).
Sections 4.4 (Visibility Guarantee), 4.5 (Channel Closure), 4.6
(Content Synchronisation) and 4.7 (Content Ordering Guarantees) are
new, interesting, and important.
Some methods have been removed:
Some methods have been renumbered:
Some methods have been added:
Some methods have new or changed arguments:
Some classes have been removed:
The Basic class's content properties have been changed:
AppId - shortstr - deprecated
Note: Framing and connection establishment (modulo the removed frame-types
and the spec version number advertisement, respectively) are identical.