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:
      • NOT_DELIVERED 310
    • Added:
      • NO_ROUTE 312 (missing from spec???)
      • NO_CONSUMERS 313
  • 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
  • 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:

    Method Type/Name
    (many methods) short Ticket deprecated
    Connection.Open shortstr Capabilities deprecated
    Connection.Open bit Insist deprecated
    Connection.OpenOk shortstr KnownHosts deprecated
    Channel.Open shortstr OutOfBand deprecated
    Channel.OpenOk longstr - added, then deprecated
    Exchange.Declare bit AutoDelete deprecated
    Exchange.Declare bit Internal deprecated
    Basic.GetEmpty shortstr ClusterId deprecated
    Basic.Consume table Filter added
    File.Consume table Filter added
    Stream.Consume table Filter added
  • 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.