The bin8 type consists of exactly one octet of opaque binary data.
1 OCTET
+----------+
| bin8 |
+----------+
bin8 = OCTET
The int8 type is a signed integral value encoded using an 8-bit two's complement
representation.
1 OCTET
+----------+
| int8 |
+----------+
int8 = OCTET
The uint8 type is an 8-bit unsigned integral value.
1 OCTET
+---------+
| uint8 |
+---------+
uint8 = OCTET
The char type encodes a single character from the iso-8859-15 character set.
1 OCTET
+----------+
| char |
+----------+
char = OCTET
The boolean type is a single octet that encodes a true or false value. If the octet is zero,
then the boolean is false. Any other value represents true.
1 OCTET
+---------+
| boolean |
+---------+
boolean = OCTET
The bin16 type consists of two consecutive octets of opaque binary data.
1 OCTET 1 OCTET
+-----------+-----------+
| octet-one | octet-two |
+-----------+-----------+
bin16 = 2 OCTET
The int16 type is a signed integral value encoded using a 16-bit two's complement
representation in network byte order.
1 OCTET 1 OCTET
+-----------+----------+
| high-byte | low-byte |
+-----------+----------+
int16 = high-byte low-byte
high-byte = OCTET
low-byte = OCTET
The uint16 type is a 16-bit unsigned integral value encoded in network byte order.
1 OCTET 1 OCTET
+-----------+----------+
| high-byte | low-byte |
+-----------+----------+
uint16 = high-byte low-byte
high-byte = OCTET
low-byte = OCTET
The bin32 type consists of 4 consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-------------+------------+
| octet-one | octet-two | octet-three | octet-four |
+-----------+-----------+-------------+------------+
bin32 = 4 OCTET
The int32 type is a signed integral value encoded using a 32-bit two's complement
representation in network byte order.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+------------+----------+----------+
| byte-four | byte-three | byte-two | byte-one |
+-----------+------------+----------+----------+
MSB LSB
int32 = byte-four byte-three byte-two byte-one
byte-four = OCTET ; most significant byte (MSB)
byte-three = OCTET
byte-two = OCTET
byte-one = OCTET ; least significant byte (LSB)
The uint32 type is a 32-bit unsigned integral value encoded in network byte order.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+------------+----------+----------+
| byte-four | byte-three | byte-two | byte-one |
+-----------+------------+----------+----------+
MSB LSB
uint32 = byte-four byte-three byte-two byte-one
byte-four = OCTET ; most significant byte (MSB)
byte-three = OCTET
byte-two = OCTET
byte-one = OCTET ; least significant byte (LSB)
The float type encodes a single precision 32-bit floating point number. The format and
operations are defined by the IEEE 754 standard for 32-bit floating point numbers.
4 OCTETs
+-----------------------+
| float |
+-----------------------+
IEEE 754 32-bit float
float = 4 OCTET ; IEEE 754 32-bit floating point number
The char-utf32 type consists of a single unicode character in the UTF-32 encoding.
4 OCTETs
+------------------+
| char-utf32 |
+------------------+
UTF-32 character
char-utf32 = 4 OCTET ; single UTF-32 character
The sequence-no type encodes, in network byte order, a serial number as defined in RFC-1982.
The arithmetic, operators, and ranges for numbers of this type are defined by RFC-1982.
4 OCTETs
+------------------------+
| sequence-no |
+------------------------+
RFC-1982 serial number
sequence-no = 4 OCTET ; RFC-1982 serial number
The bin64 type consists of eight consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-----+-------------+-------------+
| octet-one | octet-two | ... | octet-seven | octet-eight |
+-----------+-----------+-----+-------------+-------------+
bin64 = 8 OCTET
The int64 type is a signed integral value encoded using a 64-bit two's complement
representation in network byte order.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+------------+------------+-----+----------+----------+
| byte-eight | byte-seven | ... | byte-two | byte-one |
+------------+------------+-----+----------+----------+
MSB LSB
int64 = byte-eight byte-seven byte-six byte-five
byte-four byte-three byte-two byte-one
byte-eight = 1 OCTET ; most significant byte (MSB)
byte-seven = 1 OCTET
byte-six = 1 OCTET
byte-five = 1 OCTET
byte-four = 1 OCTET
byte-three = 1 OCTET
byte-two = 1 OCTET
byte-one = 1 OCTET ; least significant byte (LSB)
The uint64 type is a 64-bit unsigned integral value encoded in network byte order.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+------------+------------+-----+----------+----------+
| byte-eight | byte-seven | ... | byte-two | byte-one |
+------------+------------+-----+----------+----------+
MSB LSB
uint64 = byte-eight byte-seven byte-six byte-five
byte-four byte-three byte-two byte-one
byte-eight = 1 OCTET ; most significant byte (MSB)
byte-seven = 1 OCTET
byte-six = 1 OCTET
byte-five = 1 OCTET
byte-four = 1 OCTET
byte-three = 1 OCTET
byte-two = 1 OCTET
byte-one = 1 OCTET ; least significant byte (LSB)
The double type encodes a double precision 64-bit floating point number. The format and
operations are defined by the IEEE 754 standard for 64-bit double precision floating point
numbers.
8 OCTETs
+-----------------------+
| double |
+-----------------------+
IEEE 754 64-bit float
double = 8 OCTET ; double precision IEEE 754 floating point number
The datetime type encodes a date and time using the 64 bit POSIX time_t format.
8 OCTETs
+---------------------+
| datetime |
+---------------------+
posix time_t format
datetime = 8 OCTET ; 64 bit posix time_t format
The bin128 type consists of 16 consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-----+---------------+---------------+
| octet-one | octet-two | ... | octet-fifteen | octet-sixteen |
+-----------+-----------+-----+---------------+---------------+
bin128 = 16 OCTET
The uuid type encodes a universally unique id as defined by RFC-4122. The format and
operations for this type can be found in section 4.1.2 of RFC-4122.
16 OCTETs
+---------------+
| uuid |
+---------------+
RFC-4122 UUID
uuid = 16 OCTET ; RFC-4122 section 4.1.2
The bin256 type consists of thirty two consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-----+------------------+------------------+
| octet-one | octet-two | ... | octet-thirty-one | octet-thirty-two |
+-----------+-----------+-----+------------------+------------------+
bin256 = 32 OCTET
The bin512 type consists of sixty four consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-----+-------------------+------------------+
| octet-one | octet-two | ... | octet-sixty-three | octet-sixty-four |
+-----------+-----------+-----+-------------------+------------------+
bin512 = 64 OCTET
The bin1024 type consists of one hundred and twenty eight octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-----+------------------------+------------------------+
| octet-one | octet-two | ... | octet-one-twenty-seven | octet-one-twenty-eight |
+-----------+-----------+-----+------------------------+------------------------+
bin1024 = 128 OCTET
The vbin8 type encodes up to 255 octets of opaque binary data. The number of octets is first
encoded as an 8-bit unsigned integral value. This is followed by the actual data.
1 OCTET size OCTETs
+---------+-------------+
| size | octets |
+---------+-------------+
uint8
vbin8 = size octets
size = uint8
octets = 0*255 OCTET ; size OCTETs
The str8-latin type encodes up to 255 octets of iso-8859-15 characters. The number of octets
is first encoded as an 8-bit unsigned integral value. This is followed by the actual
characters.
1 OCTET size OCTETs
+---------+------------------------+
| size | characters |
+---------+------------------------+
uint16 iso-8859-15 characters
str8-latin = size characters
size = uint8
characters = 0*255 OCTET ; size OCTETs
The str8 type encodes up to 255 octets worth of UTF-8 unicode. The number of octets of unicode
is first encoded as an 8-bit unsigned integral value. This is followed by the actual UTF-8
unicode. Note that the encoded size refers to the number of octets of unicode, not necessarily
the number of characters since the UTF-8 unicode may include multi-byte character sequences.
1 OCTET size OCTETs
+---------+--------------+
| size | utf8-unicode |
+---------+--------------+
uint8
str8 = size utf8-unicode
size = uint8
utf8-unicode = 0*255 OCTET ; size OCTETs
The str8-utf16 type encodes up to 255 octets worth of UTF-16 unicode. The number of octets of
unicode is first encoded as an 8-bit unsigned integral value. This is followed by the actual
UTF-16 unicode. Note that the encoded size refers to the number of octets of unicode, not the
number of characters since the UTF-16 unicode will include at least two octets per unicode
character.
1 OCTET size OCTETs
+---------+---------------+
| size | utf16-unicode |
+---------+---------------+
uint8
str8-utf16 = size utf16-unicode
size = uint8
utf16-unicode = 0*255 OCTET ; size OCTETs
The vbin16 type encodes up to 65535 octets of opaque binary data. The number of octets is
first encoded as a 16-bit unsigned integral value in network byte order. This is followed by
the actual data.
2 OCTETs size OCTETs
+----------+-------------+
| size | octets |
+----------+-------------+
uint16
vbin16 = size octets
size = uint16
octets = 0*65535 OCTET ; size OCTETs
The str16-latin type encodes up to 65535 octets of is-8859-15 characters. The number of octets
is first encoded as a 16-bit unsigned integral value in network byte order. This is followed
by the actual characters.
2 OCTETs size OCTETs
+----------+------------------------+
| size | characters |
+----------+------------------------+
uint16 iso-8859-15 characters
str16-latin = size characters
size = uint16
characters = 0*65535 OCTET ; size OCTETs
The str16 type encodes up to 65535 octets worth of UTF-8 unicode. The number of octets is
first encoded as a 16-bit unsigned integral value in network byte order. This is followed by
the actual UTF-8 unicode. Note that the encoded size refers to the number of octets of
unicode, not necessarily the number of unicode characters since the UTF-8 unicode may include
multi-byte character sequences.
2 OCTETs size OCTETs
+----------+--------------+
| size | utf8-unicode |
+----------+--------------+
uint16
str16 = size utf8-unicode
size = uint16
utf8-unicode = 0*65535 OCTET ; size OCTETs
The str16-utf16 type encodes up to 65535 octets worth of UTF-16 unicode. The number of octets
is first encoded as a 16-bit unsigned integral value in network byte order. This is followed
by the actual UTF-16 unicode. Note that the encoded size refers to the number of octets of
unicode, not the number of unicode characters since the UTF-16 unicode will include at least
two octets per unicode character.
2 OCTETs size OCTETs
+----------+---------------+
| size | utf16-unicode |
+----------+---------------+
uint16
str16-utf16 = size utf16-unicode
size = uint16
utf16-unicode = 0*65535 OCTET ; size OCTETs
The byte-ranges type encodes up to 65535 octets worth of non-overlapping, non-touching,
ascending byte ranges within a 64-bit sequence of bytes. Each range is represented as an
inclusive lower and upper bound that identifies all the byte offsets included within a given
range.
The number of octets of data is first encoded as a 16-bit unsigned integral value in network
byte order. This is then followed by the encoded representation of the ranges included in the
set. These MUST be encoded in ascending order, and any two ranges included in a given set MUST
NOT include overlapping or touching byte offsets.
Each range is encoded as a pair of 64-bit unsigned integral values in network byte order
respectively representing the lower and upper bounds for that range. Note that because each
range is exactly 16 octets, the size in octets of the encoded ranges will always be 16 times
the number of ranges in the set.
+----= size OCTETs =----+
| |
2 OCTETs | 16 OCTETs |
+----------+-----+-----------+-----+
| size | .../| range |\... |
+----------+---/ +-----------+ \---+
uint16 / / \ \
/ / \ \
/ 8 OCTETs 8 OCTETs \
+-----------+-----------+
| lower | upper |
+-----------+-----------+
uint64 uint64
byte-ranges = size *range
size = uint16
range = lower upper
lower = uint64
upper = uint64
The sequence-set type is a set of pairs of RFC-1982 numbers representing a discontinuous range
within an RFC-1982 sequence. Each pair represents a closed interval within the list.
Sequence-sets can be represented as lists of pairs of positive 32-bit numbers, each pair
representing a closed interval that does not overlap or touch with any other interval in the
list. For example, a set containing words 0, 1, 2, 5, 6, and 15 can be represented:
[(0, 2), (5, 6), (15, 15)]
1) The list-of-pairs representation is sorted ascending (as defined by RFC 1982
(http://www.ietf.org/rfc/rfc1982.txt) ) by the first elements of each pair.
2) The list-of-pairs is flattened into a list-of-words.
3) Each word in the list is packed into ascending locations in memory with network byte
ordering.
4) The size in bytes, represented as a 16-bit network-byte-order unsigned value, is prepended.
For instance, the example from above would be encoded:
[(0, 2), (5, 6), (15, 15)] -- already sorted.
[0, 2, 5, 6, 15, 15] -- flattened.
000000000000000200000005000000060000000F0000000F -- bytes in hex
0018000000000000000200000005000000060000000F0000000F -- bytes in hex,
length (24) prepended
+----= size OCTETs =----+
| |
2 OCTETs | 8 OCTETs |
+----------+-----+-----------+-----+
| size | .../| range |\... |
+----------+---/ +-----------+ \---+
uint16 / / \ \
/ / \ \
/ / \ \
/ / \ \
/ 4 OCTETs 4 OCTETs \
+-------------+-------------+
| lower | upper |
+-------------+-------------+
sequence-no sequence-no
sequence-set = size *range
size = uint16 ; length of variable portion in bytes
range = lower upper ; inclusive
lower = sequence-no
upper = sequence-no
The vbin32 type encodes up to 4294967295 octets of opaque binary data. The number of octets is
first encoded as a 32-bit unsigned integral value in network byte order. This is followed by
the actual data.
4 OCTETs size OCTETs
+----------+-------------+
| size | octets |
+----------+-------------+
uint32
vbin32 = size octets
size = uint32
octets = 0*4294967295 OCTET ; size OCTETs
A map is a set of distinct keys where each key has an associated (type,value) pair. The triple
of the key, type, and value, form an entry within a map. Each entry within a given map MUST
have a distinct key. A map is encoded as a size in octets, a count of the number of entries,
followed by the encoded entries themselves.
An encoded map may contain up to (4294967295 - 4) octets worth of encoded entries. The size is
encoded as a 32-bit unsigned integral value in network byte order equal to the number of
octets worth of encoded entries plus 4. (The extra 4 octets is added for the entry count.) The
size is then followed by the number of entries encoded as a 32-bit unsigned integral value in
network byte order. Finally the entries are encoded sequentially.
An entry is encoded as the key, followed by the type, and then the value. The key is always a
string encoded as a str8. The type is a single octet that may contain any valid AMQP type
code. The value is encoded according to the rules defined by the type code for that entry.
+------------= size OCTETs =-----------+
| |
4 OCTETs | 4 OCTETs |
+----------+----------+-----+---------------+-----+
| size | count | .../| entry |\... |
+----------+----------+---/ +---------------+ \---+
uint32 uint32 / / \ \
/ / \ \
/ / \ \
/ / \ \
/ / \ \
/ k OCTETs 1 OCTET n OCTETs \
+-----------+---------+-----------+
| key | type | value |
+-----------+---------+-----------+
str8 *type*
map = size count *entry
size = uint32 ; size of count and entries in octets
count = uint32 ; number of entries in the map
entry = key type value
key = str8
type = OCTET ; type code of the value
value = *OCTET ; the encoded value
A list is an ordered sequence of (type, value) pairs. The (type, value) pair forms an item
within the list. The list may contain items of many distinct types. A list is encoded as a
size in octets, followed by a count of the number of items, followed by the items themselves
encoded in their defined order.
An encoded list may contain up to (4294967295 - 4) octets worth of encoded items. The size is
encoded as a 32-bit unsigned integral value in network byte order equal to the number of
octets worth of encoded items plus 4. (The extra 4 octets is added for the item count.) The
size is then followed by the number of items encoded as a 32-bit unsigned integral value in
network byte order. Finally the items are encoded sequentially in their defined order.
An item is encoded as the type followed by the value. The type is a single octet that may
contain any valid AMQP type code. The value is encoded according to the rules defined by the
type code for that item.
+---------= size OCTETs =---------+
| |
4 OCTETs | 4 OCTETs |
+----------+----------+-----+----------+-----+
| size | count | .../| item |\... |
+----------+----------+---/ +----------+ \---+
uint32 uint32 / / \ \
/ / \ \
/ 1 OCTET n OCTETs \
+----------+-----------+
| type | value |
+----------+-----------+
*type*
list = size count *item
size = uint32 ; size of count and items in octets
count = uint32 ; number of items in the list
item = type value
type = OCTET ; type code of the value
value = *OCTET ; the encoded value
An array is an ordered sequence of values of the same type. The array is encoded in as a size
in octets, followed by a type code, then a count of the number values in the array, and
finally the values encoded in their defined order.
An encoded array may contain up to (4294967295 - 5) octets worth of encoded values. The size
is encoded as a 32-bit unsigned integral value in network byte order equal to the number of
octets worth of encoded values plus 5. (The extra 5 octets consist of 4 octets for the count
of the number of values, and one octet to hold the type code for the items in the array.) The
size is then followed by a single octet that may contain any valid AMQP type code. The type
code is then followed by the number of values encoded as a 32-bit unsigned integral value in
network byte order. Finally the values are encoded sequentially in their defined order
according to the rules defined by the type code for the array.
4 OCTETs 1 OCTET 4 OCTETs (size - 5) OCTETs
+----------+---------+----------+-------------------------+
| size | type | count | values |
+----------+---------+----------+-------------------------+
uint32 uint32 *count* encoded *types*
array = size type count values
size = uint32 ; size of type, count, and values in octets
type = OCTET ; the type of the encoded values
count = uint32 ; number of items in the array
values = 0*4294967290 OCTET ; (size - 5) OCTETs
The struct32 type describes any coded struct with a 32-bit (4 octet) size. The type is
restricted to be only coded structs with a 32-bit size, consequently the first six octets of
any encoded value for this type MUST always contain the size, class-code, and struct-code in
that order.
The size is encoded as a 32-bit unsigned integral value in network byte order that is equal to
the size of the encoded field-data, packing-flags, class-code, and struct-code. The class-code
is a single octet that may be set to any valid class code. The struct-code is a single octet
that may be set to any valid struct code within the given class-code.
The first six octets are then followed by the packing flags and encoded field data. The
presence and quantity of packing-flags, as well as the specific fields are determined by the
struct definition identified with the encoded class-code and struct-code.
4 OCTETs 1 OCTET 1 OCTET pack-width OCTETs n OCTETs
+----------+------------+-------------+-------------------+------------+
| size | class-code | struct-code | packing-flags | field-data |
+----------+------------+-------------+-------------------+------------+
uint32
n = (size - 2 - pack-width)
struct32 = size class-code struct-code packing-flags field-data
size = uint32
class-code = OCTET ; zero for top-level structs
struct-code = OCTET ; together with class-code identifies the struct
; definition which determines the pack-width and
; fields
packing-flags = 0*4 OCTET ; pack-width OCTETs
field-data = *OCTET ; (size - 2 - pack-width) OCTETs
The bin40 type consists of five consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-------------+------------+------------+
| octet-one | octet-two | octet-three | octet-four | octet-five |
+-----------+-----------+-------------+------------+------------+
bin40 = 5 OCTET
The dec32 type is decimal value with a variable number of digits following the decimal point.
It is encoded as an 8-bit unsigned integral value representing the number of decimal places.
This is followed by the signed integral value encoded using a 32-bit two's complement
representation in network byte order.
The former value is referred to as the exponent of the divisor. The latter value is the
mantissa. The decimal value is given by: mantissa / 10^exponent.
1 OCTET 4 OCTETs
+----------+----------+
| exponent | mantissa |
+----------+----------+
uint8 int32
dec32 = exponent mantissa
exponent = uint8
mantissa = int32
The bin72 type consists of nine consecutive octets of opaque binary data.
1 OCTET 1 OCTET 1 OCTET 1 OCTET
+-----------+-----------+-----+-------------+------------+
| octet-one | octet-two | ... | octet-eight | octet-nine |
+-----------+-----------+-----+-------------+------------+
bin64 = 9 OCTET
The dec64 type is decimal value with a variable number of digits following the decimal point.
It is encoded as an 8-bit unsigned integral value representing the number of decimal places.
This is followed by the signed integral value encoded using a 64-bit two's complement
representation in network byte order.
The former value is referred to as the exponent of the divisor. The latter value is the
mantissa. The decimal value is given by: mantissa / 10^exponent.
1 OCTET 8 OCTETs
+----------+----------+
| exponent | mantissa |
+----------+----------+
uint8 int64
dec64 = exponent mantissa
exponent = uint8
mantissa = int64
The void type is used within tagged data structures such as maps and lists to indicate an
empty value. The void type has no value and is encoded as an empty sequence of octets.
The bit type is used to indicate that a packing flag within a packed struct is being used to
represent a boolean value based on the presence of an empty value. The bit type has no value
and is encoded as an empty sequence of octets.
During the initial connection negotiation, the two peers must agree upon a maximum frame size.
This constant defines the minimum value to which the maximum frame size can be set. By
defining this value, the peers can guarantee that they can send frames of up to this size
until they have agreed a definitive maximum frame size for that connection.
Segments are defined in .
The segment domain defines the valid values that may be used for the segment indicator within
the frame header.
The frame type indicator for Control segments (see ).
The frame type indicator for Command segments (see ).
The frame type indicator for Header segments (see ).
The frame type indicator for Body segments (see ).
Tracks are defined in . The
track domain defines the valid values that may used for the track indicator within the frame
header
The track used for all controls. All controls defined in this specification MUST be sent
on track 0.
The track used for all commands. All commands defined in this specification MUST be sent
on track 1.
An array of values of type str16.
The connection class provides controls for a client to establish a network connection to a
server, and for both peers to operate the connection thereafter.
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 | S:REDIRECT
challenge = S:SECURE C:SECURE-OK
use-connection = *channel
close-connection = C:CLOSE S:CLOSE-OK
/ S:CLOSE C:CLOSE-OK
The connection closed normally.
An operator intervened to close the connection for some reason. The client may retry at
some later date.
The client tried to work with an unknown virtual host.
A valid frame header cannot be formed from the incoming byte stream.
The amqp-url domain defines a format for identifying an AMQP Server. It is used to provide
alternate hosts in the case where a client has to reconnect because of failure, or because
the server requests the client to do so upon initial connection.
port = number]]>
Used to provide a list of alternate hosts.
This control starts the connection negotiation process by telling the client the supported
security mechanisms and locales from which the client can choose.
If the server cannot support the protocol specified in the protocol header, it MUST close
the socket connection without sending any response control.
The client sends a protocol header containing an invalid protocol name. The server must
respond by closing the connection.
If the client cannot handle the protocol version suggested by the server it MUST close the
socket connection.
The server sends a protocol version that is lower than any valid implementation, e.g. 0.1.
The client must respond by closing the connection.
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.
Client connects to server and inspects the server properties. It checks for the presence
of the required fields.
A list of the security mechanisms that the server supports.
A list of the message locales that the server supports. The locale defines the language in
which the server will send reply texts.
The server MUST support at least the en_US locale.
Client connects to server and inspects the locales field. It checks for the presence of
the required locale(s).
This control selects a SASL security mechanism.
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.
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 control, the server MUST close the connection without sending any
further data.
Client connects to server and sends an invalid security mechanism. The server must
respond by closing the connection (a socket close, with no connection close
negotiation).
A block of opaque data passed to the security mechanism. The contents of this data are
defined by the SASL security mechanism.
A single message locale selected by the client, which must be one of those specified by
the server.
The SASL protocol works by exchanging challenges and responses until both peers have
received sufficient information to authenticate each other. This control challenges the
client to provide more information.
Challenge information, a block of opaque binary data passed to the security mechanism.
This control attempts to authenticate, passing a block of SASL data for the security
mechanism at the server side.
A block of opaque data passed to the security mechanism. The contents of this data are
defined by the SASL security mechanism.
This control proposes a set of connection configuration values to the client. The client can
accept and/or adjust these.
The maximum total number of channels that the server allows per connection. If this is not
set it means that the server does not impose a fixed limit, but the number of allowed
channels may be limited by available server resources.
The largest frame size that the server proposes for the connection. The client can
negotiate a lower value. If this is not set 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 max-frame-size has been negotiated, both peers MUST accept frames of up to
MIN-MAX-FRAME-SIZE octets large, and the minimum negotiated value for max-frame-size is
also MIN-MAX-FRAME-SIZE.
Client connects to server and sends a large properties field, creating a frame of
MIN-MAX-FRAME-SIZE octets. The server must accept this frame.
The minimum delay, in seconds, of the connection heartbeat supported by the server. If
this is not set it means the server does not support sending heartbeats.
The maximum delay, in seconds, of the connection heartbeat supported by the server. If
this is not set it means the server has no maximum.
The heartbeat-max value must be greater than or equal to the value supplied in the
heartbeat-min field.
If no heartbeat-min is supplied, then the heartbeat-max field MUST remain empty.
This control sends the client's connection tuning parameters to the server. Certain fields
are negotiated, others provide capability information.
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 implementers.
If the client agrees to a channel-max of N channels, then the channels available for
communication between client and server are precisely the channels numbered 0 to (N-1).
The largest frame size that the client and server will use for the connection. If it is
not set 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 max-frame-size limit
applies principally to content frames, where large contents can be broken into frames of
arbitrary size.
Until the max-frame-size has been negotiated, both peers MUST accept frames of up to
MIN-MAX-FRAME-SIZE octets large, and the minimum negotiated value for max-frame-size is
also MIN-MAX-FRAME-SIZE.
If the client specifies a max-frame-size 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 implementers.
A peer MUST NOT send frames larger than the agreed-upon size. A peer that receives an
oversized frame MUST close the connection with the framing-error close-code.
The delay, in seconds, of the connection heartbeat chosen by the client. If it is not set
it means the client does not want a heartbeat.
The chosen heartbeat MUST be in the range supplied by the heartbeat-min and
heartbeat-max fields of connection.tune.
The heartbeat field MUST NOT be set if the heartbeat-min field of connection.tune was
not set by the server.
This control 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.
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.
The client can specify zero or more capability names. The server can use this to determine
how to process the client's connection request.
In a configuration with multiple collaborating servers, the server may respond to a
connection.open control with a Connection.Redirect. The insist option tells the server
that the client is insisting on a connection to the specified server.
When the client uses the insist option, the server MUST NOT respond with a
Connection.Redirect control. If it cannot accept the client's connection request it
should respond by closing the connection with a suitable reply code.
This control signals to the client that the connection is ready for use.
Specifies an array of equivalent or alternative hosts that the server knows about, which
will normally include the current server itself. Each entry in the array will be in the
form of an IP address or DNS name, optionally followed by a colon and a port number.
Clients can cache this information and use it when reconnecting to a server after a
failure. This field may be empty.
This control redirects the client to another server, based on the requested virtual host
and/or capabilities.
When getting the connection.redirect control, the client SHOULD reconnect to the host
specified, and if that host is not present, to any of the hosts specified in the
known-hosts list.
Specifies the server to connect to.
An array of equivalent or alternative hosts that the server knows about.
The heartbeat control may be used to generate artificial network traffic when a connection
is idle. If a connection is idle for more than twice the negotiated heartbeat delay, the
peers MAY be considered disconnected.
This control indicates that the sender wants to close the connection. The reason for close
is indicated with the reply-code and reply-text. The channel this control is sent on MAY be
used to indicate which channel caused the connection to close.
Indicates the reason for connection closure.
This text can be logged as an aid to resolving issues.
This control confirms a connection.close control 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 control
SHOULD log the error.
A session is a named interaction between two peers. Session names are chosen by the upper
layers and may be used indefinitely. The model layer may associate long-lived or durable state
with a given session name. The session layer provides transport of commands associated with
this interaction.
The controls defined within this class are specified in terms of the "sender" of commands and
the "receiver" of commands. Since both client and server send and receive commands, the
overall session dialog is symmetric, however the semantics of the session controls are defined
in terms of a single sender/receiver pair, and it is assumed that the client and server will
each contain both a sender and receiver implementation.
The transport MUST be attached in order to use any control other than "attach", "attached",
"detach", or "detached". A peer receiving any other control on a detached transport MUST
discard it and send a session.detached with the "not-attached" reason code.
The sender of commands.
The receiver of commands.
The session name uniquely identifies an interaction between two peers. It is scoped to a
given authentication principal.
The session was detached by request.
The session is currently attached to another transport.
The transport is currently attached to another session.
The transport is not currently attached to any session.
Command data was received prior to any use of the command-point control.
The session header appears on commands after the class and command id, but prior to command
arguments.
Request notification of completion for this command.
Requests that the current transport be attached to the named session. Success or failure
will be indicated with an attached or detached response. This control is idempotent.
A session MUST NOT be attached to more than one transport at a time.
A transport MUST NOT be attached to more than one session at a time.
Attaching a session to its current transport MUST succeed and result in an attached
response.
Attachment to the same session name from distinct authentication principals MUST succeed.
Identifies the session to be attached to the current transport.
If set then a busy session will be forcibly detached from its other transport and
reattached to the current transport.
Confirms successful attachment of the transport to the named session.
Identifies the session now attached to the current transport.
Detaches the current transport from the named session.
Identifies the session to detach.
Confirms detachment of the current transport from the named session.
Identifies the detached session.
Identifies the reason for detaching from the named session.
This control may be sent by either the sender or receiver of commands. It requests that the
execution timeout be changed. This is the minimum amount of time that a peer must preserve
execution state for a detached session.
The handler of this request MUST set his timeout to the maximum allowed value less than or
equal to the requested timeout, and MUST convey the chosen timeout in the response.
The requested timeout for execution state in seconds. If not set, this control requests
that execution state is preserved indefinitely.
This control may be sent by the either the sender or receiver of commands. It is a
one-to-one reply to the request-timeout control that indicates the granted timeout for
execution state.
The timeout for execution state. If not set, then execution state is preserved
indefinitely.
This control is sent by the sender of commands and handled by the receiver of commands. This
establishes the sequence numbers associated with all subsequent command data sent from the
sender to the receiver. The subsequent command data will be numbered starting with the
values supplied in this control and proceeding sequentially. This must be used at least once
prior to sending any command data on newly attached transports.
If command data is sent on a newly attached transport the session MUST be detached with an
"unknown-id" reason-code.
If the offset is zero, the next data frame MUST have the first-frame and first-segment
flags set. Violation of this is a framing error.
If the offset is nonzero, the next data frame MUST NOT have both the first-frame and
first-segment flag set. Violation of this is a framing error.
This control is sent by the receiver of commands and handled by the sender of commands. It
informs the sender of what commands and command fragments are expected at the receiver.
This control is only sent in response to a flush control with the expected flag set. The
expected control is never sent spontaneously.
The set of expected commands MUST include the next command after the highest seen command.
The set of expected commands MUST have zero elements if and only if the sender holds no
execution state for the session (i.e. it is a new session).
If a command-id appears in the commands field, it MUST NOT appear in the fragments field.
When choice is permitted, a command MUST appear in the commands field rather than the
fragments field.
This control is sent by the receiver of commands and handled by the sender of commands. This
sends the set of commands that will definitely be completed by this peer to the sender. This
excludes commands known by the receiver to be considered confirmed or complete at the
sender.
This control must be sent if the partner requests the set of confirmed commands using the
session.flush control with the confirmed flag set.
This control may be sent spontaneously. One reason for separating confirmation from
completion is for large persistent messages, where the receipt (and storage to a durable
store) of part of the message will result in less data needing to be replayed in the case of
transport failure during transmission.
A simple implementation of an AMQP client or server may be implemented to take no action on
receipt of session.confirmed controls, and take action only when receiving
session.completed controls.
A simple implementation of an AMQP client or server may be implemented such that it never
spontaneously sends session.confirmed and that when requested for the set of confirmed
commands (via the session.flush control) it responds with the same set of commands as it
would to when the set of completed commands was requested (trivially all completed commands
are confirmed).
If a command has durable implications, it MUST NOT be confirmed until the fact of the
command has been recorded on durable media.
If a command-id appears in the commands field, it MUST NOT appear in the fragments field.
When choice is permitted, a command MUST appear in the commands field rather than the
fragments field.
Command-ids included in prior known-complete replies MUST be excluded from the set of
all confirmed commands.
This control is sent by the receiver of commands, and handled by the sender of commands. It
informs the sender of all commands completed by the receiver. This excludes commands known
by the receiver to be considered complete at the sender.
The sender MUST eventually reply with a known-completed set that covers the completed ids.
The known-complete reply MAY be delayed at the senders discretion if the timely-reply
field is not set.
Multiple replies may be merged by sending a single known-completed that includes the union
of the merged command-id sets.
The ids of all completed commands. This excludes commands known by the receiver to be
considered complete at the sender.
The sender MUST consider any completed commands to also be confirmed.
Command-ids included in prior known-complete replies MUST be excluded from the set of
all completed commands.
If set, the sender is no longer free to delay the known-completed reply.
This control is sent by the sender of commands, and handled by the receiver of commands. It
is sent in reply to one or more completed controls from the receiver. It informs the
receiver that commands are known to be completed by the sender.
The sender need not keep state to generate this reply. It is sufficient to reply to any
completed control with an exact echo of the completed ids.
The set of completed commands for one or more session.completed controls.
The receiver MUST treat any of the specified commands to be considered by the sender as
confirmed as well as completed.
This control is sent by the sender of commands and handled by the receiver of commands. It
requests that the receiver produce the indicated command sets. The receiver should issue the
indicated sets at the earliest possible opportunity.
This control is sent by the sender of commands and handled by the receiver of commands. It
sends command ranges for which there will be no further data forthcoming. The receiver
should proceed with the next available commands that arrive after the gap.
The command-ids covered by a session.gap MUST be added to the completed and confirmed sets
by the receiver.
If a session.gap covers a partially received command, the receiving peer MUST treat the
command as aborted.
If a session.gap covers a completed or confirmed command, the receiving peer MUST continue
to treat the command as completed or confirmed.
The set of command-ids that are contained in this gap.
The execution class provides commands that carry execution information about other model level
commands.
The client attempted to work with a server entity to which it has no access due to
security settings.
The client attempted to work with a server entity that does not exist.
The client attempted to work with a server entity to which it has no access because
another client is working with it.
The client requested a command that was not allowed because some precondition failed.
A server entity the client is working with has been deleted.
The peer sent a command that is not permitted in the current state of the session.
The command segments could not be decoded.
The client exceeded its resource allocation.
The peer tried to use a command a manner that is inconsistent with the rules described
in the specification.
The command argument is malformed, i.e. it does not fall within the specified domain.
The illegal-argument exception can be raised on execution of any command which has
domain valued fields.
The peer tried to use functionality that is not implemented in its partner.
The peer could not complete the command because of an internal error. The peer may
require intervention by an operator in order to resume normal operations.
An invalid argument was passed to a command, and the operation could not
proceed. An invalid argument is not illegal (see illegal-argument), i.e. it matches
the domain definition; however the particular value is invalid in this context.
This command is complete when all prior commands are completed.
This command carries data resulting from the execution of a command.
This command informs a peer of an execution exception. The command-id, when given,
correlates the error to a specific command.
The command-id of the command which caused the exception. If the exception was not caused
by a specific command, this value is not set.
The zero based index of the exceptional field within the arguments to the exceptional
command. If the exception was not caused by a specific field, this value is not set.
The description provided is implementation defined, but MUST be in the language
appropriate for the selected locale. The intention is that this description is suitable
for logging or alerting output.
The message class provides commands that support an industry-standard messaging model.
START:
The message has yet to be sent to the recipient.
NOT-ACQUIRED:
The message has been sent to the recipient, but is not
acquired by the recipient.
ACQUIRED:
The message has been sent to and acquired by the recipient.
END:
The transfer is complete.
END]]>
| /|\
| |
+-------------------------------+
message = *:TRANSFER [ R:ACQUIRE ] [ R:ACCEPT / R:REJECT / R:RELEASE ]
/ *:RESUME
/ *:SET-FLOW-MODE
/ *:FLOW
/ *:STOP
/ C:SUBSCRIBE
/ C:CANCEL
/ C:FLUSH
The server SHOULD respect the delivery-mode property of messages and SHOULD make a
best-effort to hold persistent messages on a reliable storage mechanism.
Send a persistent message to queue, stop server, restart server and then verify whether
message is still present. Assumes that queues are durable. Persistence without durable
queues makes no sense.
The server MUST NOT discard a persistent message in case of a queue overflow.
Create a queue overflow situation with persistent messages and verify that messages do not
get lost (presumably the server will write them to disk).
The server MAY use the message.flow command to slow or stop a message publisher when
necessary.
The server MAY overflow non-persistent messages to persistent storage.
The server MAY discard or dead-letter non-persistent messages on a priority basis if the
queue size exceeds some configured limit.
The server MUST implement at least 2 priority levels for messages, where priorities 0 and
9 are treated as two distinct levels.
The server SHOULD implement distinct priority levels in the following manner:
If the server implements n distinct priorities then priorities 0 to 5 - ceiling(n/2) should
be treated equivalently and should be the lowest effective priority. The priorities 4 +
floor(n/2) should be treated equivalently and should be the highest effective priority. The
priorities (5 - ceiling(n/2)) to (4 + floor(n/2)) inclusive must be treated as distinct
priorities.
Thus, for example, if 2 distinct priorities are implemented, then levels 0 to 4 are
equivalent, and levels 5 to 9 are equivalent and levels 4 and 5 are distinct. If 3 distinct
priorities are implements the 0 to 3 are equivalent, 5 to 9 are equivalent and 3, 4 and 5
are distinct.
This scheme ensures that if two priorities are distinct for a server which implements m
separate priority levels they are also distinct for a server which implements n different
priority levels where n > m.
The server MUST deliver messages of the same priority in order irrespective of their
individual persistence.
Send a set of messages with the same priority but different persistence settings to a queue.
Subscribe and verify that messages arrive in same order as originally published.
Specifies the destination to which the message is to be transferred.
Controls how the sender of messages is notified of successful transfer.
Successful transfer is signaled by message.accept. An acquired message (whether
acquisition was implicit as in pre-acquired mode or explicit as in not-acquired mode) is
not considered transferred until a message.accept that includes the transfer command is
received.
Successful transfer is assumed when accept-mode is "pre-acquired". Messages transferred
with an accept-mode of "not-acquired" cannot be acquired when accept-mode is "none".
Indicates whether a transferred message can be considered as automatically acquired or
whether an explicit request is necessary in order to acquire it.
the message is acquired when the transfer starts
the message is not acquired when it arrives, and must be explicitly acquired by the
recipient
Code specifying the reason for a message reject.
Rejected for an unspecified reason.
Delivery was attempted but there were no queues which the message could be routed to.
The rejected message had the immediate flag set to true, but at the time of the transfer
at least one of the queues to which it was to be routed did not have any subscriber able
to take the message.
A resume-id serves to identify partially transferred message content. The id is chosen by
the sender, and must be unique to a given user. A resume-id is not expected to be unique
across users.
Used to set the reliability requirements for a message which is transferred to the server.
A non-persistent message may be lost in event of a failure, but the nature of the
communication is such that an occasional message loss is tolerable. This is the lowest
overhead mode. Non-persistent messages are delivered at most once only.
A persistent message is one which must be stored on a persistent medium (usually hard
drive) at every stage of delivery so that it will not be lost in event of failure (other
than of the medium itself). This is normally accomplished with some additional overhead.
A persistent message may be delivered more than once if there is uncertainty about the
state of its delivery after a failure and recovery.
Used to assign a priority to a message transfer. Priorities range from 0 (lowest) to 9
(highest).
Lowest possible priority message.
Very low priority message
Low priority message.
Below average priority message.
Medium priority message.
Above average priority message
High priority message
Higher priority message
Very high priority message.
Highest possible priority message.
If set on a message that is not routable the broker can discard it. If not set, an
unroutable message should be handled by reject when accept-mode is explicit; or by routing
to the alternate-exchange if defined when accept-mode is none.
If the immediate flag is set to true on a message transferred to a Server, then the
message should be considered unroutable (and not delivered to any queues) if, for any
queue that it is to be routed to according to the standard routing behavior, there is not
a subscription on that queue able to receive the message. The treatment of unroutable
messages is dependent on the value of the discard-unroutable flag.
The immediate flag is ignored on transferred to a Client.
This boolean flag indicates that the message may have been previously delivered to this
or another client.
If the redelivered flag is set on transfer to a Server, then any delivery of the message
from that Server to a Client must also have the redelivered flag set to true.
The server MUST try to signal redelivered messages when it can. When redelivering a
message that was not successfully accepted, the server SHOULD deliver it to the original
client if possible.
Create a shared queue and publish a message to the queue. Subscribe using explicit
accept-mode, but do not accept the message. Close the session, reconnect, and subscribe
to the queue again. The message MUST arrive with the redelivered flag set.
The client should not rely on the redelivered field to detect duplicate messages where
publishers may themselves produce duplicates. A fully robust client should be able to
track duplicate received messages on non-transacted, and locally-transacted sessions.
Message priority, which can be between 0 and 9. Messages with higher priorities may be
delivered before those with lower priorities.
The delivery mode may be non-persistent or persistent.
Duration in milliseconds for which the message should be considered "live". If this is
set then a message expiration time will be computed based on the current time plus this
value. Messages that live longer than their expiration time will be discarded (or dead
lettered).
If a message is transferred between brokers before delivery to a final subscriber the
ttl should be decremented before peer to peer transfer and both timestamp and expiration
should be cleared.
The timestamp is set by the broker on arrival of the message.
The expiration header assigned by the broker. After receiving the message the broker sets
expiration to the sum of the ttl specified in the publish command and the current time.
(ttl=expiration - timestamp)
Identifies the exchange specified in the destination field of the message.transfer used to
publish the message. This MUST be set by the broker upon receipt of a message.
The value of the key determines to which queue the exchange will send the message. The way
in which keys are used to make this routing decision depends on the type of exchange to
which the message is sent. For example, a direct exchange will route a message to a queue
if that queue is bound to the exchange with a binding-key identical to the routing-key of
the message.
When a resume-id is provided the recipient MAY use it to retain message data should the
session expire while the message transfer is still incomplete.
When a resume-ttl is provided the recipient MAY use it has a guideline for how long to
retain the partially complete data when a resume-id is specified. If no resume-id is
specified then this value should be ignored.
These properties permit the transfer of message fragments. These may be used in conjunction
with byte level flow control to limit the rate at which large messages are received. Only
the first fragment carries the delivery-properties and message-properties.
Syntactically each fragment appears as a complete message to the lower layers of the
protocol, however the model layer is required to treat all the fragments as a single
message. For example all fragments must be delivered to the same client. In pre-acquired
mode, no message fragments can be delivered by the broker until the entire message has been
received.
True if this fragment contains the start of the message, false otherwise.
True if this fragment contains the end of the message, false otherwise.
This field may optionally contain the size of the fragment.
The reply-to domain provides a simple address structure for replying to to a message to a
destination within the same virtual-host.
The length of the body segment in bytes.
Message-id is an optional property of UUID type which uniquely identifies a message within
the message system. The message producer is usually responsible for setting the
message-id. The server MAY discard a message as a duplicate if the value of the message-id
matches that of a previously received message. Duplicate messages MUST still be accepted
if transferred with an accept-mode of "explicit".
A message-id MUST be unique within a given server instance. A message-id SHOULD be
globally unique (i.e. across different systems).
A message ID is immutable. Once set, a message-id MUST NOT be changed or reassigned,
even if the message is replicated, resent or sent to multiple queues.
This is a client-specific id that may be used to mark or identify messages between
clients. The server ignores this field.
The destination of any message that is sent in reply to this message.
The RFC-2046 MIME type for the message content (such as "text/plain"). This is set by the
originating client.
The encoding for character-based message content. This is set by the originating client.
Examples include UTF-8 and ISO-8859-15.
The identity of the user responsible for producing the message. The client sets this
value, and it is authenticated by the broker.
The server MUST produce an unauthorized-access exception if the user-id field is set to
a principle for which the client is not authenticated.
The identity of the client application responsible for producing the message.
This is a collection of user-defined headers or properties which may be set by the
producing client and retrieved by the consuming client.
Credit based flow control.
Window based flow control.
Indicates a value specified in messages.
Indicates a value specified in bytes.
This command transfers a message between two peers. When a client uses this command to
publish a message to a broker, the destination identifies a specific exchange. The message
will then be routed to queues as defined by the exchange configuration.
The client may request a broker to transfer messages to it, from a particular queue, by
issuing a subscribe command. The subscribe command specifies the destination that the broker
should use for any resulting transfers.
If a transfer to an exchange occurs within a transaction, then it is not available from
the queue until the transaction commits. It is not specified whether routing takes place
when the transfer is received or when the transaction commits.
Specifies the destination to which the message is to be transferred.
The server MUST accept a blank destination to mean the default exchange.
If the destination refers to an exchange that does not exist, the peer MUST raise a
session exception.
Indicates whether message.accept, session.complete, or nothing at all is required to
indicate successful transfer of the message.
Indicates whether or not the transferred message has been acquired.
Accepts the message. Once a transfer is accepted, the command-id may no longer be referenced
from other commands.
The recipient MUST have acquired a message in order to accept it.
Identifies the messages previously transferred that should be accepted.
Indicates that the message transfers are unprocessable in some way. A server may reject a
message if it is unroutable. A client may reject a message if it is invalid. A message may
be rejected for other reasons as well. Once a transfer is rejected, the command-id may no
longer be referenced from other commands.
When a client rejects a message, the server MUST deliver that message to the
alternate-exchange on the queue from which it was delivered. If no alternate-exchange is
defined for that queue the broker MAY discard the message.
The recipient MUST have acquired a message in order to reject it. If the message is not
acquired any reject MUST be ignored.
Identifies the messages previously transferred that should be rejected.
Code describing the reason for rejection.
Text describing the reason for rejection.
Release previously transferred messages. When acquired messages are released, they become
available for acquisition by any subscriber. Once a transfer is released, the command-id may
no longer be referenced from other commands.
Acquired messages that have been released MAY subsequently be delivered out of order.
Implementations SHOULD ensure that released messages keep their position with respect to
undelivered messages of the same priority.
Indicates the messages to be released.
By setting set-redelivered to true, any acquired messages released to a queue with this
command will be marked as redelivered on their next transfer from that queue. If this flag
is not set, then an acquired message will retain its original redelivered status on the
queue. Messages that are not acquired are unaffected by the value of this flag.
Acquires previously transferred messages for consumption. The acquired ids (if any) are
sent via message.acquired.
Each acquire MUST produce exactly one message.acquired even if it is empty.
Indicates the messages to be acquired.
Identifies a set of previously transferred messages that have now been acquired.
Indicates the acquired messages.
This command resumes an interrupted transfer. The recipient should return the amount of
partially transferred data associated with the given resume-id, or zero if there is no data
at all. If a non-zero result is returned, the recipient should expect to receive message
fragment(s) containing the remainder of the interrupted message.
The destination to which the remaining message fragments are transferred.
If the destination does not exist, the recipient MUST close the session.
The name of the transfer being resumed.
If the resume-id is not known, the recipient MUST return an offset of zero.
Indicates the amount of data already transferred.
This command asks the server to start a "subscription", which is a request for messages
from a specific queue. Subscriptions last as long as the session they were created on, or
until the client cancels them.
The server SHOULD support at least 16 subscriptions per queue, and ideally, impose no
limit except as defined by available resources.
Create a queue and create subscriptions on that queue until the server
closes the connection. Verify that the number of subscriptions created was at least
sixteen and report the total number.
The default flow mode for new subscriptions is window-mode.
If the queue for this subscription is deleted, any subscribing sessions MUST be closed.
This exception may occur at any time after the subscription has been completed.
If the queue for this subscription does not exist, then the subscribing session MUST
be closed.
Immediately after a subscription is created, the initial byte and message credit for that
destination is zero.
Specifies the name of the subscribed queue.
The client specified name for the subscription. This is used as the destination for
all messages transferred from this subscription. The destination is scoped to the session.
The client MUST NOT specify a destination that refers to an existing subscription on
the same session.
Attempt to create two subscriptions on the same session with the
same non-empty destination.
The accept-mode to use for messages transferred from this subscription.
The acquire-mode to use for messages transferred from this subscription.
Request an exclusive subscription. This prevents other subscribers from subscribing to
the queue.
The server MUST NOT grant an exclusive subscription to a queue that already has
subscribers.
Open two connections to a server, and in one connection create a
shared (non-exclusive) queue and then subscribe to the queue. In the second connection
attempt to subscribe to the same queue using the exclusive option.
Requests that the broker use the supplied resume-id when transferring messages for
this subscription.
Requested duration in milliseconds for the broker use as resume-ttl when transferring
messages for this subscription.
The syntax and semantics of these arguments depends on the providers implementation.
This command cancels a subscription. This does not affect already delivered messages, but it
does mean the server will not send any more messages for that subscription. The client may
receive an arbitrary number of messages in between sending the cancel command and receiving
notification that the cancel command is complete.
Canceling a subscription MUST NOT affect pending transfers. A transfer made prior to
canceling transfers to the destination MUST be able to be accepted, released, acquired, or
rejected after the subscription is canceled.
If the subscription specified by the destination is not found, the server MUST close the
session.
Sets the mode of flow control used for a given destination to either window or credit based
flow control.
With credit based flow control, the sender of messages continually maintains its current
credit balance with the recipient. The credit balance consists of two values, a message
count, and a byte count. Whenever message data is sent, both counts must be decremented.
If either value reaches zero, the flow of message data must stop. Additional credit is
received via the message.flow command.
The sender MUST NOT send partial assemblies. This means that if there is not enough byte
credit available to send a complete message, the sender must either wait or use message
fragmentation (see the fragment-properties header struct) to send the first part of the
message data in a complete assembly.
Window based flow control is identical to credit based flow control, however message
transfer completion implicitly grants a single unit of message credit, and the size of the
message in byte credits for each completed message transfer. Completion of the transfer
command with session.completed is the only way credit is implicitly updated; message.accept,
message.release, message.reject, tx.commit and tx.rollback have no effect on the outstanding
credit balances.
The byte count is decremented by the payload size of each transmitted frame with segment
type header or body appearing within a message.transfer command. Note that the payload
size is the frame size less the frame header size.
Mode switching may only occur if both the byte and message credit balance are zero. There
are three ways for a recipient of messages to be sure that the sender's credit balances
are zero:
1) The recipient may send a message.stop command to the sender. When the recipient
receives notification of completion for the message.stop command, it knows that the
sender's credit is zero.
2) The recipient may perform the same steps described in (1) with the message.flush
command substituted for the message.stop command.
3) Immediately after a subscription is created with message.subscribe, the credit for
that destination is zero.
Prior to receiving an explicit set-flow-mode command, a peer MUST consider the flow-mode
to be window.
The new flow control mode.
This command controls the flow of message data to a given destination. It is used by the
recipient of messages to dynamically match the incoming rate of message flow to its
processing or forwarding capacity. Upon receipt of this command, the sender must add "value"
number of the specified unit to the available credit balance for the specified destination.
A value of (0xFFFFFFFF) indicates an infinite amount of credit. This disables any limit for
the given unit until the credit balance is zeroed with message.stop or message.flush.
The unit of value.
If the value is not set then this indicates an infinite amount of credit.
Forces the sender to exhaust his credit supply. The sender's credit will always be zero when
this command completes. The command completes when immediately available message data has
been transferred, or when the credit supply is exhausted.
On receipt of this command, a producer of messages MUST set his credit to zero for the given
destination. When notifying of completion, credit MUST be zero and no further messages will
be sent until such a time as further credit is received.
Standard transactions provide so-called "1.5 phase commit". We can ensure that work is never
lost, but there is a chance of confirmations being lost, so that messages may be resent.
Applications that use standard transactions must be able to detect and ignore duplicate
messages.
tx = C:SELECT
/ C:COMMIT
/ C:ROLLBACK
An client using standard transactions SHOULD be able to track all messages received within a
reasonable period, and thus detect and reject duplicates of the same message. It SHOULD NOT
pass these to the application layer.
This command sets the session to use standard transactions. The client must use this command
exactly once on a session before using the Commit or Rollback commands.
A client MUST NOT select standard transactions on a session that is already transactional.
A client MUST NOT select standard transactions on a session that is already enlisted in a
distributed transaction.
On a session on which tx.select has been issued, a client MUST NOT issue a
message.subscribe command with the accept-mode property set to any value other than
explicit. Similarly a tx.select MUST NOT be issued on a session on which a there is a non
cancelled subscriber with accept-mode of none.
This command commits all messages published and accepted in the current transaction. A
new transaction starts immediately after a commit.
In more detail, the commit acts on all messages which have been transferred from the Client
to the Server, and on all acceptances of messages sent from Server to Client. Since the
commit acts on commands sent in the same direction as the commit command itself, there is no
ambiguity on the scope of the commands being committed. Further, the commit will not be
completed until all preceding commands which it affects have been completed.
Since transactions act on explicit accept commands, the only valid accept-mode for message
subscribers is explicit. For transferring messages from Client to Server (publishing) all
accept-modes are permitted.
A client MUST NOT issue tx.commit on a session that has not been selected for standard
transactions with tx.select.
This command abandons the current transaction. In particular the transfers from Client to
Server (publishes) and accepts of transfers from Server to Client which occurred in the
current transaction are discarded. A new transaction starts immediately after a rollback.
In more detail, when a rollback is issued, any the effects of transfers which occurred from
Client to Server are discarded. The Server will issue completion notification for all such
transfers prior to the completion of the rollback. Similarly the effects of any
message.accept issued from Client to Server prior to the issuance of the tx.rollback will be
discarded; and notification of completion for all such commands will be issued before the
issuance of the completion for the rollback.
After the completion of the rollback, the client will still hold the messages which it has
not yet accepted (including those for which accepts were previously issued within the
transaction); i.e. the messages remain "acquired". If the Client wishes to release those
messages back to the Server, then appropriate message.release commands must be issued.
A client MUST NOT issue tx.rollback on a session that has not been selected for standard
transactions with tx.select.
This provides the X-Open XA distributed transaction protocol support. It allows a session
to be selected for use with distributed transactions, the transactional boundaries for work on
that session to be demarcated and allows the transaction manager to coordinate transaction
outcomes.
dtx-demarcation = C:SELECT *demarcation
demarcation = C:START C:END
dtx-coordination = *coordination
coordination = command
/ outcome
/ recovery
command = C:SET-TIMEOUT
/ C:GET-TIMEOUT
outcome = one-phase-commit
/ one-phase-rollback
/ two-phase-commit
/ two-phase-rollback
one-phase-commit = C:COMMIT
one-phase-rollback = C:ROLLBACK
two-phase-commit = C:PREPARE C:COMMIT
two-phase-rollback = C:PREPARE C:ROLLBACK
recovery = C:RECOVER *recovery-outcome
recovery-outcome = one-phase-commit
/ one-phase-rollback
/ C:FORGET
Enabling XA transaction support on a session requires that the server MUST manage
transactions demarcated by start-end blocks. That is to say that on this XA-enabled session,
work undergone within transactional blocks is performed on behalf a transaction branch
whereas work performed outside of transactional blocks is NOT transactional.
Normal execution completion (no error).
The rollback was caused for an unspecified reason.
A transaction branch took too long.
The transaction branch may have been heuristically completed.
The transaction branch has been heuristically committed.
The transaction branch has been heuristically rolled back.
The transaction branch has been heuristically committed and rolled back.
The transaction branch was read-only and has been committed.
An xid uniquely identifies a transaction branch.
This command sets the session to use distributed transactions. The client must use this
command at least once on a session before using XA demarcation operations.
This command is called when messages should be produced and consumed on behalf a transaction
branch identified by xid.
If the command is invoked in an improper context (see class grammar) then the server MUST
send a session exception.
If neither join nor resume is specified is specified and the transaction branch specified
by xid has previously been seen then the server MUST raise an exception.
If join and resume are specified then the server MUST raise an exception.
Specifies the xid of the transaction branch to be started.
If xid is already known by the broker then the server MUST raise an exception.
Indicate whether this is joining an already associated xid. Indicate that the start
applies to joining a transaction previously seen.
If the broker does not support join the server MUST raise an exception.
Indicate that the start applies to resuming a suspended transaction branch specified.
This confirms to the client that the transaction branch is started or specify the error
condition.
The value of this field may be one of the following constants:
xa-ok: Normal execution.
xa-rbrollback: The broker marked the transaction branch rollback-only for an unspecified
reason.
xa-rbtimeout: The work represented by this transaction branch took too long.
This command is called when the work done on behalf a transaction branch finishes or needs
to be suspended.
If the command is invoked in an improper context (see class grammar) then the server MUST
raise an exception.
If suspend and fail are specified then the server MUST raise an exception.
If neither fail nor suspend are specified then the portion of work has completed
successfully.
When a session is closed then the currently associated transaction branches MUST be marked
rollback-only.
Specifies the xid of the transaction branch to be ended.
The session MUST be currently associated with the given xid (through an earlier start
call with the same xid).
If set, indicates that this portion of work has failed; otherwise this portion of work has
completed successfully.
An implementation MAY elect to roll a transaction back if this failure notification is
received. Should an implementation elect to implement this behavior, and this bit is
set, then then the transaction branch SHOULD be marked as rollback-only and the end
result SHOULD have the xa-rbrollback status set.
Indicates that the transaction branch is temporarily suspended in an incomplete state.
The transaction context is in a suspended state and must be resumed via the start
command with resume specified.
This command confirms to the client that the transaction branch is ended or specify the
error condition.
The value of this field may be one of the following constants:
xa-ok: Normal execution.
xa-rbrollback: The broker marked the transaction branch rollback-only for an unspecified
reason. If an implementation chooses to implement rollback-on-failure behavior, then
this value should be selected if the dtx.end.fail bit was set.
xa-rbtimeout: The work represented by this transaction branch took too long.
Commit the work done on behalf a transaction branch. This command commits the work
associated with xid. Any produced messages are made available and any consumed messages are
discarded.
If the command is invoked in an improper context (see class grammar) then the server MUST
raise an exception.
Specifies the xid of the transaction branch to be committed.
If xid is unknown (the transaction branch has not been started or has already been
ended) then the server MUST raise an exception.
If this command is called when xid is still associated with a session then the server
MUST raise an exception.
Used to indicate whether one-phase or two-phase commit is used.
The one-phase bit MUST be set if a commit is sent without a preceding prepare.
The one-phase bit MUST NOT be set if the commit has been preceded by prepare.
This confirms to the client that the transaction branch is committed or specify the
error condition.
The value of this field may be one of the following constants:
xa-ok: Normal execution
xa-heurhaz: Due to some failure, the work done on behalf of the specified transaction
branch may have been heuristically completed.
xa-heurcom: Due to a heuristic decision, the work done on behalf of the specified
transaction branch was committed.
xa-heurrb: Due to a heuristic decision, the work done on behalf of the specified
transaction branch was rolled back.
xa-heurmix: Due to a heuristic decision, the work done on behalf of the specified
transaction branch was partially committed and partially rolled back.
xa-rbrollback: The broker marked the transaction branch rollback-only for an unspecified
reason.
xa-rbtimeout: The work represented by this transaction branch took too long.
This command is called to forget about a heuristically completed transaction branch.
If the command is invoked in an improper context (see class grammar) then the server MUST
raise an exception.
Specifies the xid of the transaction branch to be forgotten.
If xid is unknown (the transaction branch has not been started or has already been
ended) then the server MUST raise an exception.
If this command is called when xid is still associated with a session then the server
MUST raise an exception.
This command obtains the current transaction timeout value in seconds. If set-timeout was
not used prior to invoking this command, the return value is the default timeout; otherwise,
the value used in the previous set-timeout call is returned.
Specifies the xid of the transaction branch for getting the timeout.
If xid is unknown (the transaction branch has not been started or has already been
ended) then the server MUST raise an exception.
Returns the value of the timeout last specified through set-timeout.
The current transaction timeout value in seconds.
This command prepares for commitment any message produced or consumed on behalf of xid.
If the command is invoked in an improper context (see class grammar) then the server MUST
raise an exception.
Once this command successfully returns it is guaranteed that the transaction branch may be
either committed or rolled back regardless of failures.
The knowledge of xid cannot be erased before commit or rollback complete the branch.
Specifies the xid of the transaction branch that can be prepared.
If xid is unknown (the transaction branch has not been started or has already been
ended) then the server MUST raise an exception.
If this command is called when xid is still associated with a session then the server
MUST raise an exception.
This command confirms to the client that the transaction branch is prepared or specify the
error condition.
The value of this field may be one of the following constants:
xa-ok: Normal execution.
xa-rdonly: The transaction branch was read-only and has been committed.
xa-rbrollback: The broker marked the transaction branch rollback-only for an unspecified
reason.
xa-rbtimeout: The work represented by this transaction branch took too long.
This command is called to obtain a list of transaction branches that are in a prepared or
heuristically completed state.
Returns to the client a table with single item that is a sequence of transaction xids
that are in a prepared or heuristically completed state.
Array containing the xids to be recovered (xids that are in a prepared or
heuristically completed state).
This command rolls back the work associated with xid. Any produced messages are discarded
and any consumed messages are re-enqueued.
If the command is invoked in an improper context (see class grammar) then the server MUST
raise an exception.
Specifies the xid of the transaction branch that can be rolled back.
If xid is unknown (the transaction branch has not been started or has already been
ended) then the server MUST raise an exception.
If this command is called when xid is still associated with a session then the server
MUST raise an exception.
This command confirms to the client that the transaction branch is rolled back or specify
the error condition.
The value of this field may be one of the following constants:
xa-ok: Normal execution
xa-heurhaz: Due to some failure, the work done on behalf of the specified transaction
branch may have been heuristically completed.
xa-heurcom: Due to a heuristic decision, the work done on behalf of the specified
transaction branch was committed.
xa-heurrb: Due to a heuristic decision, the work done on behalf of the specified
transaction branch was rolled back.
xa-heurmix: Due to a heuristic decision, the work done on behalf of the specified
transaction branch was partially committed and partially rolled back.
xa-rbrollback: The broker marked the transaction branch rollback-only for an unspecified
reason.
xa-rbtimeout: The work represented by this transaction branch took too long.
Sets the specified transaction branch timeout value in seconds.
Once set, this timeout value is effective until this command is reinvoked with a different
value.
A value of zero resets the timeout value to the default value.
Specifies the xid of the transaction branch for setting the timeout.
If xid is unknown (the transaction branch has not been started or has already been
ended) then the server MUST raise an exception.
The transaction timeout value in seconds.
Exchanges match and distribute messages across queues. Exchanges can be configured in the
server or created at runtime.
exchange = C:DECLARE
/ C:DELETE
/ C:QUERY
The server MUST implement these standard exchange types: fanout, direct.
Client attempts to declare an exchange with each of these standard types.
The server SHOULD implement these standard exchange types: topic, headers.
Client attempts to declare an exchange with each of these standard types.
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 commands (such as message.transfer).
Client creates a temporary queue and attempts to bind to each required exchange instance
("amq.fanout", "amq.direct", "amq.topic", and "amq.headers" if those types are defined).
The server MUST pre-declare a direct exchange with no public name to act as the default
exchange for content publish commands (such as message.transfer) and for default queue
bindings.
Client checks that the default exchange is active by publishing a message with a suitable
routing key but without specifying the exchange name, then ensuring that the message arrives
in the queue correctly.
The default exchange MUST NOT be accessible to the client except by specifying an empty
exchange name in a content publish command (such as message.transfer). That is, the server
must not let clients explicitly bind, unbind, delete, or make any other reference to this
exchange.
The server MAY implement other exchange types as wanted.
The exchange name is a client-selected string that identifies the exchange for publish
commands. Exchange names may consist of any mixture of digits, letters, and underscores.
Exchange names are scoped by the virtual host.
This command 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.
The client creates as many exchanges as it can until the server reports an error; the
number of exchanges successfully created must be at least sixteen.
Exchange names starting with "amq." are reserved for pre-declared and standardized
exchanges. The client MUST NOT attempt to create an exchange starting with "amq.".
The name of the exchange MUST NOT be a blank or empty string.
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 command.
If the client attempts to create an exchange which the server does not recognize, an
exception MUST be sent.
In the event that a message cannot be routed, this is the name of the exchange to which
the message will be sent. Messages transferred using message.transfer will be routed to
the alternate-exchange only if they are sent with the "none" accept-mode, and the
discard-unroutable delivery property is set to false, and there is no queue to route to
for the given message according to the bindings on this exchange.
If alternate-exchange is not set (its name is an empty string), unroutable messages
that would be sent to the alternate-exchange MUST be dropped silently.
If the alternate-exchange is not empty and if the exchange already exists with a
different alternate-exchange, then the declaration MUST result in an exception.
A message which is being routed to a alternate exchange, MUST NOT be re-routed to a
secondary alternate exchange if it fails to route in the primary alternate exchange.
After such a failure, the message MUST be dropped. This prevents looping.
If set, the server will not create the exchange. The client can use this to check whether
an exchange exists without modifying the server state.
If set, and the exchange does not already exist, the server MUST raise an exception.
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.
The server MUST ignore the durable field if the exchange already exists.
If set, the exchange is deleted automatically when there remain no bindings between the
exchange and any queue. Such an exchange will not be automatically deleted until at least
one binding has been made to prevent the immediate deletion of the exchange upon creation.
The server MUST ignore the auto-delete field if the exchange already exists.
A set of arguments for the declaration. The syntax and semantics of these arguments
depends on the server implementation. This field is ignored if passive is 1.
If the arguments field contains arguments which are not understood by the server,
it MUST raise an exception.
This command deletes an exchange. When an exchange is deleted all queue bindings on the
exchange are cancelled.
The client MUST NOT attempt to delete an exchange that does not exist.
The name of the exchange MUST NOT be a missing or empty string.
An exchange MUST NOT be deleted if it is in use as an alternate-exchange by a queue or
by another exchange.
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 an exception
instead.
If the exchange has queue bindings, and the if-unused flag is set, the server MUST NOT
delete the exchange, but MUST raise and exception.
This command is used to request information on a particular exchange.
The name of the exchange for which information is requested. If not specified explicitly
the default exchange is implied.
This is sent in response to a query request and conveys information on a particular
exchange.
The type of the exchange. Will be empty if the exchange is not found.
The durability of the exchange, i.e. if set the exchange is durable. Will not be set
if the exchange is not found.
If set, the exchange for which information was requested is not known.
A set of properties of the exchange whose syntax and semantics depends on the server
implementation. Will be empty if the exchange is not found.
This command binds a queue to an exchange. Until a queue is bound it will not receive
any messages. In a classic messaging model, store-and-forward queues are bound to a direct
exchange and subscription queues are bound to a topic exchange.
A server MUST ignore duplicate bindings - that is, two or more bind commands with the
same exchange, queue, and binding-key - without treating these as an error. The value of
the arguments used for the binding MUST NOT be altered by subsequent binding requests.
A client binds a named queue to an exchange. The client then repeats the bind (with
identical exchange, queue, and binding-key). The second binding should use a different
value for the arguments field.
Bindings between durable queues and durable exchanges are automatically durable and
the server MUST restore such bindings after a server restart.
A server creates a named durable queue and binds it to a durable
exchange. The server is restarted. The client then attempts to use the queue/exchange
combination.
The server SHOULD support at least 4 bindings per queue, and ideally, impose no limit
except as defined by available resources.
A client creates a named queue and attempts to bind it to 4 different
exchanges.
Where more than one binding exists between a particular exchange instance and a
particular queue instance any given message published to that exchange should be delivered
to that queue at most once, regardless of how many distinct bindings match.
A client creates a named queue and binds it to the same topic exchange
at least three times using intersecting binding-keys (for example, "animals.*",
"animals.dogs.*", "animal.dogs.chihuahua"). Verify that a message matching all the
bindings (using previous example, routing key = "animal.dogs.chihuahua") is delivered once
only.
Specifies the name of the queue to bind.
A client MUST NOT be allowed to bind a non-existent and unnamed queue (i.e. empty
queue name) to an exchange.
A client attempts to bind with an unnamed (empty) queue name to an
exchange.
A client MUST NOT be allowed to bind a non-existent queue (i.e. not previously
declared) to an exchange.
A client attempts to bind an undeclared queue name to an exchange.
A client MUST NOT be allowed to bind a queue to a non-existent exchange.
A client attempts to bind a named queue to a undeclared exchange.
The name of the exchange MUST NOT be a blank or empty string.
The binding-key uniquely identifies a binding between a given (exchange, queue) pair.
Depending on the exchange configuration, the binding key may be matched against the
message routing key in order to make routing decisions. The match algorithm depends on the
exchange type. Some exchange types may ignore the binding key when making routing
decisions. Refer to the specific exchange type documentation. The meaning of an empty
binding key depends on the exchange implementation.
A set of arguments for the binding. The syntax and semantics of these arguments
depends on the exchange class.
If the arguments field contains arguments which are not understood by the server, it
MUST raise an exception.
This command unbinds a queue from an exchange.
Specifies the name of the queue to unbind.
If the queue does not exist the server MUST raise an exception.
The name of the exchange to unbind from.
If the exchange does not exist the server MUST raise an exception.
The name of the exchange MUST NOT be a blank or empty string.
Specifies the binding-key of the binding to unbind.
If there is no matching binding-key the server MUST raise an exception.
This command is used to request information on the bindings to a particular exchange.
The name of the exchange for which binding information is being requested. If not
specified explicitly the default exchange is implied.
If populated then determine whether the given queue is bound to the exchange.
If populated defines the binding-key of the binding of interest, if not populated the
request will ignore the binding-key on bindings when searching for a match.
If populated defines the arguments of the binding of interest if not populated the request
will ignore the arguments on bindings when searching for a match
If set, the exchange for which information was requested is not known.
If set, the queue specified is not known.
A bit which if set indicates that no binding was found from the specified exchange to
the specified queue.
A bit which if set indicates that no binding was found from the specified exchange
with the specified binding-key.
A bit which if set indicates that no binding was found from the specified exchange
with the specified arguments.
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.
queue = C:DECLARE
/ C:BIND
/ C:PURGE
/ C:DELETE
/ C:QUERY
/ C:UNBIND
A server MUST allow any content class to be sent to any queue, in any mix, and queue and
deliver these content classes independently. Note that all commands that fetch content off
queues are specific to a given content class.
Client creates an exchange of each standard type and several queues that it binds to each
exchange. It must then successfully send each of the standard content types to each of the
available queues.
The queue name identifies the queue within the virtual host. Queue names must have a length
of between 1 and 255 characters inclusive, must start with a digit, letter or underscores
('_') character, and must be otherwise encoded in UTF-8.
This command 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-created queue to the default
exchange, which is an exchange of type 'direct' and use the queue name as the binding-key.
Client creates a new queue, and then without explicitly binding it to an exchange,
attempts to send a message through the default exchange binding, i.e. publish a message to
the empty exchange, with the queue name as binding-key.
The server SHOULD support a minimum of 256 queues per virtual host and ideally, impose no
limit except as defined by available resources.
Client attempts to create as many queues as it can until the server reports an error. The
resulting count must at least be 256.
Queue names starting with "amq." are reserved for pre-declared and standardized server
queues. A client MUST NOT attempt to declare a queue with a name that starts with "amq."
and the passive option set to zero.
A client attempts to create a queue with a name starting with "amq." and with the
passive option set to zero.
The alternate-exchange field specifies how messages on this queue should be treated when
they are rejected by a subscriber, or when they are orphaned by queue deletion. When
present, rejected or orphaned messages MUST be routed to the alternate-exchange. In all
cases the messages MUST be removed from the queue.
If the alternate-exchange is not empty and if the queue already exists with a different
alternate-exchange, then the declaration MUST result in an exception.
if the alternate-exchange does not match the name of any existing exchange on the
server, then an exception must be raised.
If set, the server will not create the queue. This field allows the client to assert the
presence of a queue without modifying the server state.
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.
Client declares an existing queue with the passive option and expects the command to
succeed. Client then attempts to declare a non-existent queue with the passive option,
and the server must close the session with the correct exception.
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 queue definition MUST survive the server losing all transient memory, e.g. a
machine restart.
Client creates a durable queue; server is then restarted. Client then attempts to send
message to the queue. The message should be successfully delivered.
The server MUST support both durable and transient queues.
A client creates two named queues, one durable and one transient.
The server MUST ignore the durable field if the queue already exists.
A client creates two named queues, one durable and one transient. The client then
attempts to declare the two queues using the same names again, but reversing the value
of the durable flag in each case. Verify that the queues still exist with the original
durable flag values.
Exclusive queues can only be used from one session at a time. Once a session
declares an exclusive queue, that queue cannot be used by any other session until the
declaring session closes.
The server MUST support both exclusive (private) and non-exclusive (shared) queues.
A client creates two named queues, one exclusive and one non-exclusive.
If the server receives a declare, bind, consume or get request for a queue that has been
declared as exclusive by an existing client session, it MUST raise an exception.
A client declares an exclusive named queue. A second client on a different session
attempts to declare a queue of the same name.
If this field is set and the exclusive field is also set, then the queue MUST be deleted
when the session closes.
If this field is set and the exclusive field is not set the queue is deleted when all
the consumers have finished using it. Last consumer can be cancelled either explicitly
or because its session is closed. If there was no consumer ever on the queue, it won't
be deleted.
The server MUST ignore the auto-delete field if the queue already exists.
A client creates two named queues, one as auto-delete and one explicit-delete. The
client then attempts to declare the two queues using the same names again, but reversing
the value of the auto-delete field in each case. Verify that the queues still exist with
the original auto-delete flag values.
A set of arguments for the declaration. The syntax and semantics of these arguments
depends on the server implementation. This field is ignored if passive is 1.
If the arguments field contains arguments which are not understood by the server,
it MUST raise an exception.
This command deletes a queue. When a queue is deleted any pending messages are sent to the
alternate-exchange if defined, or discarded if it is not.
Specifies the name of the queue to delete.
If the queue name in this command is empty, the server MUST raise an exception.
The queue must exist. If the client attempts to delete a non-existing queue the server
MUST raise an exception.
If set, the server will only delete the queue if it has no consumers. If the queue has
consumers the server does does not delete it but raises an exception instead.
The server MUST respect the if-unused flag when deleting a queue.
If set, the server will only delete the queue if it has no messages.
If the queue is not empty the server MUST raise an exception.
This command removes all messages from a queue. It does not cancel subscribers. Purged
messages are deleted without any formal "undo" mechanism.
A call to purge MUST result in an empty queue.
The server MUST NOT purge messages that have already been sent to a client but not yet
accepted.
The server MAY implement a purge queue or log that allows system administrators to recover
accidentally-purged messages. The server SHOULD NOT keep purged messages in the same
storage spaces as the live messages since the volumes of purged messages may get very
large.
Specifies the name of the queue to purge.
If the the queue name in this command is empty, the server MUST raise an exception.
The queue MUST exist. Attempting to purge a non-existing queue MUST cause an exception.
This command requests information about a queue.
This is sent in response to queue.query, and conveys the requested information about a
queue. If no queue with the specified name exists then none of the fields within the
returned result struct will be populated.
Reports the name of the queue.
Reports the number of messages in the queue.
Reports the number of subscribers for the queue.
The file class provides commands that support reliable file transfer. File messages have a
specific set of properties that are required for interoperability with file transfer
applications. File messages and acknowledgements are subject to session transactions. Note
that the file class does not provide message browsing commands; these are not compatible with
the staging model. Applications that need browsable file transfer should use Message content
and the Message class.
file = C:QOS S:QOS-OK
/ C:CONSUME S:CONSUME-OK
/ C:CANCEL
/ C:OPEN S:OPEN-OK C:STAGE content
/ S:OPEN C:OPEN-OK S:STAGE content
/ C:PUBLISH
/ S:DELIVER
/ S:RETURN
/ C:ACK
/ C:REJECT
The server MUST make a best-effort to hold file messages on a reliable storage mechanism.
The server MUST NOT discard a file message in case of a queue overflow. The server MUST use
the Session.Flow command to slow or stop a file message publisher when necessary.
The server MUST implement at least 2 priority levels for file messages, where priorities 0-4
and 5-9 are treated as two distinct levels. The server MAY implement up to 10 priority
levels.
The server MUST support both automatic and explicit acknowledgements on file content.
The return code. The AMQP return codes are defined by this enum.
The client attempted to transfer content larger than the server could accept.
The exchange cannot route a message, most likely due to an invalid routing key. Only
when the mandatory flag is set.
The exchange cannot deliver to a consumer when the immediate flag is set. As a result of
pending data on the queue or the absence of any consumers of the queue.
This command requests a specific quality of service. The QoS can be specified for the
current session or for all sessions on the connection. The particular properties and
semantics of a qos command always depend on the content class semantics. Though the qos
command could in principle apply to both peers, it is currently meaningful only for the
server.
The client can request that messages be sent in advance so that when the client finishes
processing a message, the following message is already held locally, rather than needing
to be sent within the session. Pre-fetching gives a performance improvement. This field
specifies the pre-fetch window size in octets. May be set to zero, meaning "no specific
limit". Note that other pre-fetch limits may still apply. The prefetch-size is ignored if
the no-ack option is set.
Specifies a pre-fetch window in terms of whole messages. This is compatible with some file
API implementations. This field may be used in combination with the prefetch-size field; a
message will only be sent in advance if both pre-fetch windows (and those at the session
and connection level) allow it. The prefetch-count is ignored if the no-ack option is set.
The server MAY send less data in advance than allowed by the client's specified
pre-fetch windows but it MUST NOT send more.
By default the QoS settings apply to the current session only. If this field is set, they
are applied to the entire connection.
This command tells the client that the requested QoS levels could be handled by the server.
The requested QoS applies to all active consumers until a new QoS is defined.
This command asks the server to start a "consumer", which is a transient request for
messages from a specific queue. Consumers last as long as the session they were created on,
or until the client cancels them.
The server SHOULD support at least 16 consumers per queue, unless the queue was declared
as private, and ideally, impose no limit except as defined by available resources.
Specifies the name of the queue to consume from.
If the queue name in this command is empty, the server MUST raise an exception.
Specifies the identifier for the consumer. The consumer tag is local to a connection, so
two clients can use the same consumer tags.
The tag MUST NOT refer to an existing consumer. If the client attempts to create two
consumers with the same non-empty tag the server MUST raise an exception.
The client MUST NOT specify a tag that is empty or blank.
Attempt to create a consumers with an empty tag.
If the no-local field is set the server will not send messages to the connection that
published them.
If this field is set the server does not expect acknowledgements for messages. That is,
when a message is delivered to the client the server automatically and silently
acknowledges it on behalf of the client. This functionality increases performance but at
the cost of reliability. Messages can get lost if a client dies before it can deliver them
to the application.
Request exclusive consumer access, meaning only this consumer can access the queue.
If the server cannot grant exclusive access to the queue when asked, - because there are
other consumers active - it MUST raise an exception.
If set, the server will not respond to the command. The client should not wait for a reply
command. If the server could not complete the command it will raise an exception.
A set of arguments for the consume. The syntax and semantics of these arguments depends on
the providers implementation.
This command provides the client with a consumer tag which it MUST use in commands that work
with the consumer.
Holds the consumer tag specified by the client or provided by the server.
This command cancels a consumer. This does not affect already delivered messages, but it
does mean the server will not send any more messages for that consumer.
the identifier of the consumer to be cancelled.
This command requests permission to start staging a message. Staging means sending the
message into a temporary area at the recipient end and then delivering the message by
referring to this temporary area. Staging is how the protocol handles partial file transfers
- if a message is partially staged and the connection breaks, the next time the sender
starts to stage it, it can restart from where it left off.
This is the staging identifier. This is an arbitrary string chosen by the sender. For
staging to work correctly the sender must use the same staging identifier when staging the
same message a second time after recovery from a failure. A good choice for the staging
identifier would be the SHA1 hash of the message properties data (including the original
filename, revised time, etc.).
The size of the content in octets. The recipient may use this information to allocate or
check available space in advance, to avoid "disk full" errors during staging of very large
messages.
The sender MUST accurately fill the content-size field. Zero-length content is
permitted.
This command confirms that the recipient is ready to accept staged data. If the message was
already partially-staged at a previous time the recipient will report the number of octets
already staged.
The amount of previously-staged content in octets. For a new message this will be zero.
The sender MUST start sending data from this octet offset in the message, counting from
zero.
The recipient MAY decide how long to hold partially-staged content and MAY implement
staging by always discarding partially-staged content. However if it uses the file
content type it MUST support the staging commands.
This command stages the message, sending the message content to the recipient from the octet
offset specified in the Open-Ok command.
This command publishes a staged file message to a specific exchange. The file message will
be routed to queues as defined by the exchange configuration and distributed to any active
consumers when the transaction, if any, is committed.
Specifies the name of the exchange to publish to. The exchange name can be empty, meaning
the default exchange. If the exchange name is specified, and that exchange does not exist,
the server will raise an exception.
The server MUST accept a blank exchange name to mean the default exchange.
The exchange MAY refuse file content in which case it MUST send an exception.
Specifies the routing key for the message. The routing key is used for routing messages
depending on the exchange configuration.
This flag tells the server how to react if the message cannot be routed to a queue. If
this flag is set, the server will return an unroutable message with a Return command. If
this flag is zero, the server silently drops the message.
The server SHOULD implement the mandatory flag.
This flag tells the server how to react if the message cannot be routed to a queue
consumer immediately. If this flag is set, the server will return an undeliverable message
with a Return command. If this flag is zero, the server will queue the message, but with
no guarantee that it will ever be consumed.
The server SHOULD implement the immediate flag.
This is the staging identifier of the message to publish. The message must have been
staged. Note that a client can send the Publish command asynchronously without waiting for
staging to finish.
This command returns an undeliverable message that was published with the "immediate" flag
set, or an unroutable message published with the "mandatory" flag set. The reply code and
text provide information about the reason that the message was undeliverable.
This text can be logged as an aid to resolving issues.
Specifies the name of the exchange that the message was originally published to.
Specifies the routing key name specified when the message was published.
This command delivers a staged file message to the client, via a consumer. In the
asynchronous message delivery model, the client starts a consumer using the consume command,
then the server responds with Deliver commands as and when messages arrive for that
consumer.
The server SHOULD track the number of times a message has been delivered to clients and
when a message is redelivered a certain number of times - e.g. 5 times - without being
acknowledged, the server SHOULD consider the message to be non-processable (possibly
causing client applications to abort), and move the message to a dead letter queue.
The server-assigned and session-specific delivery tag
The server MUST NOT use a zero value for delivery tags. Zero is reserved for client use,
meaning "all messages so far received".
This boolean flag indicates that the message may have been previously delivered to this
or another client.
Specifies the name of the exchange that the message was originally published to.
Specifies the routing key name specified when the message was published.
This is the staging identifier of the message to deliver. The message must have been
staged. Note that a server can send the Deliver command asynchronously without waiting for
staging to finish.
This command acknowledges one or more messages delivered via the Deliver command. The client
can ask to confirm a single message or a set of messages up to and including a specific
message.
The identifier of the message being acknowledged
The delivery tag is valid only within the session from which the message was received.
i.e. A client MUST NOT receive a message on one session and then acknowledge it on
another.
If set to 1, the delivery tag is treated as "up to and including", so that the client can
acknowledge multiple messages with a single command. If set to zero, the delivery tag
refers to a single message. If the multiple field is 1, and the delivery tag is zero,
tells the server to acknowledge all outstanding messages.
The server MUST validate that a non-zero delivery-tag refers to an delivered message,
and raise an exception if this is not the case.
This command allows a client to reject a message. It can be used to return untreatable
messages to their original queue. Note that file content is staged before delivery, so the
client will not use this command to interrupt delivery of a large message.
The server SHOULD interpret this command as meaning that the client is unable to process
the message at this time.
A client MUST NOT use this command as a means of selecting messages to process. A rejected
message MAY be discarded or dead-lettered, not necessarily passed to another client.
the identifier of the message to be rejected
The delivery tag is valid only within the session from which the message was received.
i.e. A client MUST NOT receive a message on one session and then reject it on another.
If this field is zero, the message will be discarded. If this bit is 1, the server will
attempt to requeue the message.
The server MUST NOT deliver the message to the same client within the context of the
current session. The recommended strategy is to attempt to deliver the message to an
alternative consumer, and if that is not possible, to move the message to a dead-letter
queue. The server MAY use more sophisticated tracking to hold the message on the queue
and redeliver it to the same client at a later stage.
The stream class provides commands that support multimedia streaming. The stream class uses
the following semantics: one message is one packet of data; delivery is unacknowledged and
unreliable; the consumer can specify quality of service parameters that the server can try to
adhere to; lower-priority messages may be discarded in favor of high priority messages.
stream = C:QOS S:QOS-OK
/ C:CONSUME S:CONSUME-OK
/ C:CANCEL
/ C:PUBLISH content
/ S:RETURN
/ S:DELIVER content
The server SHOULD discard stream messages on a priority basis if the queue size exceeds some
configured limit.
The server MUST implement at least 2 priority levels for stream messages, where priorities
0-4 and 5-9 are treated as two distinct levels. The server MAY implement up to 10 priority
levels.
The server MUST implement automatic acknowledgements on stream content. That is, as soon as
a message is delivered to a client via a Deliver command, the server must remove it from the
queue.
The return code. The AMQP return codes are defined by this enum.
The client attempted to transfer content larger than the server could accept.
The exchange cannot route a message, most likely due to an invalid routing key. Only
when the mandatory flag is set.
The exchange cannot deliver to a consumer when the immediate flag is set. As a result of
pending data on the queue or the absence of any consumers of the queue.
This command requests a specific quality of service. The QoS can be specified for the
current session or for all sessions on the connection. The particular properties and
semantics of a qos command always depend on the content class semantics. Though the qos
command could in principle apply to both peers, it is currently meaningful only for the
server.
The client can request that messages be sent in advance so that when the client finishes
processing a message, the following message is already held locally, rather than needing
to be sent within the session. Pre-fetching gives a performance improvement. This field
specifies the pre-fetch window size in octets. May be set to zero, meaning "no specific
limit". Note that other pre-fetch limits may still apply.
Specifies a pre-fetch window in terms of whole messages. This field may be used in
combination with the prefetch-size field; a message will only be sent in advance if both
pre-fetch windows (and those at the session and connection level) allow it.
Specifies a desired transfer rate in octets per second. This is usually determined by the
application that uses the streaming data. A value of zero means "no limit", i.e. as
rapidly as possible.
The server MAY ignore the pre-fetch values and consume rates, depending on the type of
stream and the ability of the server to queue and/or reply it.
The server MAY drop low-priority messages in favor of high-priority messages.
By default the QoS settings apply to the current session only. If this field is set, they
are applied to the entire connection.
This command tells the client that the requested QoS levels could be handled by the server.
The requested QoS applies to all active consumers until a new QoS is defined.
This command asks the server to start a "consumer", which is a transient request for
messages from a specific queue. Consumers last as long as the session they were created on,
or until the client cancels them.
The server SHOULD support at least 16 consumers per queue, unless the queue was declared
as private, and ideally, impose no limit except as defined by available resources.
Streaming applications SHOULD use different sessions to select different streaming
resolutions. AMQP makes no provision for filtering and/or transforming streams except on
the basis of priority-based selective delivery of individual messages.
Specifies the name of the queue to consume from.
If the queue name in this command is empty, the server MUST raise an exception.
Specifies the identifier for the consumer. The consumer tag is local to a connection, so
two clients can use the same consumer tags.
The tag MUST NOT refer to an existing consumer. If the client attempts to create two
consumers with the same non-empty tag the server MUST raise an exception.
The client MUST NOT specify a tag that is empty or blank.
Attempt to create a consumers with an empty tag.
If the no-local field is set the server will not send messages to the connection that
published them.
Request exclusive consumer access, meaning only this consumer can access the queue.
If the server cannot grant exclusive access to the queue when asked, - because there are
other consumers active - it MUST raise an exception with return code 405
(resource locked).
If set, the server will not respond to the command. The client should not wait for a reply
command. If the server could not complete the command it will raise an exception.
A set of arguments for the consume. The syntax and semantics of these arguments depends on
the providers implementation.
This command provides the client with a consumer tag which it may use in commands that work
with the consumer.
Holds the consumer tag specified by the client or provided by the server.
This command cancels a consumer. Since message delivery is asynchronous the client may
continue to receive messages for a short while after cancelling a consumer. It may process
or discard these as appropriate.
This command publishes a message to a specific exchange. The message will be routed to
queues as defined by the exchange configuration and distributed to any active consumers as
appropriate.
Specifies the name of the exchange to publish to. The exchange name can be empty, meaning
the default exchange. If the exchange name is specified, and that exchange does not exist,
the server will raise an exception.
The server MUST accept a blank exchange name to mean the default exchange.
The exchange MAY refuse stream content in which case it MUST respond with an exception.
Specifies the routing key for the message. The routing key is used for routing messages
depending on the exchange configuration.
This flag tells the server how to react if the message cannot be routed to a queue. If
this flag is set, the server will return an unroutable message with a Return command. If
this flag is zero, the server silently drops the message.
The server SHOULD implement the mandatory flag.
This flag tells the server how to react if the message cannot be routed to a queue
consumer immediately. If this flag is set, the server will return an undeliverable message
with a Return command. If this flag is zero, the server will queue the message, but with
no guarantee that it will ever be consumed.
The server SHOULD implement the immediate flag.
This command returns an undeliverable message that was published with the "immediate" flag
set, or an unroutable message published with the "mandatory" flag set. The reply code and
text provide information about the reason that the message was undeliverable.
The localized reply text. This text can be logged as an aid to resolving issues.
Specifies the name of the exchange that the message was originally published to.
Specifies the routing key name specified when the message was published.
This command delivers a message to the client, via a consumer. In the asynchronous message
delivery model, the client starts a consumer using the Consume command, then the server
responds with Deliver commands as and when messages arrive for that consumer.
The server-assigned and session-specific delivery tag
The delivery tag is valid only within the session from which the message was received.
i.e. A client MUST NOT receive a message on one session and then acknowledge it on
another.
Specifies the name of the exchange that the message was originally published to.
Specifies the name of the queue that the message came from. Note that a single session can
start many consumers on different queues.