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
than major=8,minor=0.
-
Frame types 4-7 (OOB and trace frames) have been removed, as they
were not well specified in AMQP 0-8.
- Status code changes:
- Removed:
- Added:
- 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
been removed.
-
The (AMQP-specific) "PLAIN" security mechanism is no longer
mentioned.
-
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
negotiated close.
-
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
negotiated close.
-
The extensibility of the exchange-type mechanism is now explicitly
documented.
-
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
clearly specified.
-
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
published message.
-
Durable queues may now bind to transient exchanges. Bindings
between a durable queue and an exchange are as durable as the bound
exchange is.
-
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
ignored.
-
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
Basic.GetOk methods.
-
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
(Tx-)transacted.
-
Class Tx has new language around atomicity and
multiple-queue-transactions.
-
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
connection.
-
It is made clear in section 1.4.1 of the main spec that strings are
case-sensitive.
-
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
Tx.Rollback.
-
Section 2.3.7 explains the changes made to the connection and
channel close protocols.
-
The "Headers" exchange type is now defined (section 3.1.3.4).
-
The use of UNEXPECTED_FRAME (code 505) is documented in section
4.2.6.
-
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:
- Connection.Redirect
- Channel.Alert
-
Some methods have been renumbered:
-
Some methods have been added:
-
Some methods have new or changed arguments:
-
Some classes have been removed:
- Access
- Dtx
- File
- Stream
- Test
- Tunnel
-
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.