This page contains a complete reference to RabbitMQ's implementaton of version 0-9-1 of the AMQP specification. The original specification was published by the AMQP WG in 2008 and is made available under the AMQP license.
Elsewhere on this site you can read details of RabbitMQ's conformance to the specification. RabbitMQ implements several extensions to the core specification that are documented in this guide. The original and extended specification downloads can be found on the protocol page.
You may also be interested in our Protocol and API Quick Reference.
Protocol Information
(back to top)- Major-minor version:
- 0-9
- Revision:
- 1
- Port:
- 5672
- Description:
- AMQ Protocol version 0-9-1
Classes
(back to top)The following classes, with their associated methods, are defined in the specification:
connection
Work with socket connections.
The connection class provides methods for a client to establish a network connection to a server, and for both peers to operate the connection thereafter.
Class Grammar:
connection = open-connection *use-connection close-connection open-connection = C:protocol-header S:START C:START-OK *challenge S:TUNE C:TUNE-OK C:OPEN S:OPEN-OK challenge = S:SECURE C:SECURE-OK use-connection = *channel close-connection = C:CLOSE S:CLOSE-OK / S:CLOSE C:CLOSE-OK
Methods
start(
Start connection negotiation.
This method starts the connection negotiation process by telling the client the protocol version that the server proposes, along with a list of security mechanisms which the client can use for authentication.
If the server cannot support the protocol specified in the protocol header, it MUST respond with a valid protocol header and then close the socket connection.
The server MUST provide a protocol version that is lower than or equal to that requested by the client in the protocol header.
If the client cannot handle the protocol version suggested by the server it MUST close the socket connection without sending any further data.
Parameters:
octet version-major
The major version number can take any value from 0 to 99 as defined in the AMQP specification.
octet version-minor
The minor version number can take any value from 0 to 99 as defined in the AMQP specification.
peer-properties server-properties
Server properties.
The properties SHOULD contain at least these fields: "host", specifying the server host name or address, "product", giving the name of the server product, "version", giving the name of the server version, "platform", giving the name of the operating system, "copyright", if appropriate, and "information", giving other general information.
longstr mechanisms
A list of the security mechanisms that the server supports, delimited by spaces.
longstr locales
A list of the message locales that the server supports, delimited by spaces. The locale defines the language in which the server will send reply texts.
The server MUST support at least the en_US locale.
start-ok(
Select security mechanism and locale.
This method selects a SASL security mechanism.
Parameters:
peer-properties client-properties
Client properties.
The properties SHOULD contain at least these fields: "product", giving the name of the client product, "version", giving the name of the client version, "platform", giving the name of the operating system, "copyright", if appropriate, and "information", giving other general information.
shortstr mechanism
A single security mechanisms selected by the client, which must be one of those specified by the server.
The client SHOULD authenticate using the highest-level security profile it can handle from the list provided by the server.
If the mechanism field does not contain one of the security mechanisms proposed by the server in the Start method, the server MUST close the connection without sending any further data.
longstr response
A block of opaque data passed to the security mechanism. The contents of this data are defined by the SASL security mechanism.
shortstr locale
A single message locale selected by the client, which must be one of those specified by the server.
(back to top)secure(
Security mechanism challenge.
The SASL protocol works by exchanging challenges and responses until both peers have received sufficient information to authenticate each other. This method challenges the client to provide more information.
Parameters:
longstr challenge
Challenge information, a block of opaque binary data passed to the security mechanism.
(back to top)secure-ok(
Security mechanism response.
This method attempts to authenticate, passing a block of SASL data for the security mechanism at the server side.
Parameters:
longstr response
A block of opaque data passed to the security mechanism. The contents of this data are defined by the SASL security mechanism.
(back to top)tune(
Propose connection tuning parameters.
This method proposes a set of connection configuration values to the client. The client can accept and/or adjust these.
Parameters:
short channel-max
Specifies highest channel number that the server permits. Usable channel numbers are in the range 1..channel-max. Zero indicates no specified limit.
long frame-max
The largest frame size that the server proposes for the connection, including frame header and end-byte. The client can negotiate a lower value. Zero means that the server does not impose any specific limit but may reject very large frames if it cannot allocate resources for them.
Until the frame-max has been negotiated, both peers MUST accept frames of up to frame-min-size octets large, and the minimum negotiated value for frame-max is also frame-min-size.
short heartbeat
The delay, in seconds, of the connection heartbeat that the server wants. Zero means the server does not want a heartbeat.
(back to top)tune-ok(
Negotiate connection tuning parameters.
This method sends the client's connection tuning parameters to the server. Certain fields are negotiated, others provide capability information.
Parameters:
short channel-max
The maximum total number of channels that the client will use per connection.
If the client specifies a channel max that is higher than the value provided by the server, the server MUST close the connection without attempting a negotiated close. The server may report the error in some fashion to assist implementors.
long frame-max
The largest frame size that the client and server will use for the connection. Zero means that the client does not impose any specific limit but may reject very large frames if it cannot allocate resources for them. Note that the frame-max limit applies principally to content frames, where large contents can be broken into frames of arbitrary size.
Until the frame-max has been negotiated, both peers MUST accept frames of up to frame-min-size octets large, and the minimum negotiated value for frame-max is also frame-min-size.
If the client specifies a frame max that is higher than the value provided by the server, the server MUST close the connection without attempting a negotiated close. The server may report the error in some fashion to assist implementors.
short heartbeat
The delay, in seconds, of the connection heartbeat that the client wants. Zero means the client does not want a heartbeat.
(back to top)open(
Open connection to virtual host.
This method opens a connection to a virtual host, which is a collection of resources, and acts to separate multiple application domains within a server. The server may apply arbitrary limits per virtual host, such as the number of each type of entity that may be used, per connection and/or in total.
Parameters:
path virtual-host
The name of the virtual host to work with.
If the server supports multiple virtual hosts, it MUST enforce a full separation of exchanges, queues, and all associated entities per virtual host. An application, connected to a specific virtual host, MUST NOT be able to access resources of another virtual host.
The server SHOULD verify that the client has permission to access the specified virtual host.
shortstr reserved-1
bit reserved-2
(back to top)open-ok(
Signal that connection is ready.
This method signals to the client that the connection is ready for use.
Parameters:
shortstr reserved-1
(back to top)close(
Request a connection close.
This method indicates that the sender wants to close the connection. This may be due to internal conditions (e.g. a forced shut-down) or due to an error handling a specific method, i.e. an exception. When a close is due to an exception, the sender provides the class and method id of the method which caused the exception.
After sending this method, any received methods except Close and Close-OK MUST be discarded. The response to receiving a Close after sending Close must be to send Close-Ok.
Parameters:
reply-code reply-code
reply-text reply-text
class-id class-id
When the close is provoked by a method exception, this is the class of the method.
method-id method-id
When the close is provoked by a method exception, this is the ID of the method.
(back to top)close-ok()
Confirm a connection close.
This method confirms a Connection.Close method and tells the recipient that it is safe to release resources for the connection and close the socket.
A peer that detects a socket closure without having received a Close-Ok handshake method SHOULD log the error.
blocked(
Indicate that connection is blocked.
This method indicates that a connection has been blocked and does not accept new publishes.
Parameters:
shortstr reason
The reason the connection was blocked.
(back to top)unblocked()
Indicate that connection is unblocked.
This method indicates that a connection has been unblocked and now accepts publishes.
(back to top)update-secret(
Update secret.
This method updates the secret used to authenticate this connection. It is used when secrets have an expiration date and need to be renewed, like OAuth 2 tokens.
Parameters:
longstr new-secret
The new secret.
shortstr reason
The reason for the secret update.
(back to top)update-secret-ok()
Update secret response.
This method confirms the updated secret is valid.
(back to top)channel
Work with channels.
The channel class provides methods for a client to establish a channel to a server and for both peers to operate the channel thereafter.
Class Grammar:
channel = open-channel *use-channel close-channel open-channel = C:OPEN S:OPEN-OK use-channel = C:FLOW S:FLOW-OK / S:FLOW C:FLOW-OK / functional-class close-channel = C:CLOSE S:CLOSE-OK / S:CLOSE C:CLOSE-OK
Methods
open(
Open a channel for use.
This method opens a channel to the server.
The client MUST NOT use this method on an already-opened channel.
Error code: channel-error
Parameters:
shortstr reserved-1
(back to top)open-ok(
Signal that the channel is ready.
This method signals to the client that the channel is ready for use.
Parameters:
longstr reserved-1
(back to top)flow(
Enable/disable flow from peer.
This method asks the peer to pause or restart the flow of content data sent by a consumer. This is a simple flow-control mechanism that a peer can use to avoid overflowing its queues or otherwise finding itself receiving more messages than it can process. Note that this method is not intended for window control. It does not affect contents returned by Basic.Get-Ok methods.
When a new channel is opened, it is active (flow is active). Some applications assume that channels are inactive until started. To emulate this behaviour a client MAY open the channel, then pause it.
When sending content frames, a peer SHOULD monitor the channel for incoming methods and respond to a Channel.Flow as rapidly as possible.
A peer MAY use the Channel.Flow method to throttle incoming content data for internal reasons, for example, when exchanging data over a slower connection.
The peer that requests a Channel.Flow method MAY disconnect and/or ban a peer that does not respect the request. This is to prevent badly-behaved clients from overwhelming a server.
Parameters:
bit active
If 1, the peer starts sending content frames. If 0, the peer stops sending content frames.
(back to top)flow-ok(
Confirm a flow method.
Confirms to the peer that a flow command was received and processed.
Parameters:
bit active
Confirms the setting of the processed flow method: 1 means the peer will start sending or continue to send content frames; 0 means it will not.
(back to top)close(
Request a channel close.
This method indicates that the sender wants to close the channel. This may be due to internal conditions (e.g. a forced shut-down) or due to an error handling a specific method, i.e. an exception. When a close is due to an exception, the sender provides the class and method id of the method which caused the exception.
After sending this method, any received methods except Close and Close-OK MUST be discarded. The response to receiving a Close after sending Close must be to send Close-Ok.
Parameters:
reply-code reply-code
reply-text reply-text
class-id class-id
When the close is provoked by a method exception, this is the class of the method.
method-id method-id
When the close is provoked by a method exception, this is the ID of the method.
(back to top)close-ok()
Confirm a channel close.
This method confirms a Channel.Close method and tells the recipient that it is safe to release resources for the channel.
A peer that detects a socket closure without having received a Channel.Close-Ok handshake method SHOULD log the error.
exchange
Work with exchanges.
Exchanges match and distribute messages across queues. Exchanges can be configured in the server or declared at runtime.
Class Grammar:
exchange = C:DECLARE S:DECLARE-OK / C:DELETE S:DELETE-OK / C:BIND S:BIND-OK / C:UNBIND S:UNBIND-OK
The server MUST implement these standard exchange types: fanout, direct.
The server SHOULD implement these standard exchange types: topic, headers.
The server MUST, in each virtual host, pre-declare an exchange instance for each standard exchange type that it implements, where the name of the exchange instance, if defined, is "amq." followed by the exchange type name. The server MUST, in each virtual host, pre-declare at least two direct exchange instances: one named "amq.direct", the other with no public name that serves as a default exchange for Publish methods.
The server MUST pre-declare a direct exchange with no public name to act as the default exchange for content Publish methods and for default queue bindings.
The server MUST NOT allow clients to access the default exchange except by specifying an empty exchange name in the Queue.Bind and content Publish methods.
The server MAY implement other exchange types as wanted.
Methods
declare(
Verify exchange exists, create if needed.
This method creates an exchange if it does not already exist, and if the exchange exists, verifies that it is of the correct and expected class.
The server SHOULD support a minimum of 16 exchanges per virtual host and ideally, impose no limit except as defined by available resources.
Parameters:
short reserved-1
exchange-name exchange
Exchange names starting with "amq." are reserved for pre-declared and standardised exchanges. The client MAY declare an exchange starting with "amq." if the passive option is set, or the exchange already exists.
Error code: access-refusedThe exchange name consists of a non-empty sequence of these characters: letters, digits, hyphen, underscore, period, or colon.
Error code: precondition-failed
shortstr type
Each exchange belongs to one of a set of exchange types implemented by the server. The exchange types define the functionality of the exchange - i.e. how messages are routed through it. It is not valid or meaningful to attempt to change the type of an existing exchange.
Exchanges cannot be redeclared with different types. The client MUST not attempt to redeclare an existing exchange with a different type than used in the original Exchange.Declare method.
Error code: not-allowedThe client MUST NOT attempt to declare an exchange with a type that the server does not support.
Error code: command-invalid
bit passive
If set, the server will reply with Declare-Ok if the exchange already exists with the same name, and raise an error if not. The client can use this to check whether an exchange exists without modifying the server state. When set, all other method fields except name and no-wait are ignored. A declare with both passive and no-wait has no effect. Arguments are compared for semantic equivalence.
If set, and the exchange does not already exist, the server MUST raise a channel exception with reply code 404 (not found).
If not set and the exchange exists, the server MUST check that the existing exchange has the same values for type, durable, and arguments fields. The server MUST respond with Declare-Ok if the requested exchange matches these fields, and MUST raise a channel exception if not.
bit durable
If set when creating a new exchange, the exchange will be marked as durable. Durable exchanges remain active when a server restarts. Non-durable exchanges (transient exchanges) are purged if/when a server restarts.
The server MUST support both durable and transient exchanges.
bit auto-delete
If set, the exchange is deleted when all queues have finished using it.
The server SHOULD allow for a reasonable delay between the point when it determines that an exchange is not being used (or no longer used), and the point when it deletes the exchange. At the least it must allow a client to create an exchange and then bind a queue to it, with a small but non-zero delay between these two actions.
The server MUST ignore the auto-delete field if the exchange already exists.
bit internal
If set, the exchange may not be used directly by publishers, but only when bound to other exchanges. Internal exchanges are used to construct wiring that is not visible to applications.
no-wait no-wait
table arguments
A set of arguments for the declaration. The syntax and semantics of these arguments depends on the server implementation.
(back to top)declare-ok()
Confirm exchange declaration.
This method confirms a Declare method and confirms the name of the exchange, essential for automatically-named exchanges.
(back to top)delete(
Delete an exchange.
This method deletes an exchange. When an exchange is deleted all queue bindings on the exchange are cancelled.
Parameters:
short reserved-1
exchange-name exchange
The client MUST NOT attempt to delete an exchange that does not exist.
Error code: not-found
bit if-unused
If set, the server will only delete the exchange if it has no queue bindings. If the exchange has queue bindings the server does not delete it but raises a channel exception instead.
The server MUST NOT delete an exchange that has bindings on it, if the if-unused field is true.
Error code: precondition-failed
no-wait no-wait
(back to top)delete-ok()
Confirm deletion of an exchange.
This method confirms the deletion of an exchange.
(back to top)bind(
Bind exchange to an exchange.
This method binds an exchange to an exchange.
A server MUST allow and ignore duplicate bindings - that is, two or more bind methods for a specific exchanges, with identical arguments - without treating these as an error.
A server MUST allow cycles of exchange bindings to be created including allowing an exchange to be bound to itself.
A server MUST not deliver the same message more than once to a destination exchange, even if the topology of exchanges and bindings results in multiple (even infinite) routes to that exchange.
Parameters:
short reserved-1
exchange-name destination
Specifies the name of the destination exchange to bind.
A client MUST NOT be allowed to bind a non-existent destination exchange.
Error code: not-foundThe server MUST accept a blank exchange name to mean the default exchange.
exchange-name source
Specifies the name of the source exchange to bind.
A client MUST NOT be allowed to bind a non-existent source exchange.
Error code: not-foundThe server MUST accept a blank exchange name to mean the default exchange.
shortstr routing-key
Specifies the routing key for the binding. The routing key is used for routing messages depending on the exchange configuration. Not all exchanges use a routing key - refer to the specific exchange documentation.
no-wait no-wait
table arguments
A set of arguments for the binding. The syntax and semantics of these arguments depends on the exchange class.
(back to top)bind-ok()
Confirm bind successful.
This method confirms that the bind was successful.
(back to top)unbind(
Unbind an exchange from an exchange.
This method unbinds an exchange from an exchange.
If a unbind fails, the server MUST raise a connection exception.
Parameters:
short reserved-1
exchange-name destination
Specifies the name of the destination exchange to unbind.
The client MUST NOT attempt to unbind an exchange that does not exist from an exchange.
Error code: not-foundThe server MUST accept a blank exchange name to mean the default exchange.
exchange-name source
Specifies the name of the source exchange to unbind.
The client MUST NOT attempt to unbind an exchange from an exchange that does not exist.
Error code: not-foundThe server MUST accept a blank exchange name to mean the default exchange.
shortstr routing-key
Specifies the routing key of the binding to unbind.
no-wait no-wait
table arguments
Specifies the arguments of the binding to unbind.
(back to top)unbind-ok()
Confirm unbind successful.
This method confirms that the unbind was successful.
(back to top)queue
Work with queues.
Queues store and forward messages. Queues can be configured in the server or created at runtime. Queues must be attached to at least one exchange in order to receive messages from publishers.
Class Grammar:
queue = C:DECLARE S:DECLARE-OK / C:BIND S:BIND-OK / C:UNBIND S:UNBIND-OK / C:PURGE S:PURGE-OK / C:DELETE S:DELETE-OK
Methods
declare(
Declare queue, create if needed.
This method creates or checks a queue. When creating a new queue the client can specify various properties that control the durability of the queue and its contents, and the level of sharing for the queue.
The server MUST create a default binding for a newly-declared queue to the default exchange, which is an exchange of type 'direct' and use the queue name as the routing key.
The server SHOULD support a minimum of 256 queues per virtual host and ideally, impose no limit except as defined by available resources.
Parameters:
short reserved-1
queue-name queue
The queue name MAY be empty, in which case the server MUST create a new queue with a unique generated name and return this to the client in the Declare-Ok method.
Queue names starting with "amq." are reserved for pre-declared and standardised queues. The client MAY declare a queue starting with "amq." if the passive option is set, or the queue already exists.
Error code: access-refusedThe queue name can be empty, or a sequence of these characters: letters, digits, hyphen, underscore, period, or colon.
Error code: precondition-failed
bit passive
If set, the server will reply with Declare-Ok if the queue already exists with the same name, and raise an error if not. The client can use this to check whether a queue exists without modifying the server state. When set, all other method fields except name and no-wait are ignored. A declare with both passive and no-wait has no effect. Arguments are compared for semantic equivalence.
The client MAY ask the server to assert that a queue exists without creating the queue if not. If the queue does not exist, the server treats this as a failure.
Error code: not-foundIf not set and the queue exists, the server MUST check that the existing queue has the same values for durable, exclusive, auto-delete, and arguments fields. The server MUST respond with Declare-Ok if the requested queue matches these fields, and MUST raise a channel exception if not.
bit durable
If set when creating a new queue, the queue will be marked as durable. Durable queues remain active when a server restarts. Non-durable queues (transient queues) are purged if/when a server restarts. Note that durable queues do not necessarily hold persistent messages, although it does not make sense to send persistent messages to a transient queue.
The server MUST recreate the durable queue after a restart.
The server MUST support both durable and transient queues.
bit exclusive
Exclusive queues may only be accessed by the current connection, and are deleted when that connection closes. Passive declaration of an exclusive queue by other connections are not allowed.
The server MUST support both exclusive (private) and non-exclusive (shared) queues.
The client MAY NOT attempt to use a queue that was declared as exclusive by another still-open connection.
Error code: resource-locked
bit auto-delete
If set, the queue is deleted when all consumers have finished using it. The last consumer can be cancelled either explicitly or because its channel is closed. If there was no consumer ever on the queue, it won't be deleted. Applications can explicitly delete auto-delete queues using the Delete method as normal.
The server MUST ignore the auto-delete field if the queue already exists.
no-wait no-wait
table arguments
A set of arguments for the declaration. The syntax and semantics of these arguments depends on the server implementation.
(back to top)declare-ok(
Confirms a queue definition.
This method confirms a Declare method and confirms the name of the queue, essential for automatically-named queues.
Parameters:
queue-name queue
Reports the name of the queue. If the server generated a queue name, this field contains that name.
message-count message-count
long consumer-count
Reports the number of active consumers for the queue. Note that consumers can suspend activity (Channel.Flow) in which case they do not appear in this count.
(back to top)