diff --git a/.gitignore b/.gitignore index 73e172cf7095e2e4f5f721c1586379570d42d703..f9d49a43ee06c8fff3cafedeb1a9cb8e2480eada 100644 --- a/.gitignore +++ b/.gitignore @@ -36,7 +36,7 @@ var/ # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec -resources/amqp0-9-1.xml +amqp0-9-1.extended.xml # Installer logs pip-log.txt pip-delete-this-directory.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index be2ea144546b609e4f0c8e3325a0d4e3c3a5690e..244482aefe38f9e59fdb21ef17f21ca412270329 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,6 @@ The changelog is kept as [release notes](https://github.com/smok-serwis/coolamqp on GitHub. This file serves to only note what changes have been made so far, between releases. -# v1.2.17 +# v1.3.0 -* can support building from XML not containing Connection.Blocked and Connection.Unblocked +* updated to use latest RabbitMQ AMQP 0-9-1 definition from the RabbitMQ's website diff --git a/README.md b/README.md index 0ec57f9a1eb19697e29433b7e079950aa4b99de3..25fb154e310cd7e64ad7f5a050c864fe0da9c945 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,10 @@ Why CoolAMQP? * AMQP 0.9.1 client that's native Python * heavily optimized for speed * geared towards interfacing with [RabbitMQ](https://www.rabbitmq.com/ - * supports custom RabbitMQ commands and Connection.Blocked and Connection.Unblocked + * supports custom RabbitMQ commands, such as + * [Connection blocking](https://www.rabbitmq.com/docs/connection-blocked) + * [Publisher confirms](https://www.rabbitmq.com/docs/confirms#publisher-confirms) + * [Negative Acknowledgements](https://www.rabbitmq.com/docs/nack) * traceable using [opentracing](https://opentracing.io/) Documentation (WIP) is available at [Read the Docs](http://coolamqp.readthedocs.io/). @@ -44,9 +47,9 @@ Enjoy! _Watch out for memoryviews!_ They're here to stay. -[Short'n'sweet contributing guide](CONTRIBUTING.md) -[Change log for past versions](https://github.com/smok-serwis/coolamqp/releases/) -[Change log in this, unreleased version](CHANGELOG.md) +* [Short'n'sweet contributing guide](CONTRIBUTING.md) +* [Change log for past versions](https://github.com/smok-serwis/coolamqp/releases/) +* [Change log in this, unreleased version](CHANGELOG.md) ## Notes @@ -85,8 +88,8 @@ A series of unit tests that need an AMQP server listening. ### [compile_definitions](compile_definitions/) -A tool to generate [definitions.py](coolamqp/framing/definitions.py) -from [amqp-0-9-1.xml](resources/amqp0-9-1.xml) +A tool to generate [definitions.py](coolamqp/framing/definitions.py) from the AMQP specification +[XML](https://www.rabbitmq.com/resources/specs/amqp0-9-1.extended.xml). In order to compile the definitions: @@ -95,18 +98,10 @@ In order to compile the definitions: ```python python -m compile_definitions ``` -* you can alternatively perform - ```python - python -m compile_definitions --no-connection-blocked - ``` - To generate a variant not supporting Connection.Blocked and Connection.Unblocked commands + and you're all set. The only files modified is [definitions.py](coolamqp/framing/definitions.py). -### [resources](resources/) - -A downloaded from OASIS machine-readable AMQP 0.9.1 specification. - ### [docs](docs/) Sources for the documentation, available diff --git a/compile_definitions/__main__.py b/compile_definitions/__main__.py index 0df419359f11a292794c9652597e462827a325a7..124f786ff83fd69f816764f8b559a8f6ff941585 100644 --- a/compile_definitions/__main__.py +++ b/compile_definitions/__main__.py @@ -37,12 +37,12 @@ TYPE_TRANSLATOR = { def get_xml(xml_file): """Download XML definition from OASIS's website""" - r = urlopen('https://raw.githubusercontent.com/postwait/node-amqp/master/amqp-0-9-1-rabbit.xml') + r = urlopen(f'https://www.rabbitmq.com/resources/specs/amqp0-9-1.extended.xml') with open(xml_file, 'wb') as out: out.write(r.read()) -def compile_definitions(xml_file='resources/amqp0-9-1.xml', +def compile_definitions(xml_file='amqp0-9-1.extended.xml', out_file='coolamqp/framing/definitions.py'): """parse resources/amqp-0-9-1.xml into """ if not os.path.exists(xml_file): @@ -591,12 +591,7 @@ REPLIES_FOR = {\n''') if __name__ == '__main__': - if '--no-connection-blocked' in sys.argv: - xml_file = 'resources/amqp0-9-1.xml' - print('Compiling without Connection.Blocked') - else: - xml_file = 'resources/amqp0-9-1.extended.xml' - compile_definitions(xml_file=xml_file) + compile_definitions() proc = subprocess.check_output(['yapf', 'coolamqp/framing/definitions.py']) with open('coolamqp/framing/definitions.py', 'wb') as f_out: f_out.write(proc) diff --git a/compile_definitions/utilities.py b/compile_definitions/utilities.py index b0f12e7b0d63003837eeb830819b88f5631e64f8..08820053026a288651821516339e94498ef915b4 100644 --- a/compile_definitions/utilities.py +++ b/compile_definitions/utilities.py @@ -73,12 +73,9 @@ def f_repr(p, sop=six.text_type): @as_unicode def format_method_class_name(method_name): - if '-' in method_name: - i = method_name.find('-') - return method_name[0:i].capitalize() + method_name[ - i + 1].upper() + method_name[i + 2:] - else: - return method_name.capitalize() + opts = method_name.split('-') + opts = [opt.capitalize() for opt in opts] + return ''.join(opts) @as_unicode diff --git a/coolamqp/__init__.py b/coolamqp/__init__.py index e0d04eb1b29cc0a7ffc64e15c9e7c7cc8e8906be..19b4f1d6059df250d910fb85ab3ff5bc562489d1 100644 --- a/coolamqp/__init__.py +++ b/coolamqp/__init__.py @@ -1 +1 @@ -__version__ = '1.2.17a1' +__version__ = '1.3.0' diff --git a/coolamqp/attaches/publisher.py b/coolamqp/attaches/publisher.py index 39661dc7d444bd6ed81a163608a673000a4ce902..3fdd0266ecd5fff8f24a393136d88fd26b422d75 100644 --- a/coolamqp/attaches/publisher.py +++ b/coolamqp/attaches/publisher.py @@ -24,15 +24,10 @@ from coolamqp.framing.frames import AMQPMethodFrame, AMQPBodyFrame, \ try: # these extensions will be available from coolamqp.framing.definitions import ConfirmSelect, ConfirmSelectOk, \ - BasicNack, ChannelFlow, ChannelFlowOk + BasicNack, ChannelFlow, ChannelFlowOk, ConnectionUnblocked, ConnectionBlocked except ImportError: pass -try: - from coolamqp.framing.definitions import ConnectionUnblocked, ConnectionBlocked -except ImportError: - ConnectionBlocked, ConnectionUnblocked = None, None - from coolamqp.attaches.channeler import Channeler, ST_ONLINE, ST_OFFLINE from coolamqp.uplink import PUBLISHER_CONFIRMS, MethodWatch, FailWatch from coolamqp.attaches.utils import AtomicTagger, FutureConfirmableRejectable, \ @@ -113,9 +108,9 @@ class Publisher(Channeler, Synchronized): connection.watch(FailWatch(self.on_fail)) def on_connection_blocked(self, payload): - if ConnectionBlocked is not None and isinstance(payload, ConnectionBlocked): + if isinstance(payload, ConnectionBlocked): self.blocked = True - elif ConnectionUnblocked is not None and isinstance(payload, ConnectionUnblocked): + elif isinstance(payload, ConnectionUnblocked): self.blocked = False if self.content_flow: @@ -326,10 +321,9 @@ class Publisher(Channeler, Synchronized): mw = self.watch_for_method(ChannelFlow, self.on_flow_control) mw.oneshot = False - if ConnectionBlocked is not None: - mw = self.connection.watch_for_method(0, (ConnectionBlocked, ConnectionUnblocked), - self.on_connection_blocked) - mw.oneshot = False + mw = self.connection.watch_for_method(0, (ConnectionBlocked, ConnectionUnblocked), + self.on_connection_blocked) + mw.oneshot = False if self.mode == Publisher.MODE_CNPUB: self.method_and_watch(ConfirmSelect(False), ConfirmSelectOk, diff --git a/coolamqp/clustering/single.py b/coolamqp/clustering/single.py index d799e04bcb9d2b245d89df04df48f423b8fdcbeb..cc86b45a28e7c7c924b162b084484d4f9879aaa7 100644 --- a/coolamqp/clustering/single.py +++ b/coolamqp/clustering/single.py @@ -4,10 +4,7 @@ from __future__ import print_function, absolute_import, division import logging import typing as tp -try: - from coolamqp.framing.definitions import ConnectionUnblocked, ConnectionBlocked -except ImportError: - ConnectionBlocked, ConnectionUnblocked = None, None +from coolamqp.framing.definitions import ConnectionUnblocked, ConnectionBlocked from coolamqp.objects import Callable from coolamqp.uplink import Connection @@ -61,15 +58,13 @@ class SingleNodeReconnector(object): self.connection.finalize.add(self.on_fail) # Register the on-blocking watches - if ConnectionBlocked is not None: - mw = MethodWatch(0, (ConnectionBlocked,), lambda: self.on_blocked(True)) - mw.oneshot = False - self.connection.watch(mw) - - if ConnectionUnblocked is not None: - mw = MethodWatch(0, (ConnectionUnblocked,), lambda: self.on_blocked(False)) - mw.oneshot = False - self.connection.watch(mw) + mw = MethodWatch(0, (ConnectionBlocked,), lambda: self.on_blocked(True)) + mw.oneshot = False + self.connection.watch(mw) + + mw = MethodWatch(0, (ConnectionUnblocked,), lambda: self.on_blocked(False)) + mw.oneshot = False + self.connection.watch(mw) def _on_fail(self): if self.terminating: diff --git a/coolamqp/framing/definitions.py b/coolamqp/framing/definitions.py index 2e72d94c19824adc59dfe0e275def0011d191bd7..68278f4291aa0e4cf4f3554639a284ad0483d875 100644 --- a/coolamqp/framing/definitions.py +++ b/coolamqp/framing/definitions.py @@ -64,25 +64,25 @@ FRAME_END = 206 FRAME_END_BYTE = b'\xce' # Indicates that the method completed successfully. This reply code is -# reserved for future use - the current protocol design does not use -# positive +# reserved for future use - the current protocol design does not use positive # confirmation and reply codes are sent only in case of an error. REPLY_SUCCESS = 200 REPLY_SUCCESS_BYTE = b'\xc8' -# The client attempted to transfer content larger than the server -# could accept +# The client attempted to transfer content larger than the server could accept # at the present time. The client may retry at a later time. CONTENT_TOO_LARGE = 311 -# When the exchange cannot deliver to a consumer when the immediate -# flag is +# Returned when RabbitMQ sends back with 'basic.return' when a +# 'mandatory' message cannot be delivered to any queue. +NO_ROUTE = 312 + +# When 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. NO_CONSUMERS = 313 -# An operator intervened to close the connection for some reason. The -# client +# An operator intervened to close the connection for some reason. The client # may retry at some later date. CONNECTION_FORCED = 320 @@ -93,58 +93,45 @@ INVALID_PATH = 402 # access due to security settings. ACCESS_REFUSED = 403 -# The client attempted to work with a server entity that does not -# exist. +# The client attempted to work with a server entity that does not exist. NOT_FOUND = 404 # The client attempted to work with a server entity to which it has no # access because another client is working with it. RESOURCE_LOCKED = 405 -# The client requested a method that was not allowed because some -# precondition +# The client requested a method that was not allowed because some precondition # failed. PRECONDITION_FAILED = 406 -# The sender sent a malformed frame that the recipient could not -# decode. +# The sender sent a malformed frame that the recipient could not decode. # This strongly implies a programming error in the sending peer. FRAME_ERROR = 501 -# The sender sent a frame that contained illegal values for one or -# more -# fields. This strongly implies a programming error in the sending -# peer. +# The sender sent a frame that contained illegal values for one or more +# fields. This strongly implies a programming error in the sending peer. SYNTAX_ERROR = 502 -# The client sent an invalid sequence of frames, attempting to perform -# an -# operation that was considered invalid by the server. This usually -# implies +# The client sent an invalid sequence of frames, attempting to perform an +# operation that was considered invalid by the server. This usually implies # a programming error in the client. COMMAND_INVALID = 503 -# The client attempted to work with a channel that had not been -# correctly +# The client attempted to work with a channel that had not been correctly # opened. This most likely indicates a fault in the client layer. CHANNEL_ERROR = 504 -# The peer sent a frame that was not expected, usually in the context -# of -# a content header and body. This strongly indicates a fault in the -# peer's +# The peer sent a frame that was not expected, usually in the context of +# a content header and body. This strongly indicates a fault in the peer's # content processing. UNEXPECTED_FRAME = 505 -# The server could not complete the method because it lacked -# sufficient -# resources. This may be due to the client creating too many of some -# type +# The server could not complete the method because it lacked sufficient +# resources. This may be due to the client creating too many of some type # of entity. RESOURCE_ERROR = 506 -# The client tried to work with some entity in a manner that is -# prohibited +# The client tried to work with some entity in a manner that is prohibited # by the server, due to security settings or by some other criteria. NOT_ALLOWED = 530 @@ -152,15 +139,13 @@ NOT_ALLOWED = 530 # server. NOT_IMPLEMENTED = 540 -# The server could not complete the method because of an internal -# error. -# The server may require intervention by an operator in order to -# resume +# The server could not complete the method because of an internal error. +# The server may require intervention by an operator in order to resume # normal operations. INTERNAL_ERROR = 541 SOFT_ERRORS = [ - CONTENT_TOO_LARGE, NO_CONSUMERS, ACCESS_REFUSED, NOT_FOUND, + CONTENT_TOO_LARGE, NO_ROUTE, NO_CONSUMERS, ACCESS_REFUSED, NOT_FOUND, RESOURCE_LOCKED, PRECONDITION_FAILED ] HARD_ERRORS = [ @@ -199,9 +184,8 @@ DOMAIN_TO_BASIC_TYPE = { class Connection(AMQPClass): """ - The connection class provides methods for a client to establish a + The connection class provides methods for a client to establish a network connection to - network connection to a server, and for both peers to operate the connection thereafter. """ NAME = u'connection' @@ -210,10 +194,13 @@ class Connection(AMQPClass): class ConnectionBlocked(AMQPMethodPayload): """ - This method indicates that a connection has been blocked + Indicate that connection is blocked + This method indicates that a connection has been blocked and does not accept new publishes. + :param reason: Block reason + The reason the connection was blocked. :type reason: binary type (max length 255) (shortstr in AMQP) """ __slots__ = (u'reason', ) @@ -270,25 +257,19 @@ class ConnectionClose(AMQPMethodPayload): """ Request a connection close - This method indicates that the sender wants to close the - connection. This may be - due to internal conditions (e.g. a forced shut-down) or due to - an error handling - a specific method, i.e. an exception. When a close is due to an - exception, the - sender provides the class and method id of the method which - caused the exception. + This method indicates that the sender wants to close the connection. This may be + due to internal conditions (e.g. a forced shut-down) or due to an error handling + a specific method, i.e. an exception. When a close is due to an exception, the + sender provides the class and method id of the method which caused the exception. :type reply_code: int, 16 bit unsigned (reply-code in AMQP) :type reply_text: binary type (max length 255) (reply-text in AMQP) :param class_id: Failing method class - When the close is provoked by a method exception, this is - the class of the + When the close is provoked by a method exception, this is the class of the method. :type class_id: int, 16 bit unsigned (class-id in AMQP) :param method_id: Failing method id - When the close is provoked by a method exception, this is - the ID of the method. + When the close is provoked by a method exception, this is the ID of the method. :type method_id: int, 16 bit unsigned (method-id in AMQP) """ __slots__ = ( @@ -361,10 +342,8 @@ class ConnectionCloseOk(AMQPMethodPayload): """ Confirm a connection close - This method confirms a Connection.Close method and tells the - recipient that it is - safe to release resources for the connection and close the - socket. + This method confirms a Connection.Close method and tells the recipient that it is + safe to release resources for the connection and close the socket. """ __slots__ = () @@ -399,14 +378,10 @@ class ConnectionOpen(AMQPMethodPayload): """ Open connection to virtual host - This method opens a connection to a virtual host, which is a - collection of - resources, and acts to separate multiple application domains - within a server. - The server may apply arbitrary limits per virtual host, such as - the number - of each type of entity that may be used, per connection and/or - in total. + This method opens a connection to a virtual host, which is a collection of + resources, and acts to separate multiple application domains within a server. + The server may apply arbitrary limits per virtual host, such as the number + of each type of entity that may be used, per connection and/or in total. :param virtual_host: Virtual host name The name of the virtual host to work with. @@ -474,8 +449,7 @@ class ConnectionOpenOk(AMQPMethodPayload): """ Signal that connection is ready - This method signals to the client that the connection is ready - for use. + This method signals to the client that the connection is ready for use. """ __slots__ = () @@ -518,42 +492,31 @@ class ConnectionStart(AMQPMethodPayload): """ Start connection negotiation - This method starts the connection negotiation process by telling - the client the - protocol version that the server proposes, along with a list of - security mechanisms + This method starts the connection negotiation process by telling the client the + protocol version that the server proposes, along with a list of security mechanisms which the client can use for authentication. :param version_major: Protocol major version - The major version number can take any value from 0 to 99 as - defined in the + The major version number can take any value from 0 to 99 as defined in the AMQP specification. :type version_major: int, 8 bit unsigned (octet in AMQP) :param version_minor: Protocol minor version - The minor version number can take any value from 0 to 99 as - defined in the + The minor version number can take any value from 0 to 99 as defined in the AMQP specification. :type version_minor: int, 8 bit unsigned (octet in AMQP) :param server_properties: Server properties - The properties SHOULD contain at least these fields: - "host", specifying the - server host name or address, "product", giving the name - of the server product, - "version", giving the name of the server version, - "platform", giving the name - of the operating system, "copyright", if appropriate, - and "information", giving + 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. :type server_properties: table. See coolamqp.uplink.framing.field_table (peer-properties in AMQP) :param mechanisms: Available security mechanisms - A list of the security mechanisms that the server supports, - delimited by spaces. + A list of the security mechanisms that the server supports, delimited by spaces. :type mechanisms: binary type (longstr in AMQP) :param locales: Available message locales - A list of the message locales that the server supports, - delimited by spaces. The - locale defines the language in which the server will send - reply texts. + A list of the message locales that the server supports, delimited by spaces. The + locale defines the language in which the server will send reply texts. :type locales: binary type (longstr in AMQP) """ __slots__ = ( @@ -645,15 +608,12 @@ class ConnectionSecure(AMQPMethodPayload): """ Security mechanism challenge - The SASL protocol works by exchanging challenges and responses - until both peers have - received sufficient information to authenticate each other. This - method challenges + The SASL protocol works by exchanging challenges and responses until both peers have + received sufficient information to authenticate each other. This method challenges the client to provide more information. :param challenge: Security challenge data - Challenge information, a block of opaque binary data passed - to the security + Challenge information, a block of opaque binary data passed to the security mechanism. :type challenge: binary type (longstr in AMQP) """ @@ -714,27 +674,21 @@ class ConnectionStartOk(AMQPMethodPayload): This method selects a SASL security mechanism. :param client_properties: Client properties - The properties SHOULD contain at least these fields: - "product", giving the name - of the client product, "version", giving the name of the - client version, "platform", - giving the name of the operating system, "copyright", if - appropriate, and + 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. :type client_properties: table. See coolamqp.uplink.framing.field_table (peer-properties in AMQP) :param mechanism: Selected security mechanism - A single security mechanisms selected by the client, which - must be one of those + A single security mechanisms selected by the client, which must be one of those specified by the server. :type mechanism: binary type (max length 255) (shortstr in AMQP) :param response: Security response data - A block of opaque data passed to the security mechanism. The - contents of this + A block of opaque data passed to the security mechanism. The contents of this data are defined by the SASL security mechanism. :type response: binary type (longstr in AMQP) :param locale: Selected message locale - A single message locale selected by the client, which must - be one of those + A single message locale selected by the client, which must be one of those specified by the server. :type locale: binary type (max length 255) (shortstr in AMQP) """ @@ -825,13 +779,11 @@ class ConnectionSecureOk(AMQPMethodPayload): """ Security mechanism response - This method attempts to authenticate, passing a block of SASL - data for the security + This method attempts to authenticate, passing a block of SASL data for the security mechanism at the server side. :param response: Security response data - A block of opaque data passed to the security mechanism. The - contents of this + A block of opaque data passed to the security mechanism. The contents of this data are defined by the SASL security mechanism. :type response: binary type (longstr in AMQP) """ @@ -889,28 +841,21 @@ class ConnectionTune(AMQPMethodPayload): """ Propose connection tuning parameters - This method proposes a set of connection configuration values to - the client. The + This method proposes a set of connection configuration values to the client. The client can accept and/or adjust these. :param channel_max: Proposed maximum channels - Specifies highest channel number that the server permits. - Usable channel numbers - are in the range 1..channel-max. Zero indicates no specified - limit. + Specifies highest channel number that the server permits. Usable channel numbers + are in the range 1..channel-max. Zero indicates no specified limit. :type channel_max: int, 16 bit unsigned (short in AMQP) :param frame_max: Proposed maximum frame size - The largest frame size that the server proposes for the - connection, including - frame header and end-byte. The client can negotiate a lower - value. Zero means - that the server does not impose any specific limit but may - reject very large + The largest frame size that the server proposes for the connection, including + frame header and end-byte. The client can negotiate a lower value. Zero means + that the server does not impose any specific limit but may reject very large frames if it cannot allocate resources for them. :type frame_max: int, 32 bit unsigned (long in AMQP) :param heartbeat: Desired heartbeat delay - The delay, in seconds, of the connection heartbeat that the - server wants. + The delay, in seconds, of the connection heartbeat that the server wants. Zero means the server does not want a heartbeat. :type heartbeat: int, 16 bit unsigned (short in AMQP) """ @@ -975,29 +920,21 @@ class ConnectionTuneOk(AMQPMethodPayload): """ Negotiate connection tuning parameters - This method sends the client's connection tuning parameters to - the server. - Certain fields are negotiated, others provide capability - information. + This method sends the client's connection tuning parameters to the server. + Certain fields are negotiated, others provide capability information. :param channel_max: Negotiated maximum channels - The maximum total number of channels that the client will - use per connection. + The maximum total number of channels that the client will use per connection. :type channel_max: int, 16 bit unsigned (short in AMQP) :param frame_max: Negotiated maximum frame size - The largest frame size that the client and server will use - for the connection. - Zero means that the client does not impose any specific - limit but may reject - very large frames if it cannot allocate resources for them. - Note that the - frame-max limit applies principally to content frames, where - large contents can + The largest frame size that the client and server will use for the connection. + Zero means that the client does not impose any specific limit but may reject + very large frames if it cannot allocate resources for them. Note that the + frame-max limit applies principally to content frames, where large contents can be broken into frames of arbitrary size. :type frame_max: int, 32 bit unsigned (long in AMQP) :param heartbeat: Desired heartbeat delay - The delay, in seconds, of the connection heartbeat that the - client wants. Zero + The delay, in seconds, of the connection heartbeat that the client wants. Zero means the client does not want a heartbeat. :type heartbeat: int, 16 bit unsigned (short in AMQP) """ @@ -1058,10 +995,87 @@ class ConnectionTuneOk(AMQPMethodPayload): return cls(channel_max, frame_max, heartbeat) +class ConnectionUpdateSecret(AMQPMethodPayload): + """ + Update secret + + This method updates the secret used to authenticate this connection. It is used + when secrets have an expiration date and need to be renewed, like OAuth 2 tokens. + + :param new_secret: New secret + The new secret. + :type new_secret: binary type (longstr in AMQP) + :param reason: Reason + The reason for the secret update. + :type reason: binary type (max length 255) (shortstr in AMQP) + """ + __slots__ = ( + u'new_secret', + u'reason', + ) + + NAME = u'connection.update-secret' + + INDEX = (10, 70) # (Class ID, Method ID) + BINARY_HEADER = b'\x00\x0A\x00\x46' # CLASS ID + METHOD ID + + SENT_BY_CLIENT, SENT_BY_SERVER = True, False + + IS_SIZE_STATIC = False # this means that argument part has always the same length + IS_CONTENT_STATIC = False # this means that argument part has always the same content + + # See constructor pydoc for details + FIELDS = [ + Field(u'new-secret', u'longstr', u'longstr', reserved=False), + Field(u'reason', u'shortstr', u'shortstr', reserved=False), + ] + + def __repr__(self): # type: () -> str + """ + Convert the frame to a Python-representable string + + :return: Python string representation + """ + return 'ConnectionUpdateSecret(%s)' % (', '.join( + map(to_repr, [self.new_secret, self.reason]))) + + def __init__(self, new_secret, reason): + """ + Create frame connection.update-secret + """ + self.new_secret = new_secret + self.reason = reason + + def write_arguments(self, buf): # type: (tp.BinaryIO) -> None + buf.write(STRUCT_I.pack(len(self.new_secret))) + buf.write(self.new_secret) + buf.write(STRUCT_B.pack(len(self.reason))) + buf.write(self.reason) + + def get_size(self): # type: () -> int + return 5 + len(self.new_secret) + len(self.reason) + + @classmethod + def from_buffer( + cls, buf, + start_offset): # type: (buffer, int) -> ConnectionUpdateSecret + offset = start_offset + s_len, = STRUCT_L.unpack_from(buf, offset) + offset += 4 + new_secret = buf[offset:offset + s_len] + offset += s_len + s_len, = STRUCT_B.unpack_from(buf, offset) + offset += 1 + reason = buf[offset:offset + s_len] + offset += s_len + return cls(new_secret, reason) + + class ConnectionUnblocked(AMQPMethodPayload): """ - This method indicates that a connection has been unblocked + Indicate that connection is unblocked + This method indicates that a connection has been unblocked and now accepts publishes. """ @@ -1094,11 +1108,46 @@ class ConnectionUnblocked(AMQPMethodPayload): return cls() +class ConnectionUpdateSecretOk(AMQPMethodPayload): + """ + Update secret response + + This method confirms the updated secret is valid. + + """ + __slots__ = () + + NAME = u'connection.update-secret-ok' + + INDEX = (10, 71) # (Class ID, Method ID) + BINARY_HEADER = b'\x00\x0A\x00\x47' # CLASS ID + METHOD ID + + SENT_BY_CLIENT, SENT_BY_SERVER = False, True + + IS_SIZE_STATIC = True # this means that argument part has always the same length + IS_CONTENT_STATIC = True # this means that argument part has always the same content + STATIC_CONTENT = b'\x00\x00\x00\x04\x00\x0A\x00\x47\xCE' # spans LENGTH, CLASS ID, METHOD ID, ....., FRAME_END + + def __repr__(self): # type: () -> str + """ + Convert the frame to a Python-representable string + + :return: Python string representation + """ + return 'ConnectionUpdateSecretOk(%s)' % (', '.join(map(to_repr, []))) + + @classmethod + def from_buffer( + cls, buf, + start_offset): # type: (buffer, int) -> ConnectionUpdateSecretOk + offset = start_offset + return cls() + + class Channel(AMQPClass): """ - The channel class provides methods for a client to establish a + The channel class provides methods for a client to establish a channel to a - channel to a server and for both peers to operate the channel thereafter. """ NAME = u'channel' @@ -1109,25 +1158,19 @@ class ChannelClose(AMQPMethodPayload): """ Request a channel close - This method indicates that the sender wants to close the - channel. This may be due to - internal conditions (e.g. a forced shut-down) or due to an error - handling a specific - method, i.e. an exception. When a close is due to an exception, - the sender provides - the class and method id of the method which caused the - exception. + This method indicates that the sender wants to close the channel. This may be due to + internal conditions (e.g. a forced shut-down) or due to an error handling a specific + method, i.e. an exception. When a close is due to an exception, the sender provides + the class and method id of the method which caused the exception. :type reply_code: int, 16 bit unsigned (reply-code in AMQP) :type reply_text: binary type (max length 255) (reply-text in AMQP) :param class_id: Failing method class - When the close is provoked by a method exception, this is - the class of the + When the close is provoked by a method exception, this is the class of the method. :type class_id: int, 16 bit unsigned (class-id in AMQP) :param method_id: Failing method id - When the close is provoked by a method exception, this is - the ID of the method. + When the close is provoked by a method exception, this is the ID of the method. :type method_id: int, 16 bit unsigned (method-id in AMQP) """ __slots__ = ( @@ -1200,8 +1243,7 @@ class ChannelCloseOk(AMQPMethodPayload): """ Confirm a channel close - This method confirms a Channel.Close method and tells the - recipient that it is safe + This method confirms a Channel.Close method and tells the recipient that it is safe to release resources for the channel. """ @@ -1237,19 +1279,14 @@ class ChannelFlow(AMQPMethodPayload): """ Enable/disable flow from peer - This method asks the peer to pause or restart the flow of - content data sent by - a consumer. This is a simple flow-control mechanism that a peer - can use to avoid - overflowing its queues or otherwise finding itself receiving - more messages than - it can process. Note that this method is not intended for window - control. It does + This method asks the peer to pause or restart the flow of content data sent by + a consumer. This is a simple flow-control mechanism that a peer can use to avoid + overflowing its queues or otherwise finding itself receiving more messages than + it can process. Note that this method is not intended for window control. It does not affect contents returned by Basic.Get-Ok methods. :param active: Start/stop content frames - If 1, the peer starts sending content frames. If 0, the peer - stops sending + If 1, the peer starts sending content frames. If 0, the peer stops sending content frames. :type active: bool (bit in AMQP) """ @@ -1305,14 +1342,11 @@ class ChannelFlowOk(AMQPMethodPayload): """ Confirm a flow method - Confirms to the peer that a flow command was received and - processed. + Confirms to the peer that a flow command was received and processed. :param active: Current flow setting - Confirms the setting of the processed flow method: 1 means - the peer will start - sending or continue to send content frames; 0 means it will - not. + Confirms the setting of the processed flow method: 1 means the peer will start + sending or continue to send content frames; 0 means it will not. :type active: bool (bit in AMQP) """ __slots__ = (u'active', ) @@ -1410,8 +1444,7 @@ class ChannelOpenOk(AMQPMethodPayload): """ Signal that the channel is ready - This method signals to the client that the channel is ready for - use. + This method signals to the client that the channel is ready for use. """ __slots__ = () @@ -1452,9 +1485,8 @@ class ChannelOpenOk(AMQPMethodPayload): class Exchange(AMQPClass): """ - Exchanges match and distribute messages across queues. exchanges can + Exchanges match and distribute messages across queues. exchanges can be configured in - be configured in the server or declared at runtime. """ NAME = u'exchange' @@ -1614,44 +1646,30 @@ class ExchangeDeclare(AMQPMethodPayload): """ Verify exchange exists, create if needed - This method creates an exchange if it does not already exist, - and if the exchange + This method creates an exchange if it does not already exist, and if the exchange exists, verifies that it is of the correct and expected class. - :param exchange: Exchange names starting with "amq." are reserved for - pre-declared and - standardised exchanges. The client MAY declare an - exchange starting with - "amq." if the passive option is set, or the exchange - already exists. + :param exchange: Exchange names starting with "amq." are reserved for pre-declared and + standardised exchanges. The client MAY declare an exchange starting with + "amq." if the passive option is set, or the exchange already exists. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param type_: Exchange type - Each exchange belongs to one of a set of exchange types - implemented by the - server. The exchange types define the functionality of the - exchange - i.e. how - messages are routed through it. It is not valid or - meaningful to attempt to + 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. :type type_: binary type (max length 255) (shortstr in AMQP) :param passive: Do not create exchange - If set, the server will reply with Declare-Ok if the - exchange already - exists with the same name, and raise an error if not. The - client can - use this to check whether an exchange exists without - modifying the - server state. When set, all other method fields except name - and no-wait - are ignored. A declare with both passive and no-wait has no - effect. + If set, the server will reply with Declare-Ok if the exchange already + exists with the same name, and raise an error if not. The client can + use this to check whether an exchange exists without modifying the + server state. When set, all other method fields except name and no-wait + are ignored. A declare with both passive and no-wait has no effect. Arguments are compared for semantic equivalence. :type passive: bool (bit in AMQP) :param durable: Request a durable exchange - 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 + 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. :type durable: bool (bit in AMQP) :param auto_delete: Auto-delete when unused @@ -1666,8 +1684,7 @@ class ExchangeDeclare(AMQPMethodPayload): :type internal: bool (bit in AMQP) :type no_wait: bool (no-wait in AMQP) :param arguments: Arguments for declaration - A set of arguments for the declaration. The syntax and - semantics of these + A set of arguments for the declaration. The syntax and semantics of these arguments depends on the server implementation. :type arguments: table. See coolamqp.uplink.framing.field_table (table in AMQP) """ @@ -1777,18 +1794,14 @@ class ExchangeDelete(AMQPMethodPayload): """ Delete an exchange - This method deletes an exchange. When an exchange is deleted all - queue bindings on + This method deletes an exchange. When an exchange is deleted all queue bindings on the exchange are cancelled. - :param exchange: The client must not attempt to delete an exchange that - does not exist. + :param exchange: The client must not attempt to delete an exchange that does not exist. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param if_unused: Delete only if unused - If set, the server will only delete the exchange if it has - no queue bindings. If - the exchange has queue bindings the server does not delete - it but raises a + If set, the server will only delete the exchange if it has no queue bindings. If + the exchange has queue bindings the server does not delete it but raises a channel exception instead. :type if_unused: bool (bit in AMQP) :type no_wait: bool (no-wait in AMQP) @@ -1863,8 +1876,7 @@ class ExchangeDeclareOk(AMQPMethodPayload): """ Confirm exchange declaration - This method confirms a Declare method and confirms the name of - the exchange, + This method confirms a Declare method and confirms the name of the exchange, essential for automatically-named exchanges. """ @@ -2076,11 +2088,9 @@ class ExchangeUnbindOk(AMQPMethodPayload): class Queue(AMQPClass): """ - Queues store and forward messages. queues can be configured in the + Queues store and forward messages. queues can be configured in the server or created at - server or created at - runtime. Queues must be attached to at least one exchange in order - to receive messages + runtime. Queues must be attached to at least one exchange in order to receive messages from publishers. """ NAME = u'queue' @@ -2091,41 +2101,29 @@ class QueueBind(AMQPMethodPayload): """ Bind queue to an exchange - This method 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 + This method 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. :param queue: Specifies the name of the queue to bind. :type queue: binary type (max length 255) (queue-name in AMQP) :param exchange: Name of the exchange to bind to - A client MUST NOT be allowed to bind a queue to a - non-existent exchange. + A client MUST NOT be allowed to bind a queue to a non-existent exchange. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param routing_key: Message routing key - Specifies the routing key for the binding. The routing key - is used for routing - messages depending on the exchange configuration. Not all - exchanges use a - routing key - refer to the specific exchange documentation. - If the queue name - is empty, the server uses the last queue declared on the - channel. If the - routing key is also empty, the server uses this queue name - for the routing - key as well. If the queue name is provided but the routing - key is empty, the - server does the binding with that empty routing key. The - meaning of empty + Specifies the routing key for the binding. The routing key is used for routing + messages depending on the exchange configuration. Not all exchanges use a + routing key - refer to the specific exchange documentation. If the queue name + is empty, the server uses the last queue declared on the channel. If the + routing key is also empty, the server uses this queue name for the routing + key as well. If the queue name is provided but the routing key is empty, the + server does the binding with that empty routing key. The meaning of empty routing keys depends on the exchange implementation. :type routing_key: binary type (max length 255) (shortstr in AMQP) :type no_wait: bool (no-wait in AMQP) :param arguments: Arguments for binding - A set of arguments for the binding. The syntax and semantics - of these arguments + A set of arguments for the binding. The syntax and semantics of these arguments depends on the exchange class. :type arguments: table. See coolamqp.uplink.framing.field_table (table in AMQP) """ @@ -2258,63 +2256,43 @@ class QueueDeclare(AMQPMethodPayload): """ Declare queue, create if needed - This method creates or checks a queue. When creating a new queue - the client can - specify various properties that control the durability of the - queue and its + This method creates or checks a queue. When creating a new queue the client can + specify various properties that control the durability of the queue and its contents, and the level of sharing for the queue. - :param queue: The queue name may be empty, in which case the server - MUST create a new - queue with a unique generated name and return this to - the client in the + :param queue: The queue name may be empty, in which case the server must create a new + queue with a unique generated name and return this to the client in the Declare-Ok method. :type queue: binary type (max length 255) (queue-name in AMQP) :param passive: Do not create queue - If set, the server will reply with Declare-Ok if the queue - already - exists with the same name, and raise an error if not. The - client can - use this to check whether a queue exists without modifying - the - server state. When set, all other method fields except name - and no-wait - are ignored. A declare with both passive and no-wait has no - effect. + If set, the server will reply with Declare-Ok if the queue already + exists with the same name, and raise an error if not. The client can + use this to check whether a queue exists without modifying the + server state. When set, all other method fields except name and no-wait + are ignored. A declare with both passive and no-wait has no effect. Arguments are compared for semantic equivalence. :type passive: bool (bit in AMQP) :param durable: Request a durable queue - 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 + 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. :type durable: bool (bit in AMQP) :param exclusive: Request an exclusive queue - Exclusive queues may only be accessed by the current - connection, and are - deleted when that connection closes. Passive declaration of - an exclusive + Exclusive queues may only be accessed by the current connection, and are + deleted when that connection closes. Passive declaration of an exclusive queue by other connections are not allowed. :type exclusive: bool (bit in AMQP) :param auto_delete: Auto-delete queue when unused - If set, the queue is deleted when all consumers have - finished using it. The last - consumer can be cancelled either explicitly or because its - channel is closed. If - there was no consumer ever on the queue, it won't be - deleted. Applications can - explicitly delete auto-delete queues using the Delete method - as normal. + If set, the queue is deleted when all consumers have finished using it. The last + consumer can be cancelled either explicitly or because its channel is closed. If + there was no consumer ever on the queue, it won't be deleted. Applications can + explicitly delete auto-delete queues using the Delete method as normal. :type auto_delete: bool (bit in AMQP) :type no_wait: bool (no-wait in AMQP) :param arguments: Arguments for declaration - A set of arguments for the declaration. The syntax and - semantics of these + A set of arguments for the declaration. The syntax and semantics of these arguments depends on the server implementation. :type arguments: table. See coolamqp.uplink.framing.field_table (table in AMQP) """ @@ -2414,24 +2392,19 @@ class QueueDelete(AMQPMethodPayload): """ Delete a queue - This method deletes a queue. When a queue is deleted any pending - messages are sent - to a dead-letter queue if this is defined in the server - configuration, and all + This method deletes a queue. When a queue is deleted any pending messages are sent + to a dead-letter queue if this is defined in the server configuration, and all consumers on the queue are cancelled. :param queue: Specifies the name of the queue to delete. :type queue: binary type (max length 255) (queue-name in AMQP) :param if_unused: Delete only if unused - 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 a channel + 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 a channel exception instead. :type if_unused: bool (bit in AMQP) :param if_empty: Delete only if empty - If set, the server will only delete the queue if it has no - messages. + If set, the server will only delete the queue if it has no messages. :type if_empty: bool (bit in AMQP) :type no_wait: bool (no-wait in AMQP) """ @@ -2512,20 +2485,16 @@ class QueueDeclareOk(AMQPMethodPayload): """ Confirms a queue definition - This method confirms a Declare method and confirms the name of - the queue, essential + This method confirms a Declare method and confirms the name of the queue, essential for automatically-named queues. - :param queue: Reports the name of the queue. if the server generated a - queue name, this field + :param queue: Reports the name of the queue. if the server generated a queue name, this field contains that name. :type queue: binary type (max length 255) (queue-name in AMQP) :type message_count: int, 32 bit unsigned (message-count in AMQP) :param consumer_count: Number of consumers - Reports the number of active consumers for the queue. Note - that consumers can - suspend activity (Channel.Flow) in which case they do not - appear in this count. + Reports the number of active consumers for the queue. Note that consumers can + suspend activity (Channel.Flow) in which case they do not appear in this count. :type consumer_count: int, 32 bit unsigned (long in AMQP) """ __slots__ = ( @@ -2650,8 +2619,7 @@ class QueuePurge(AMQPMethodPayload): """ Purge a queue - This method removes all messages from a queue which are not - awaiting + This method removes all messages from a queue which are not awaiting acknowledgment. :param queue: Specifies the name of the queue to purge. @@ -2911,9 +2879,7 @@ class QueueUnbindOk(AMQPMethodPayload): class Basic(AMQPClass): """ - The basic class provides methods that support an industry-standard - - messaging model. + The basic class provides methods that support an industry-standard messaging model. """ NAME = u'basic' INDEX = 60 @@ -2921,9 +2887,7 @@ class Basic(AMQPClass): class BasicContentPropertyList(AMQPContentPropertyList): """ - The basic class provides methods that support an industry-standard - - messaging model. + The basic class provides methods that support an industry-standard messaging model. """ FIELDS = [ Field(u'content-type', u'shortstr', u'shortstr', False), @@ -3150,31 +3114,25 @@ class BasicConsume(AMQPMethodPayload): """ Start a queue consumer - This method asks the server to start a "consumer", which is a - transient request for - messages from a specific queue. Consumers last as long as the - channel they were + This method asks the server to start a "consumer", which is a transient request for + messages from a specific queue. Consumers last as long as the channel they were declared on, or until the client cancels them. :param queue: Specifies the name of the queue to consume from. :type queue: binary type (max length 255) (queue-name in AMQP) - :param consumer_tag: Specifies the identifier for the consumer. the consumer tag - is local to a - channel, so two clients can use the same consumer tags. If - this field is + :param consumer_tag: Specifies the identifier for the consumer. the consumer tag is local to a + channel, so two clients can use the same consumer tags. If this field is empty the server will generate a unique tag. :type consumer_tag: binary type (max length 255) (consumer-tag in AMQP) :type no_local: bool (no-local in AMQP) :type no_ack: bool (no-ack in AMQP) :param exclusive: Request exclusive access - Request exclusive consumer access, meaning only this - consumer can access the + Request exclusive consumer access, meaning only this consumer can access the queue. :type exclusive: bool (bit in AMQP) :type no_wait: bool (no-wait in AMQP) :param arguments: Arguments for declaration - A set of arguments for the consume. The syntax and semantics - of these + A set of arguments for the consume. The syntax and semantics of these arguments depends on the server implementation. :type arguments: table. See coolamqp.uplink.framing.field_table (table in AMQP) """ @@ -3279,14 +3237,10 @@ class BasicCancel(AMQPMethodPayload): """ End a queue consumer - This method 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 client may receive an arbitrary number of - messages in - between sending the cancel method and receiving the cancel-ok - reply. + This method 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 client may receive an arbitrary number of messages in + between sending the cancel method and receiving the cancel-ok reply. It may also be sent from the server to the client in the event of the consumer being unexpectedly cancelled (i.e. cancelled for any reason other than the server receiving the @@ -3365,12 +3319,10 @@ class BasicConsumeOk(AMQPMethodPayload): """ Confirm a new consumer - The server provides the client with a consumer tag, which is - used by the client + The server provides the client with a consumer tag, which is used by the client for methods called on the consumer at a later stage. - :param consumer_tag: Holds the consumer tag specified by the client or provided - by the server. + :param consumer_tag: Holds the consumer tag specified by the client or provided by the server. :type consumer_tag: binary type (max length 255) (consumer-tag in AMQP) """ __slots__ = (u'consumer_tag', ) @@ -3485,24 +3437,19 @@ class BasicDeliver(AMQPMethodPayload): """ Notify the client of a consumer message - This method delivers a message to the client, via a consumer. In - the asynchronous - message delivery model, the client starts a consumer using the - Consume method, then - the server responds with Deliver methods as and when messages - arrive for that + This method delivers a message to the client, via a consumer. In the asynchronous + message delivery model, the client starts a consumer using the Consume method, then + the server responds with Deliver methods as and when messages arrive for that consumer. :type consumer_tag: binary type (max length 255) (consumer-tag in AMQP) :type delivery_tag: int, 64 bit unsigned (delivery-tag in AMQP) :type redelivered: bool (redelivered in AMQP) - :param exchange: Specifies the name of the exchange that the message was - originally published to. + :param exchange: Specifies the name of the exchange that the message was originally published to. May be empty, indicating the default exchange. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param routing_key: Message routing key - Specifies the routing key name specified when the message - was published. + Specifies the routing key name specified when the message was published. :type routing_key: binary type (max length 255) (shortstr in AMQP) """ __slots__ = ( @@ -3597,10 +3544,8 @@ class BasicGet(AMQPMethodPayload): """ Direct access to a queue - This method provides a direct access to the messages in a queue - using a synchronous - dialogue that is designed for specific types of application - where synchronous + This method provides a direct access to the messages in a queue using a synchronous + dialogue that is designed for specific types of application where synchronous functionality is more important than performance. :param queue: Specifies the name of the queue to get a message from. @@ -3672,21 +3617,17 @@ class BasicGetOk(AMQPMethodPayload): """ Provide client with a message - This method delivers a message to the client following a get - method. A message - delivered by 'get-ok' must be acknowledged unless the no-ack - option was set in the + This method delivers a message to the client following a get method. A message + delivered by 'get-ok' must be acknowledged unless the no-ack option was set in the get method. :type delivery_tag: int, 64 bit unsigned (delivery-tag in AMQP) :type redelivered: bool (redelivered in AMQP) - :param exchange: Specifies the name of the exchange that the message was - originally published to. + :param exchange: Specifies the name of the exchange that the message was originally published to. If empty, the message was published to the default exchange. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param routing_key: Message routing key - Specifies the routing key name specified when the message - was published. + Specifies the routing key name specified when the message was published. :type routing_key: binary type (max length 255) (shortstr in AMQP) :type message_count: int, 32 bit unsigned (message-count in AMQP) """ @@ -3778,8 +3719,7 @@ class BasicGetEmpty(AMQPMethodPayload): """ Indicate no messages available - This method tells the client that the queue has no messages - available for the + This method tells the client that the queue has no messages available for the client. """ @@ -3823,15 +3763,11 @@ class BasicNack(AMQPMethodPayload): """ Reject one or more incoming messages - This method allows a client to reject one or more incoming - messages. It can be - used to interrupt and cancel large incoming messages, or return - untreatable + This method allows a client to reject one or more incoming messages. It can be + used to interrupt and cancel large incoming messages, or return untreatable messages to their original queue. - This method is also used by the server to inform publishers on - channels in - confirm mode of unhandled messages. If a publisher receives this - method, it + This method is also used by the server to inform publishers on channels in + confirm mode of unhandled messages. If a publisher receives this method, it probably needs to republish the offending messages. :type delivery_tag: int, 64 bit unsigned (delivery-tag in AMQP) @@ -3844,10 +3780,8 @@ class BasicNack(AMQPMethodPayload): all outstanding messages. :type multiple: bool (bit in AMQP) :param requeue: Requeue the message - If requeue is true, the server will attempt to requeue the - message. If requeue - is false or the requeue attempt fails the messages are - discarded or dead-lettered. + If requeue is true, the server will attempt to requeue the message. If requeue + is false or the requeue attempt fails the messages are discarded or dead-lettered. Clients receiving the Nack methods should ignore this flag. :type requeue: bool (bit in AMQP) """ @@ -3915,41 +3849,28 @@ class BasicPublish(AMQPMethodPayload): """ Publish a message - This method 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 + This method 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 when the transaction, if any, is committed. - :param exchange: 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 a channel - exception. + :param exchange: 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 a channel exception. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param routing_key: Message routing key - Specifies the routing key for the message. The routing key - is used for routing + Specifies the routing key for the message. The routing key is used for routing messages depending on the exchange configuration. :type routing_key: binary type (max length 255) (shortstr in AMQP) :param mandatory: Indicate mandatory routing - 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 method. If this flag is zero, the server silently - drops the message. + 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 method. If this flag is zero, the server silently drops the message. :type mandatory: bool (bit in AMQP) :param immediate: Request immediate delivery - 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 method. If this flag is - zero, the server - will queue the message, but with no guarantee that it will - ever be consumed. + 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 method. If this flag is zero, the server + will queue the message, but with no guarantee that it will ever be consumed. :type immediate: bool (bit in AMQP) """ __slots__ = ( @@ -4033,43 +3954,27 @@ class BasicQos(AMQPMethodPayload): """ Specify quality of service - This method requests a specific quality of service. The QoS can - be specified for the - current channel or for all channels on the connection. The - particular properties and - semantics of a qos method always depend on the content class - semantics. Though the - qos method could in principle apply to both peers, it is - currently meaningful only + This method requests a specific quality of service. The QoS can be specified for the + current channel or for all channels on the connection. The particular properties and + semantics of a qos method always depend on the content class semantics. Though the + qos method could in principle apply to both peers, it is currently meaningful only for the server. :param prefetch_size: Prefetch window in octets - 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 down the channel. Prefetching - gives a performance - improvement. This field specifies the prefetch window size - in octets. The server - will send a message in advance if it is equal to or smaller - in size than the - available prefetch size (and also falls into other prefetch - limits). May be set - to zero, meaning "no specific limit", although other - prefetch limits may still - apply. The prefetch-size is ignored if the no-ack option is - set. + 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 down the channel. Prefetching gives a performance + improvement. This field specifies the prefetch window size in octets. The server + will send a message in advance if it is equal to or smaller in size than the + available prefetch size (and also falls into other prefetch limits). May be set + to zero, meaning "no specific limit", although other prefetch limits may still + apply. The prefetch-size is ignored if the no-ack option is set. :type prefetch_size: int, 32 bit unsigned (long in AMQP) :param prefetch_count: Prefetch window in messages - Specifies a prefetch 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 prefetch windows (and those at the channel - and connection level) - allow it. The prefetch-count is ignored if the no-ack option - is set. + Specifies a prefetch 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 prefetch windows (and those at the channel and connection level) + allow it. The prefetch-count is ignored if the no-ack option is set. :type prefetch_count: int, 16 bit unsigned (short in AMQP) :param global_: Apply to entire connection RabbitMQ has reinterpreted this field. The original @@ -4146,10 +4051,8 @@ class BasicQosOk(AMQPMethodPayload): """ Confirm the requested qos - This method 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 + This method 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. """ @@ -4185,23 +4088,18 @@ class BasicReturn(AMQPMethodPayload): """ Return a failed message - This method 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 + This method 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. :type reply_code: int, 16 bit unsigned (reply-code in AMQP) :type reply_text: binary type (max length 255) (reply-text in AMQP) - :param exchange: Specifies the name of the exchange that the message was - originally published - to. May be empty, meaning the default exchange. + :param exchange: Specifies the name of the exchange that the message was originally published + to. May be empty, meaning the default exchange. :type exchange: binary type (max length 255) (exchange-name in AMQP) :param routing_key: Message routing key - Specifies the routing key name specified when the message - was published. + Specifies the routing key name specified when the message was published. :type routing_key: binary type (max length 255) (shortstr in AMQP) """ __slots__ = ( @@ -4285,18 +4183,14 @@ class BasicReject(AMQPMethodPayload): """ Reject an incoming message - This method allows a client to reject a message. It can be used - to interrupt and - cancel large incoming messages, or return untreatable messages - to their original + This method allows a client to reject a message. It can be used to interrupt and + cancel large incoming messages, or return untreatable messages to their original queue. :type delivery_tag: int, 64 bit unsigned (delivery-tag in AMQP) :param requeue: Requeue the message - If requeue is true, the server will attempt to requeue the - message. If requeue - is false or the requeue attempt fails the messages are - discarded or dead-lettered. + If requeue is true, the server will attempt to requeue the message. If requeue + is false or the requeue attempt fails the messages are discarded or dead-lettered. :type requeue: bool (bit in AMQP) """ __slots__ = ( @@ -4357,17 +4251,13 @@ class BasicRecoverAsync(AMQPMethodPayload): """ Redeliver unacknowledged messages - This method asks the server to redeliver all unacknowledged - messages on a - specified channel. Zero or more messages may be redelivered. - This method + This method asks the server to redeliver all unacknowledged messages on a + specified channel. Zero or more messages may be redelivered. This method is deprecated in favour of the synchronous Recover/Recover-Ok. :param requeue: Requeue the message - If this field is zero, the message will be redelivered to - the original - recipient. If this bit is 1, the server will attempt to - requeue the message, + If this field is zero, the message will be redelivered to the original + recipient. If this bit is 1, the server will attempt to requeue the message, potentially then delivering it to an alternative subscriber. :type requeue: bool (bit in AMQP) """ @@ -4424,17 +4314,13 @@ class BasicRecover(AMQPMethodPayload): """ Redeliver unacknowledged messages - This method asks the server to redeliver all unacknowledged - messages on a - specified channel. Zero or more messages may be redelivered. - This method + This method asks the server to redeliver all unacknowledged messages on a + specified channel. Zero or more messages may be redelivered. This method replaces the asynchronous Recover. :param requeue: Requeue the message - If this field is zero, the message will be redelivered to - the original - recipient. If this bit is 1, the server will attempt to - requeue the message, + If this field is zero, the message will be redelivered to the original + recipient. If this bit is 1, the server will attempt to requeue the message, potentially then delivering it to an alternative subscriber. :type requeue: bool (bit in AMQP) """ @@ -4523,22 +4409,15 @@ class BasicRecoverOk(AMQPMethodPayload): class Tx(AMQPClass): """ - The tx class allows publish and ack operations to be batched into + The tx class allows publish and ack operations to be batched into atomic - atomic - units of work. The intention is that all publish and ack requests - issued - within a transaction will complete successfully or none of them - will. - Servers SHOULD implement atomic transactions at least where all - publish - or ack requests affect a single queue. Transactions that cover - multiple - queues may be non-atomic, given that queues can be created and - destroyed + units of work. The intention is that all publish and ack requests issued + within a transaction will complete successfully or none of them will. + Servers SHOULD implement atomic transactions at least where all publish + or ack requests affect a single queue. Transactions that cover multiple + queues may be non-atomic, given that queues can be created and destroyed asynchronously, and such events do not form part of any transaction. - Further, the behaviour of transactions with respect to the immediate - and + Further, the behaviour of transactions with respect to the immediate and mandatory flags on Basic.Publish methods is not defined. """ NAME = u'tx' @@ -4549,10 +4428,8 @@ class TxCommit(AMQPMethodPayload): """ Commit the current transaction - This method commits all message publications and acknowledgments - performed in - the current transaction. A new transaction starts immediately - after a commit. + This method commits all message publications and acknowledgments performed in + the current transaction. A new transaction starts immediately after a commit. """ __slots__ = () @@ -4586,8 +4463,7 @@ class TxCommitOk(AMQPMethodPayload): """ Confirm a successful commit - This method confirms to the client that the commit succeeded. - Note that if a commit + This method confirms to the client that the commit succeeded. Note that if a commit fails, the server raises a channel exception. """ @@ -4623,12 +4499,9 @@ class TxRollback(AMQPMethodPayload): """ Abandon the current transaction - This method abandons all message publications and - acknowledgments performed in - the current transaction. A new transaction starts immediately - after a rollback. - Note that unacked messages will not be automatically redelivered - by rollback; + This method abandons all message publications and acknowledgments performed in + the current transaction. A new transaction starts immediately after a rollback. + Note that unacked messages will not be automatically redelivered by rollback; if that is required an explicit recover call should be issued. """ @@ -4664,8 +4537,7 @@ class TxRollbackOk(AMQPMethodPayload): """ Confirm successful rollback - This method confirms to the client that the rollback succeeded. - Note that if an + This method confirms to the client that the rollback succeeded. Note that if an rollback fails, the server raises a channel exception. """ @@ -4701,10 +4573,8 @@ class TxSelect(AMQPMethodPayload): """ Select standard transaction mode - This method sets the channel to use standard transactions. The - client must use this - method at least once on a channel before using the Commit or - Rollback methods. + This method sets the channel to use standard transactions. The client must use this + method at least once on a channel before using the Commit or Rollback methods. """ __slots__ = () @@ -4738,8 +4608,7 @@ class TxSelectOk(AMQPMethodPayload): """ Confirm transaction mode - This method confirms to the client that the channel was - successfully set to use + This method confirms to the client that the channel was successfully set to use standard transactions. """ @@ -4776,9 +4645,9 @@ class Confirm(AMQPClass): The confirm class allows publishers to put the channel in confirm mode and subsequently be notified when messages have been - handled by the broker. The intention is that all messages + handled by the broker. The intention is that all messages published on a channel in confirm mode will be acknowledged at - some point. By acknowledging a message the broker assumes + some point. By acknowledging a message the broker assumes responsibility for it and indicates that it has done something it deems reasonable with it. Unroutable mandatory or immediate messages are acknowledged @@ -4803,12 +4672,7 @@ class ConfirmSelect(AMQPMethodPayload): The client can only use this method on a non-transactional channel. - :param nowait: If set, the server will not respond to the method. the - client should - not wait for a reply method. If the server could not - complete the - method it will raise a channel or connection exception. - :type nowait: bool (bit in AMQP) + :type nowait: bool (no-wait in AMQP) """ __slots__ = (u'nowait', ) @@ -4824,7 +4688,7 @@ class ConfirmSelect(AMQPMethodPayload): # See constructor pydoc for details FIELDS = [ - Field(u'nowait', u'bit', u'bit', reserved=False), + Field(u'nowait', u'no-wait', u'bit', reserved=False), ] def __repr__(self): # type: () -> str @@ -4860,9 +4724,8 @@ class ConfirmSelect(AMQPMethodPayload): class ConfirmSelectOk(AMQPMethodPayload): """ - This method confirms to the client that the channel was + This method confirms to the client that the channel was successfully - successfully set to use publisher acknowledgements. """ @@ -4906,7 +4769,9 @@ IDENT_TO_METHOD = { (10, 21): ConnectionSecureOk, (10, 30): ConnectionTune, (10, 31): ConnectionTuneOk, + (10, 70): ConnectionUpdateSecret, (10, 61): ConnectionUnblocked, + (10, 71): ConnectionUpdateSecretOk, (20, 40): ChannelClose, (20, 41): ChannelCloseOk, (20, 20): ChannelFlow, @@ -4971,7 +4836,9 @@ BINARY_HEADER_TO_METHOD = { b'\x00\x0A\x00\x15': ConnectionSecureOk, b'\x00\x0A\x00\x1E': ConnectionTune, b'\x00\x0A\x00\x1F': ConnectionTuneOk, + b'\x00\x0A\x00\x46': ConnectionUpdateSecret, b'\x00\x0A\x00\x3D': ConnectionUnblocked, + b'\x00\x0A\x00\x47': ConnectionUpdateSecretOk, b'\x00\x14\x00\x28': ChannelClose, b'\x00\x14\x00\x29': ChannelCloseOk, b'\x00\x14\x00\x14': ChannelFlow, @@ -5037,6 +4904,7 @@ REPLY_REASONS_FOR = { ConnectionStartOk: ConnectionStart, ConnectionSecureOk: ConnectionSecure, ConnectionTuneOk: ConnectionTune, + ConnectionUpdateSecretOk: ConnectionUpdateSecret, ChannelCloseOk: ChannelClose, ChannelFlowOk: ChannelFlow, ChannelOpenOk: ChannelOpen, @@ -5075,7 +4943,9 @@ REPLIES_FOR = { ConnectionSecureOk: [], ConnectionTune: [ConnectionTuneOk], ConnectionTuneOk: [], + ConnectionUpdateSecret: [ConnectionUpdateSecretOk], ConnectionUnblocked: [], + ConnectionUpdateSecretOk: [], ChannelClose: [ChannelCloseOk], ChannelCloseOk: [], ChannelFlow: [ChannelFlowOk], diff --git a/resources/LICENSE.md b/resources/LICENSE.md deleted file mode 100644 index b8e5d8544c5db143c8d6888bcc32bfe39cf47ecf..0000000000000000000000000000000000000000 --- a/resources/LICENSE.md +++ /dev/null @@ -1,106 +0,0 @@ -License -======= - -Cisco Systems, Credit Suisse, Deutsche Boerse Systems, Envoy Technologies, -Inc., Goldman Sachs, IONA Technologies PLC, iMatix Corporation, JPMorgan -Chase Bank Inc. N.A, Novell, Rabbit Technologies Ltd., Red Hat, Inc., -TWIST Process Innovations Ltd, WS02, Inc. and 29West Inc. (collectively, -the "Authors") each hereby grants to you a worldwide, perpetual, -royalty-free, nontransferable, nonexclusive license to (i) copy, display, -distribute and implement the Advanced Messaging Queue Protocol ("AMQP") -Specification and (ii) the Licensed Claims that are held by the Authors, -all for the purpose of implementing the Advanced Messaging Queue Protocol -Specification. Your license and any rights under this Agreement will -terminate immediately without notice from any Author if you bring any -claim, suit, demand, or action related to the Advanced Messaging Queue -Protocol Specification against any Author. Upon termination, you shall -destroy all copies of the Advanced Messaging Queue Protocol Specification -in your possession or control. - -As used hereunder, "Licensed Claims" means those claims of a patent or -patent application, throughout the world, excluding design patents and -design registrations, owned or controlled, or that can be sublicensed -without fee and in compliance with the requirements of this Agreement, -by an Author or its affiliates now or at any future time and which would -necessarily be infringed by implementation of the Advanced Messaging -Queue Protocol Specification. A claim is necessarily infringed hereunder -only when it is not possible to avoid infringing it because there is no -plausible non-infringing alternative for implementing the required -portions of the Advanced Messaging Queue Protocol Specification. -Notwithstanding the foregoing, Licensed Claims shall not include any -claims other than as set forth above even if contained in the same patent -as Licensed Claims; or that read solely on any implementations of any -portion of the Advanced Messaging Queue Protocol Specification that are -not required by the Advanced Messaging Queue ProtocolSpecification, or -that, if licensed, would require a payment of royalties by the licensor -to unaffiliated third parties. Moreover, Licensed Claims shall not -include (i) any enabling technologies that may be necessary to make or -use any Licensed Product but are not themselves expressly set forth in -the Advanced Messaging Queue Protocol Specification (e.g., semiconductor -manufacturing technology, compiler technology, object oriented -technology, networking technology, operating system technology, and the -like); or (ii) the implementation of other published standards developed -elsewhere and merely referred to in the body of the Advanced Messaging -Queue Protocol Specification, or (iii) any Licensed Product and any -combinations thereof the purpose or function of which is not required -for compliance with the Advanced Messaging Queue Protocol Specification. -For purposes of this definition, the Advanced Messaging Queue Protocol -Specification shall be deemed to include both architectural and -interconnection requirements essential for interoperability and may also -include supporting source code artifacts where such architectural, -interconnection requirements and source code artifacts are expressly -identified as being required or documentation to achieve compliance with -the Advanced Messaging Queue Protocol Specification. - -As used hereunder, "Licensed Products" means only those specific portions -of products (hardware, software or combinations thereof) that implement -and are compliant with all relevant portions of the Advanced Messaging -Queue Protocol Specification. - -The following disclaimers, which you hereby also acknowledge as to any -use you may make of the Advanced Messaging Queue Protocol Specification: - -THE ADVANCED MESSAGING QUEUE PROTOCOL SPECIFICATION IS PROVIDED "AS IS," -AND THE AUTHORS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR -IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE -CONTENTS OF THE ADVANCED MESSAGING QUEUE PROTOCOL SPECIFICATION ARE -SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF THE ADVANCED -MESSAGING QUEUE PROTOCOL SPECIFICATION WILL NOT INFRINGE ANY THIRD PARTY -PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - -THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, -INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO ANY -USE, IMPLEMENTATION OR DISTRIBUTION OF THE ADVANCED MESSAGING QUEUE -PROTOCOL SPECIFICATION. - -The name and trademarks of the Authors may NOT be used in any manner, -including advertising or publicity pertaining to the Advanced Messaging -Queue Protocol Specification or its contents without specific, written -prior permission. Title to copyright in the Advanced Messaging Queue -Protocol Specification will at all times remain with the Authors. - -No other rights are granted by implication, estoppel or otherwise. - -Upon termination of your license or rights under this Agreement, you -shall destroy all copies of the Advanced Messaging Queue Protocol -Specification in your possession or control. - -Trademarks -========== -JPMorgan, JPMorgan Chase, Chase, the JPMorgan Chase logo and the -Octagon Symbol are trademarks of JPMorgan Chase & Co. - -IMATIX and the iMatix logo are trademarks of iMatix Corporation sprl. - -IONA, IONA Technologies, and the IONA logos are trademarks of IONA -Technologies PLC and/or its subsidiaries. - -LINUX is a trademark of Linus Torvalds. RED HAT and JBOSS are registered -trademarks of Red Hat, Inc. in the US and other countries. - -Java, all Java-based trademarks and OpenOffice.org are trademarks of -Sun Microsystems, Inc. in the United States, other countries, or both. - -Other company, product, or service names may be trademarks or service -marks of others. diff --git a/resources/amqp0-9-1.extended.xml b/resources/amqp0-9-1.extended.xml deleted file mode 100644 index f7aca67cdaba8b9765f8636a86d1445cb2f5c308..0000000000000000000000000000000000000000 --- a/resources/amqp0-9-1.extended.xml +++ /dev/null @@ -1,4004 +0,0 @@ -<?xml version = "1.0"?> - -<!-- - WARNING: Modified from the official 0-9-1 specification XML by - the addition of: - confirm.select and confirm.select-ok, - exchange.bind and exchange.bind-ok, - exchange.unbind and exchange.unbind-ok, - basic.nack, - the ability for the Server to send basic.ack, basic.nack and - basic.cancel to the client, and - the un-deprecation of exchange.declare{auto-delete} and exchange.declare{internal} - - Modifications are (c) 2010-2013 VMware, Inc. and may be distributed under - the same BSD license as the stripped spec. ---> - -<!-- - Copyright Notice - ================ - Copyright (c) 2006-2008 Cisco Systems, Credit Suisse, Deutsche Boerse - Systems, Envoy Technologies, Inc., Goldman Sachs, IONA Technologies PLC, - iMatix Corporation, JPMorgan Chase Bank Inc. N.A, Novell, Rabbit - Technologies Ltd., Red Hat, Inc., TWIST Process Innovations Ltd, WS02 - Inc. and 29West Inc. All rights reserved. - - License - ======= - Cisco Systems, Credit Suisse, Deutsche Boerse Systems, Envoy Technologies, - Inc., Goldman Sachs, IONA Technologies PLC, iMatix Corporation, JPMorgan - Chase Bank Inc. N.A, Novell, Rabbit Technologies Ltd., Red Hat, Inc., - TWIST Process Innovations Ltd, WS02, Inc. and 29West Inc. (collectively, - the "Authors") each hereby grants to you a worldwide, perpetual, - royalty-free, nontransferable, nonexclusive license to (i) copy, display, - distribute and implement the Advanced Messaging Queue Protocol ("AMQP") - Specification and (ii) the Licensed Claims that are held by the Authors, - all for the purpose of implementing the Advanced Messaging Queue Protocol - Specification. Your license and any rights under this Agreement will - terminate immediately without notice from any Author if you bring any - claim, suit, demand, or action related to the Advanced Messaging Queue - Protocol Specification against any Author. Upon termination, you shall - destroy all copies of the Advanced Messaging Queue Protocol Specification - in your possession or control. - - As used hereunder, "Licensed Claims" means those claims of a patent or - patent application, throughout the world, excluding design patents and - design registrations, owned or controlled, or that can be sublicensed - without fee and in compliance with the requirements of this Agreement, - by an Author or its affiliates now or at any future time and which would - necessarily be infringed by implementation of the Advanced Messaging - Queue Protocol Specification. A claim is necessarily infringed hereunder - only when it is not possible to avoid infringing it because there is no - plausible non-infringing alternative for implementing the required - portions of the Advanced Messaging Queue Protocol Specification. - Notwithstanding the foregoing, Licensed Claims shall not include any - claims other than as set forth above even if contained in the same patent - as Licensed Claims; or that read solely on any implementations of any - portion of the Advanced Messaging Queue Protocol Specification that are - not required by the Advanced Messaging Queue ProtocolSpecification, or - that, if licensed, would require a payment of royalties by the licensor - to unaffiliated third parties. Moreover, Licensed Claims shall not - include (i) any enabling technologies that may be necessary to make or - use any Licensed Product but are not themselves expressly set forth in - the Advanced Messaging Queue Protocol Specification (e.g., semiconductor - manufacturing technology, compiler technology, object oriented - technology, networking technology, operating system technology, and the - like); or (ii) the implementation of other published standards developed - elsewhere and merely referred to in the body of the Advanced Messaging - Queue Protocol Specification, or (iii) any Licensed Product and any - combinations thereof the purpose or function of which is not required - for compliance with the Advanced Messaging Queue Protocol Specification. - For purposes of this definition, the Advanced Messaging Queue Protocol - Specification shall be deemed to include both architectural and - interconnection requirements essential for interoperability and may also - include supporting source code artifacts where such architectural, - interconnection requirements and source code artifacts are expressly - identified as being required or documentation to achieve compliance with - the Advanced Messaging Queue Protocol Specification. - - As used hereunder, "Licensed Products" means only those specific portions - of products (hardware, software or combinations thereof) that implement - and are compliant with all relevant portions of the Advanced Messaging - Queue Protocol Specification. - - The following disclaimers, which you hereby also acknowledge as to any - use you may make of the Advanced Messaging Queue Protocol Specification: - - THE ADVANCED MESSAGING QUEUE PROTOCOL SPECIFICATION IS PROVIDED "AS IS," - AND THE AUTHORS MAKE NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR - IMPLIED, INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, OR TITLE; THAT THE - CONTENTS OF THE ADVANCED MESSAGING QUEUE PROTOCOL SPECIFICATION ARE - SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF THE ADVANCED - MESSAGING QUEUE PROTOCOL SPECIFICATION WILL NOT INFRINGE ANY THIRD PARTY - PATENTS, COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS. - - THE AUTHORS WILL NOT BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, - INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF OR RELATING TO ANY - USE, IMPLEMENTATION OR DISTRIBUTION OF THE ADVANCED MESSAGING QUEUE - PROTOCOL SPECIFICATION. - - The name and trademarks of the Authors may NOT be used in any manner, - including advertising or publicity pertaining to the Advanced Messaging - Queue Protocol Specification or its contents without specific, written - prior permission. Title to copyright in the Advanced Messaging Queue - Protocol Specification will at all times remain with the Authors. - - No other rights are granted by implication, estoppel or otherwise. - - Upon termination of your license or rights under this Agreement, you - shall destroy all copies of the Advanced Messaging Queue Protocol - Specification in your possession or control. - - Trademarks - ========== - JPMorgan, JPMorgan Chase, Chase, the JPMorgan Chase logo and the - Octagon Symbol are trademarks of JPMorgan Chase & Co. - - IMATIX and the iMatix logo are trademarks of iMatix Corporation sprl. - - IONA, IONA Technologies, and the IONA logos are trademarks of IONA - Technologies PLC and/or its subsidiaries. - - LINUX is a trademark of Linus Torvalds. RED HAT and JBOSS are registered - trademarks of Red Hat, Inc. in the US and other countries. - - Java, all Java-based trademarks and OpenOffice.org are trademarks of - Sun Microsystems, Inc. in the United States, other countries, or both. - - Other company, product, or service names may be trademarks or service - marks of others. - - Links to full AMQP specification: - ================================= - http://www.amqp.org ---> - -<!-- - <!DOCTYPE amqp SYSTEM "amqp.dtd"> ---> - -<!-- XML Notes - - We use entities to indicate repetition; attributes to indicate properties. - - We use the 'name' attribute as an identifier, usually within the context - of the surrounding entities. - - We use spaces to seperate words in names, so that we can print names in - their natural form depending on the context - underlines for source code, - hyphens for written text, etc. - - We do not enforce any particular validation mechanism but we support all - mechanisms. The protocol definition conforms to a formal grammar that is - published seperately in several technologies. - - --> - -<amqp major="0" minor="9" revision="1" - port="5672" comment="AMQ Protocol version 0-9-1"> - <!-- - ====================================================== - == CONSTANTS - ====================================================== - --> - <!-- Frame types --> - <constant name="frame-method" value="1"/> - <constant name="frame-header" value="2"/> - <constant name="frame-body" value="3"/> - <constant name="frame-heartbeat" value="8"/> - - <!-- Protocol constants --> - <constant name="frame-min-size" value="4096"/> - <constant name="frame-end" value="206"/> - - <!-- Reply codes --> - <constant name="reply-success" value="200"> - <doc> - Indicates that the method completed successfully. This reply code is - reserved for future use - the current protocol design does not use - positive - confirmation and reply codes are sent only in case of an error. - </doc> - </constant> - - <constant name="content-too-large" value="311" class="soft-error"> - <doc> - The client attempted to transfer content larger than the server - could accept - at the present time. The client may retry at a later time. - </doc> - </constant> - - <constant name="no-consumers" value="313" class="soft-error"> - <doc> - When 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. - </doc> - </constant> - - <constant name="connection-forced" value="320" class="hard-error"> - <doc> - An operator intervened to close the connection for some reason. The - client - may retry at some later date. - </doc> - </constant> - - <constant name="invalid-path" value="402" class="hard-error"> - <doc> - The client tried to work with an unknown virtual host. - </doc> - </constant> - - <constant name="access-refused" value="403" class="soft-error"> - <doc> - The client attempted to work with a server entity to which it has no - access due to security settings. - </doc> - </constant> - - <constant name="not-found" value="404" class="soft-error"> - <doc> - The client attempted to work with a server entity that does not - exist. - </doc> - </constant> - - <constant name="resource-locked" value="405" class="soft-error"> - <doc> - The client attempted to work with a server entity to which it has no - access because another client is working with it. - </doc> - </constant> - - <constant name="precondition-failed" value="406" class="soft-error"> - <doc> - The client requested a method that was not allowed because some - precondition - failed. - </doc> - </constant> - - <constant name="frame-error" value="501" class="hard-error"> - <doc> - The sender sent a malformed frame that the recipient could not - decode. - This strongly implies a programming error in the sending peer. - </doc> - </constant> - - <constant name="syntax-error" value="502" class="hard-error"> - <doc> - The sender sent a frame that contained illegal values for one or - more - fields. This strongly implies a programming error in the sending - peer. - </doc> - </constant> - - <constant name="command-invalid" value="503" class="hard-error"> - <doc> - The client sent an invalid sequence of frames, attempting to perform - an - operation that was considered invalid by the server. This usually - implies - a programming error in the client. - </doc> - </constant> - - <constant name="channel-error" value="504" class="hard-error"> - <doc> - The client attempted to work with a channel that had not been - correctly - opened. This most likely indicates a fault in the client layer. - </doc> - </constant> - - <constant name="unexpected-frame" value="505" class="hard-error"> - <doc> - The peer sent a frame that was not expected, usually in the context - of - a content header and body. This strongly indicates a fault in the - peer's - content processing. - </doc> - </constant> - - <constant name="resource-error" value="506" class="hard-error"> - <doc> - The server could not complete the method because it lacked - sufficient - resources. This may be due to the client creating too many of some - type - of entity. - </doc> - </constant> - - <constant name="not-allowed" value="530" class="hard-error"> - <doc> - The client tried to work with some entity in a manner that is - prohibited - by the server, due to security settings or by some other criteria. - </doc> - </constant> - - <constant name="not-implemented" value="540" class="hard-error"> - <doc> - The client tried to use functionality that is not implemented in the - server. - </doc> - </constant> - - <constant name="internal-error" value="541" class="hard-error"> - <doc> - The server could not complete the method because of an internal - error. - The server may require intervention by an operator in order to - resume - normal operations. - </doc> - </constant> - - <!-- - ====================================================== - == DOMAIN TYPES - ====================================================== - --> - - <domain name="class-id" type="short"/> - - <domain name="consumer-tag" type="shortstr" label="consumer tag"> - <doc> - Identifier for the consumer, valid within the current channel. - </doc> - </domain> - - <domain name="delivery-tag" type="longlong" - label="server-assigned delivery tag"> - <doc> - The server-assigned and channel-specific delivery tag - </doc> - <rule name="channel-local"> - <doc> - The delivery tag is valid only within the channel from which the - message was - received. I.e. a client MUST NOT receive a message on one - channel and then - acknowledge it on another. - </doc> - </rule> - <rule name="non-zero"> - <doc> - The server MUST NOT use a zero value for delivery tags. Zero is - reserved - for client use, meaning "all messages so far received". - </doc> - </rule> - </domain> - - <domain name="exchange-name" type="shortstr" label="exchange name"> - <doc> - The exchange name is a client-selected string that identifies the - exchange for - publish methods. - </doc> - <assert check="length" value="127"/> - <assert check="regexp" value="^[a-zA-Z0-9-_.:]*$"/> - </domain> - - <domain name="method-id" type="short"/> - - <domain name="no-ack" type="bit" label="no acknowledgement needed"> - <doc> - 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 - assumes the delivery will succeed and immediately dequeues it. This - functionality may increase performance but at the cost of - reliability. - Messages can get lost if a client dies before they are delivered to - the - application. - </doc> - </domain> - - <domain name="no-local" type="bit" label="do not deliver own messages"> - <doc> - If the no-local field is set the server will not send messages to - the connection that - published them. - </doc> - </domain> - - <domain name="no-wait" type="bit" label="do not send reply method"> - <doc> - If set, the server will not respond to the method. The client should - not wait - for a reply method. If the server could not complete the method it - will raise a - channel or connection exception. - </doc> - </domain> - - <domain name="path" type="shortstr"> - <doc> - Unconstrained. - </doc> - <assert check="notnull"/> - <assert check="length" value="127"/> - </domain> - - <domain name="peer-properties" type="table"> - <doc> - This table provides a set of peer properties, used for - identification, debugging, - and general information. - </doc> - </domain> - - <domain name="queue-name" type="shortstr" label="queue name"> - <doc> - The queue name identifies the queue within the vhost. In methods - where the queue - name may be blank, and that has no specific significance, this - refers to the - 'current' queue for the channel, meaning the last queue that the - client declared - on the channel. If the client did not declare a queue, and the - method needs a - queue name, this will result in a 502 (syntax error) channel - exception. - </doc> - <assert check="length" value="127"/> - <assert check="regexp" value="^[a-zA-Z0-9-_.:]*$"/> - </domain> - - <domain name="redelivered" type="bit" label="message is being redelivered"> - <doc> - This indicates that the message has been previously delivered to - this or - another client. - </doc> - <rule name="implementation"> - <doc> - The server SHOULD try to signal redelivered messages when it - can. When - redelivering a message that was not successfully acknowledged, - the server - SHOULD deliver it to the original client if possible. - </doc> - <doc type="scenario"> - Declare a shared queue and publish a message to the queue. - Consume the - message using explicit acknowledgements, but do not acknowledge - the - message. Close the connection, reconnect, and consume from the - queue - again. The message should arrive with the redelivered flag set. - </doc> - </rule> - <rule name="hinting"> - <doc> - The client MUST NOT rely on the redelivered field but should - take it as a - hint that the message may already have been processed. A fully - robust - client must be able to track duplicate received messages on - non-transacted, - and locally-transacted channels. - </doc> - </rule> - </domain> - - <domain name="message-count" type="long" - label="number of messages in queue"> - <doc> - The number of messages in the queue, which will be zero for - newly-declared - queues. This is the number of messages present in the queue, and - committed - if the channel on which they were published is transacted, that are - not - waiting acknowledgement. - </doc> - </domain> - - <domain name="reply-code" type="short" label="reply code from server"> - <doc> - The reply code. The AMQ reply codes are defined as constants at the - start - of this formal specification. - </doc> - <assert check="notnull"/> - </domain> - - <domain name="reply-text" type="shortstr" label="localised reply text"> - <doc> - The localised reply text. This text can be logged as an aid to - resolving - issues. - </doc> - <assert check="notnull"/> - </domain> - - <!-- Elementary domains --> - <domain name="bit" type="bit" label="single bit"/> - <domain name="octet" type="octet" label="single octet"/> - <domain name="short" type="short" label="16-bit integer"/> - <domain name="long" type="long" label="32-bit integer"/> - <domain name="longlong" type="longlong" label="64-bit integer"/> - <domain name="shortstr" type="shortstr" label="short string"/> - <domain name="longstr" type="longstr" label="long string"/> - <domain name="timestamp" type="timestamp" label="64-bit timestamp"/> - <domain name="table" type="table" label="field table"/> - - <!-- == CONNECTION ======================================================= --> - - <class name="connection" handler="connection" index="10" - label="work with socket connections"> - <doc> - The connection class provides methods for a client to establish a - network connection to - a server, and for both peers to operate the connection thereafter. - </doc> - - <doc type="grammar"> - connection = open-connection *use-connection close-connection - open-connection = C:protocol-header - S:START C:START-OK - *challenge - S:TUNE C:TUNE-OK - C:OPEN S:OPEN-OK - challenge = S:SECURE C:SECURE-OK - use-connection = *channel - close-connection = C:CLOSE S:CLOSE-OK - / S:CLOSE C:CLOSE-OK - </doc> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="start" synchronous="1" index="10" - label="start connection negotiation"> - <doc> - This method starts the connection negotiation process by telling - the client the - protocol version that the server proposes, along with a list of - security mechanisms - which the client can use for authentication. - </doc> - - <rule name="protocol-name"> - <doc> - If the server cannot support the protocol specified in the - protocol header, - it MUST respond with a valid protocol header and then close - the socket - connection. - </doc> - <doc type="scenario"> - The client sends a protocol header containing an invalid - protocol name. - The server MUST respond by sending a valid protocol header - and then closing - the connection. - </doc> - </rule> - <rule name="server-support"> - <doc> - The server MUST provide a protocol version that is lower - than or equal to - that requested by the client in the protocol header. - </doc> - <doc type="scenario"> - The client requests a protocol version that is higher than - any valid - implementation, e.g. 2.0. The server must respond with a - protocol header - indicating its supported protocol version, e.g. 1.0. - </doc> - </rule> - <rule name="client-support"> - <doc> - If the client cannot handle the protocol version suggested - by the server - it MUST close the socket connection without sending any - further data. - </doc> - <doc type="scenario"> - 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 without sending any further data. - </doc> - </rule> - - <chassis name="client" implement="MUST"/> - <response name="start-ok"/> - - <field name="version-major" domain="octet" - label="protocol major version"> - <doc> - The major version number can take any value from 0 to 99 as - defined in the - AMQP specification. - </doc> - </field> - - <field name="version-minor" domain="octet" - label="protocol minor version"> - <doc> - The minor version number can take any value from 0 to 99 as - defined in the - AMQP specification. - </doc> - </field> - - <field name="server-properties" domain="peer-properties" - label="server properties"> - <rule name="required-fields"> - <doc> - 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. - </doc> - <doc type="scenario"> - Client connects to server and inspects the server - properties. It checks for - the presence of the required fields. - </doc> - </rule> - </field> - - <field name="mechanisms" domain="longstr" - label="available security mechanisms"> - <doc> - A list of the security mechanisms that the server supports, - delimited by spaces. - </doc> - <assert check="notnull"/> - </field> - - <field name="locales" domain="longstr" - label="available message locales"> - <doc> - A list of the message locales that the server supports, - delimited by spaces. The - locale defines the language in which the server will send - reply texts. - </doc> - <rule name="required-support"> - <doc> - The server MUST support at least the en_US locale. - </doc> - <doc type="scenario"> - Client connects to server and inspects the locales - field. It checks for - the presence of the required locale(s). - </doc> - </rule> - <assert check="notnull"/> - </field> - </method> - - <method name="start-ok" synchronous="1" index="11" - label="select security mechanism and locale"> - <doc> - This method selects a SASL security mechanism. - </doc> - - <chassis name="server" implement="MUST"/> - - <field name="client-properties" domain="peer-properties" - label="client properties"> - <rule name="required-fields"> - <!-- This rule is not testable from the client side --> - <doc> - 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. - </doc> - </rule> - </field> - - <field name="mechanism" domain="shortstr" - label="selected security mechanism"> - <doc> - A single security mechanisms selected by the client, which - must be one of those - specified by the server. - </doc> - <rule name="security"> - <doc> - The client SHOULD authenticate using the highest-level - security profile it - can handle from the list provided by the server. - </doc> - </rule> - <rule name="validity"> - <doc> - If the mechanism field does not contain one of the - security mechanisms - proposed by the server in the Start method, the server - MUST close the - connection without sending any further data. - </doc> - <doc type="scenario"> - 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). - </doc> - </rule> - <assert check="notnull"/> - </field> - - <field name="response" domain="longstr" - label="security response data"> - <doc> - A block of opaque data passed to the security mechanism. The - contents of this - data are defined by the SASL security mechanism. - </doc> - <assert check="notnull"/> - </field> - - <field name="locale" domain="shortstr" - label="selected message locale"> - <doc> - A single message locale selected by the client, which must - be one of those - specified by the server. - </doc> - <assert check="notnull"/> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="secure" synchronous="1" index="20" - label="security mechanism challenge"> - <doc> - The SASL protocol works by exchanging challenges and responses - until both peers have - received sufficient information to authenticate each other. This - method challenges - the client to provide more information. - </doc> - - <chassis name="client" implement="MUST"/> - <response name="secure-ok"/> - - <field name="challenge" domain="longstr" - label="security challenge data"> - <doc> - Challenge information, a block of opaque binary data passed - to the security - mechanism. - </doc> - </field> - </method> - - <method name="secure-ok" synchronous="1" index="21" - label="security mechanism response"> - <doc> - This method attempts to authenticate, passing a block of SASL - data for the security - mechanism at the server side. - </doc> - - <chassis name="server" implement="MUST"/> - - <field name="response" domain="longstr" - label="security response data"> - <doc> - A block of opaque data passed to the security mechanism. The - contents of this - data are defined by the SASL security mechanism. - </doc> - <assert check="notnull"/> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="tune" synchronous="1" index="30" - label="propose connection tuning parameters"> - <doc> - This method proposes a set of connection configuration values to - the client. The - client can accept and/or adjust these. - </doc> - - <chassis name="client" implement="MUST"/> - - <response name="tune-ok"/> - - <field name="channel-max" domain="short" - label="proposed maximum channels"> - <doc> - Specifies highest channel number that the server permits. - Usable channel numbers - are in the range 1..channel-max. Zero indicates no specified - limit. - </doc> - </field> - - <field name="frame-max" domain="long" - label="proposed maximum frame size"> - <doc> - The largest frame size that the server proposes for the - connection, including - frame header and end-byte. The client can negotiate a lower - value. Zero means - that the server does not impose any specific limit but may - reject very large - frames if it cannot allocate resources for them. - </doc> - <rule name="minimum"> - <doc> - Until the frame-max has been negotiated, both peers MUST - accept frames of up - to frame-min-size octets large, and the minimum - negotiated value for frame-max - is also frame-min-size. - </doc> - <doc type="scenario"> - Client connects to server and sends a large properties - field, creating a frame - of frame-min-size octets. The server must accept this - frame. - </doc> - </rule> - </field> - - <field name="heartbeat" domain="short" - label="desired heartbeat delay"> - <doc> - The delay, in seconds, of the connection heartbeat that the - server wants. - Zero means the server does not want a heartbeat. - </doc> - </field> - </method> - - <method name="tune-ok" synchronous="1" index="31" - label="negotiate connection tuning parameters"> - <doc> - This method sends the client's connection tuning parameters to - the server. - Certain fields are negotiated, others provide capability - information. - </doc> - - <chassis name="server" implement="MUST"/> - - <field name="channel-max" domain="short" - label="negotiated maximum channels"> - <doc> - The maximum total number of channels that the client will - use per connection. - </doc> - <rule name="upper-limit"> - <doc> - If the client specifies a channel max that is higher - than the value provided - by the server, the server MUST close the connection - without attempting a - negotiated close. The server may report the error in - some fashion to assist - implementors. - </doc> - </rule> - <assert check="notnull"/> - <assert check="le" method="tune" field="channel-max"/> - </field> - - <field name="frame-max" domain="long" - label="negotiated maximum frame size"> - <doc> - The largest frame size that the client and server will use - for the connection. - Zero means that the client does not impose any specific - limit but may reject - very large frames if it cannot allocate resources for them. - Note that the - frame-max limit applies principally to content frames, where - large contents can - be broken into frames of arbitrary size. - </doc> - <rule name="minimum"> - <doc> - Until the frame-max has been negotiated, both peers MUST - accept frames of up - to frame-min-size octets large, and the minimum - negotiated value for frame-max - is also frame-min-size. - </doc> - </rule> - <rule name="upper-limit"> - <doc> - If the client specifies a frame max that is higher than - the value provided - by the server, the server MUST close the connection - without attempting a - negotiated close. The server may report the error in - some fashion to assist - implementors. - </doc> - </rule> - </field> - - <field name="heartbeat" domain="short" - label="desired heartbeat delay"> - <doc> - The delay, in seconds, of the connection heartbeat that the - client wants. Zero - means the client does not want a heartbeat. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="open" synchronous="1" index="40" - label="open connection to virtual host"> - <doc> - This method opens a connection to a virtual host, which is a - collection of - resources, and acts to separate multiple application domains - within a server. - The server may apply arbitrary limits per virtual host, such as - the number - of each type of entity that may be used, per connection and/or - in total. - </doc> - - <chassis name="server" implement="MUST"/> - <response name="open-ok"/> - - <field name="virtual-host" domain="path" label="virtual host name"> - <doc> - The name of the virtual host to work with. - </doc> - <rule name="separation"> - <doc> - 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. - </doc> - </rule> - <rule name="security"> - <doc> - The server SHOULD verify that the client has permission - to access the - specified virtual host. - </doc> - </rule> - </field> - <!-- Deprecated: "capabilities", must be zero --> - <field name="reserved-1" type="shortstr" reserved="1"/> - <!-- Deprecated: "insist", must be zero --> - <field name="reserved-2" type="bit" reserved="1"/> - </method> - - <method name="open-ok" synchronous="1" index="41" - label="signal that connection is ready"> - <doc> - This method signals to the client that the connection is ready - for use. - </doc> - <chassis name="client" implement="MUST"/> - <!-- Deprecated: "known-hosts", must be zero --> - <field name="reserved-1" type="shortstr" reserved="1"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="close" synchronous="1" index="50" - label="request a connection close"> - <doc> - This method indicates that the sender wants to close the - connection. This may be - due to internal conditions (e.g. a forced shut-down) or due to - an error handling - a specific method, i.e. an exception. When a close is due to an - exception, the - sender provides the class and method id of the method which - caused the exception. - </doc> - <rule name="stability"> - <doc> - After sending this method, any received methods except Close - and Close-OK MUST - be discarded. The response to receiving a Close after - sending Close must be to - send Close-Ok. - </doc> - </rule> - - <chassis name="client" implement="MUST"/> - <chassis name="server" implement="MUST"/> - <response name="close-ok"/> - - <field name="reply-code" domain="reply-code"/> - <field name="reply-text" domain="reply-text"/> - - <field name="class-id" domain="class-id" - label="failing method class"> - <doc> - When the close is provoked by a method exception, this is - the class of the - method. - </doc> - </field> - - <field name="method-id" domain="method-id" - label="failing method ID"> - <doc> - When the close is provoked by a method exception, this is - the ID of the method. - </doc> - </field> - </method> - - <method name="close-ok" synchronous="1" index="51" - label="confirm a connection close"> - <doc> - This method confirms a Connection.Close method and tells the - recipient that it is - safe to release resources for the connection and close the - socket. - </doc> - <rule name="reporting"> - <doc> - A peer that detects a socket closure without having received - a Close-Ok - handshake method SHOULD log the error. - </doc> - </rule> - <chassis name="client" implement="MUST"/> - <chassis name="server" implement="MUST"/> - </method> - - <method name="blocked" index="60"> - <doc> - This method indicates that a connection has been blocked - and does not accept new publishes. - </doc> - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - <field name="reason" domain="shortstr"/> - </method> - <method name="unblocked" index="61"> - <doc> - This method indicates that a connection has been unblocked - and now accepts publishes. - </doc> - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - </method> - </class> - - <!-- == CHANNEL ========================================================== --> - - <class name="channel" handler="channel" index="20" - label="work with channels"> - <doc> - The channel class provides methods for a client to establish a - channel to a - server and for both peers to operate the channel thereafter. - </doc> - - <doc type="grammar"> - channel = open-channel *use-channel close-channel - open-channel = C:OPEN S:OPEN-OK - use-channel = C:FLOW S:FLOW-OK - / S:FLOW C:FLOW-OK - / functional-class - close-channel = C:CLOSE S:CLOSE-OK - / S:CLOSE C:CLOSE-OK - </doc> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="open" synchronous="1" index="10" - label="open a channel for use"> - <doc> - This method opens a channel to the server. - </doc> - <rule name="state" on-failure="channel-error"> - <doc> - The client MUST NOT use this method on an already-opened - channel. - </doc> - <doc type="scenario"> - Client opens a channel and then reopens the same channel. - </doc> - </rule> - <chassis name="server" implement="MUST"/> - <response name="open-ok"/> - <!-- Deprecated: "out-of-band", must be zero --> - <field name="reserved-1" type="shortstr" reserved="1"/> - </method> - - <method name="open-ok" synchronous="1" index="11" - label="signal that the channel is ready"> - <doc> - This method signals to the client that the channel is ready for - use. - </doc> - <chassis name="client" implement="MUST"/> - <!-- Deprecated: "channel-id", must be zero --> - <field name="reserved-1" type="longstr" reserved="1"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="flow" synchronous="1" index="20" - label="enable/disable flow from peer"> - <doc> - This method asks the peer to pause or restart the flow of - content data sent by - a consumer. This is a simple flow-control mechanism that a peer - can use to avoid - overflowing its queues or otherwise finding itself receiving - more messages than - it can process. Note that this method is not intended for window - control. It does - not affect contents returned by Basic.Get-Ok methods. - </doc> - - <rule name="initial-state"> - <doc> - When a new channel is opened, it is active (flow is active). - Some applications - assume that channels are inactive until started. To emulate - this behaviour a - client MAY open the channel, then pause it. - </doc> - </rule> - - <rule name="bidirectional"> - <doc> - When sending content frames, a peer SHOULD monitor the - channel for incoming - methods and respond to a Channel.Flow as rapidly as - possible. - </doc> - </rule> - - <rule name="throttling"> - <doc> - A peer MAY use the Channel.Flow method to throttle incoming - content data for - internal reasons, for example, when exchanging data over a - slower connection. - </doc> - </rule> - - <rule name="expected-behaviour"> - <doc> - The peer that requests a Channel.Flow method MAY disconnect - and/or ban a peer - that does not respect the request. This is to prevent - badly-behaved clients - from overwhelming a server. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <response name="flow-ok"/> - - <field name="active" domain="bit" label="start/stop content frames"> - <doc> - If 1, the peer starts sending content frames. If 0, the peer - stops sending - content frames. - </doc> - </field> - </method> - - <method name="flow-ok" index="21" label="confirm a flow method"> - <doc> - Confirms to the peer that a flow command was received and - processed. - </doc> - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - <field name="active" domain="bit" label="current flow setting"> - <doc> - Confirms the setting of the processed flow method: 1 means - the peer will start - sending or continue to send content frames; 0 means it will - not. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="close" synchronous="1" index="40" - label="request a channel close"> - <doc> - This method indicates that the sender wants to close the - channel. This may be due to - internal conditions (e.g. a forced shut-down) or due to an error - handling a specific - method, i.e. an exception. When a close is due to an exception, - the sender provides - the class and method id of the method which caused the - exception. - </doc> - <rule name="stability"> - <doc> - After sending this method, any received methods except Close - and Close-OK MUST - be discarded. The response to receiving a Close after - sending Close must be to - send Close-Ok. - </doc> - </rule> - - <chassis name="client" implement="MUST"/> - <chassis name="server" implement="MUST"/> - <response name="close-ok"/> - - <field name="reply-code" domain="reply-code"/> - <field name="reply-text" domain="reply-text"/> - - <field name="class-id" domain="class-id" - label="failing method class"> - <doc> - When the close is provoked by a method exception, this is - the class of the - method. - </doc> - </field> - - <field name="method-id" domain="method-id" - label="failing method ID"> - <doc> - When the close is provoked by a method exception, this is - the ID of the method. - </doc> - </field> - </method> - - <method name="close-ok" synchronous="1" index="41" - label="confirm a channel close"> - <doc> - This method confirms a Channel.Close method and tells the - recipient that it is safe - to release resources for the channel. - </doc> - <rule name="reporting"> - <doc> - A peer that detects a socket closure without having received - a Channel.Close-Ok - handshake method SHOULD log the error. - </doc> - </rule> - <chassis name="client" implement="MUST"/> - <chassis name="server" implement="MUST"/> - </method> - </class> - - <!-- == EXCHANGE ========================================================= --> - - <class name="exchange" handler="channel" index="40" - label="work with exchanges"> - <doc> - Exchanges match and distribute messages across queues. Exchanges can - be configured in - the server or declared at runtime. - </doc> - - <doc type="grammar"> - exchange = C:DECLARE S:DECLARE-OK - / C:DELETE S:DELETE-OK - / C:BIND S:BIND-OK - / C:UNBIND S:UNBIND-OK - </doc> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <rule name="required-types"> - <doc> - The server MUST implement these standard exchange types: fanout, - direct. - </doc> - <doc type="scenario"> - Client attempts to declare an exchange with each of these - standard types. - </doc> - </rule> - <rule name="recommended-types"> - <doc> - The server SHOULD implement these standard exchange types: - topic, headers. - </doc> - <doc type="scenario"> - Client attempts to declare an exchange with each of these - standard types. - </doc> - </rule> - <rule name="required-instances"> - <doc> - 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. - </doc> - <doc> - The server MUST, in each virtual host, pre-declare at least two - direct - exchange instances: one named "amq.direct", the other with no - public name - that serves as a default exchange for Publish methods. - </doc> - <doc type="scenario"> - Client declares 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). - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST pre-declare a direct exchange with no public - name to act as - the default exchange for content Publish methods and for default - queue bindings. - </doc> - <doc type="scenario"> - Client checks that the default exchange is active by specifying - a queue - binding with no exchange name, and publishing a message with a - suitable - routing key but without specifying the exchange name, then - ensuring that - the message arrives in the queue correctly. - </doc> - </rule> - <rule name="default-access"> - <doc> - The server MUST NOT allow clients to access the default exchange - except - by specifying an empty exchange name in the Queue.Bind and - content Publish - methods. - </doc> - </rule> - <rule name="extensions"> - <doc> - The server MAY implement other exchange types as wanted. - </doc> - </rule> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="declare" synchronous="1" index="10" - label="verify exchange exists, create if needed"> - <doc> - This method creates an exchange if it does not already exist, - and if the exchange - exists, verifies that it is of the correct and expected class. - </doc> - <rule name="minimum"> - <doc> - The server SHOULD support a minimum of 16 exchanges per - virtual host and - ideally, impose no limit except as defined by available - resources. - </doc> - <doc type="scenario"> - The client declares as many exchanges as it can until the - server reports - an error; the number of exchanges successfully declared must - be at least - sixteen. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - <response name="declare-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="exchange" domain="exchange-name"> - <rule name="reserved" on-failure="access-refused"> - <doc> - Exchange names starting with "amq." are reserved for - pre-declared and - standardised exchanges. The client MAY declare an - exchange starting with - "amq." if the passive option is set, or the exchange - already exists. - </doc> - <doc type="scenario"> - The client attempts to declare a non-existing exchange - starting with - "amq." and with the passive option set to zero. - </doc> - </rule> - <rule name="syntax" on-failure="precondition-failed"> - <doc> - The exchange name consists of a non-empty sequence of - these characters: - letters, digits, hyphen, underscore, period, or colon. - </doc> - <doc type="scenario"> - The client attempts to declare an exchange with an - illegal name. - </doc> - </rule> - <assert check="notnull"/> - </field> - - <field name="type" domain="shortstr" label="exchange type"> - <doc> - 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. - </doc> - <rule name="typed" on-failure="not-allowed"> - <doc> - Exchanges cannot be redeclared with different types. The - client MUST not - attempt to redeclare an existing exchange with a - different type than used - in the original Exchange.Declare method. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - <rule name="support" on-failure="command-invalid"> - <doc> - The client MUST NOT attempt to declare an exchange with - a type that the - server does not support. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="passive" domain="bit" label="do not create exchange"> - <doc> - If set, the server will reply with Declare-Ok if the - exchange already - exists with the same name, and raise an error if not. The - client can - use this to check whether an exchange exists without - modifying the - server state. When set, all other method fields except name - and no-wait - are ignored. A declare with both passive and no-wait has no - effect. - Arguments are compared for semantic equivalence. - </doc> - <rule name="not-found"> - <doc> - If set, and the exchange does not already exist, the - server MUST - raise a channel exception with reply code 404 (not - found). - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - <rule name="equivalent"> - <doc> - If not set and the exchange exists, the server MUST - check that the - existing exchange has the same values for type, durable, - and arguments - fields. The server MUST respond with Declare-Ok if the - requested - exchange matches these fields, and MUST raise a channel - exception if - not. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="durable" domain="bit" - label="request a durable exchange"> - <doc> - 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. - </doc> - <rule name="support"> - <doc> - The server MUST support both durable and transient - exchanges. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="auto-delete" domain="bit" - label="auto-delete when unused"> - <doc> - If set, the exchange is deleted when all queues have - finished using it. - </doc> - <rule name="amq_exchange_02"> - <doc> - The server SHOULD allow for a reasonable delay between - the - point when it determines that an exchange is not being - used (or no longer used), and the point when it deletes - the exchange. At the least it must allow a client to - create an exchange and then bind a queue to it, with a - small but non-zero delay between these two actions. - </doc> - </rule> - <rule name="amq_exchange_25"> - <doc> - The server MUST ignore the auto-delete field if the - exchange already exists. - </doc> - </rule> - </field> - - <field name="internal" domain="bit" - label="create internal exchange"> - <doc> - If set, the exchange may not be used directly by publishers, - but only when bound to other exchanges. Internal exchanges - are used to construct wiring that is not visible to - applications. - </doc> - </field> - - <field name="no-wait" domain="no-wait"/> - - <field name="arguments" domain="table" - label="arguments for declaration"> - <doc> - A set of arguments for the declaration. The syntax and - semantics of these - arguments depends on the server implementation. - </doc> - </field> - </method> - - <method name="declare-ok" synchronous="1" index="11" - label="confirm exchange declaration"> - <doc> - This method confirms a Declare method and confirms the name of - the exchange, - essential for automatically-named exchanges. - </doc> - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="delete" synchronous="1" index="20" - label="delete an exchange"> - <doc> - This method deletes an exchange. When an exchange is deleted all - queue bindings on - the exchange are cancelled. - </doc> - - <chassis name="server" implement="MUST"/> - <response name="delete-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="exchange" domain="exchange-name"> - <rule name="exists" on-failure="not-found"> - <doc> - The client MUST NOT attempt to delete an exchange that - does not exist. - </doc> - </rule> - <assert check="notnull"/> - </field> - - <field name="if-unused" domain="bit" label="delete only if unused"> - <doc> - If set, the server will only delete the exchange if it has - no queue bindings. If - the exchange has queue bindings the server does not delete - it but raises a - channel exception instead. - </doc> - <rule name="in-use" on-failure="precondition-failed"> - <doc> - The server MUST NOT delete an exchange that has bindings - on it, if the if-unused - field is true. - </doc> - <doc type="scenario"> - The client declares an exchange, binds a queue to it, - then tries to delete it - setting if-unused to true. - </doc> - </rule> - </field> - - <field name="no-wait" domain="no-wait"/> - </method> - - <method name="delete-ok" synchronous="1" index="21" - label="confirm deletion of an exchange"> - <doc>This method confirms the deletion of an exchange.</doc> - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="bind" synchronous="1" index="30" - label="bind exchange to an exchange"> - - <doc>This method binds an exchange to an exchange.</doc> - - <rule name="duplicates"> - <doc> - A server MUST allow and ignore duplicate bindings - that is, - two or more bind methods for a specific exchanges, with - identical arguments - without treating these as an error. - </doc> - <doc type="scenario"> - A client binds an exchange to an exchange. The client then - repeats the bind (with identical arguments). - </doc> - </rule> - - <rule name="cyclical"> - <doc> - A server MUST allow cycles of exchange bindings to be - created including allowing an exchange to be bound to - itself. - </doc> - <doc type="scenario"> - A client declares an exchange and binds it to itself. - </doc> - </rule> - - <rule name="unique"> - <doc> - A server MUST not deliver the same message more than once to - a destination exchange, even if the topology of exchanges - and bindings results in multiple (even infinite) routes to - that exchange. - </doc> - <doc type="scenario"> - A client declares an exchange and binds it using multiple - bindings to the amq.topic exchange. The client then - publishes a message to the amq.topic exchange that matches - all the bindings. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - - <response name="bind-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="destination" domain="exchange-name" - label="name of the destination exchange to bind to"> - <doc>Specifies the name of the destination exchange to bind. - </doc> - <rule name="exchange-existence" on-failure="not-found"> - <doc> - A client MUST NOT be allowed to bind a non-existent - destination exchange. - </doc> - <doc type="scenario"> - A client attempts to bind an undeclared exchange to an - exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares an exchange and binds a blank - exchange - name to it. - </doc> - </rule> - </field> - - <field name="source" domain="exchange-name" - label="name of the source exchange to bind to"> - <doc>Specifies the name of the source exchange to bind.</doc> - <rule name="exchange-existence" on-failure="not-found"> - <doc> - A client MUST NOT be allowed to bind a non-existent - source - exchange. - </doc> - <doc type="scenario"> - A client attempts to bind an exchange to an undeclared - exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares an exchange and binds it to a blank - exchange name. - </doc> - </rule> - </field> - - <field name="routing-key" domain="shortstr" - label="message routing key"> - <doc> - Specifies the routing key for the binding. The routing key - is used for routing messages depending on the exchange - configuration. Not all exchanges use a routing key - refer - to the specific exchange documentation. - </doc> - </field> - - <field name="no-wait" domain="no-wait"/> - - <field name="arguments" domain="table" - label="arguments for binding"> - <doc> - A set of arguments for the binding. The syntax and semantics - of these arguments depends on the exchange class. - </doc> - </field> - </method> - - <method name="bind-ok" synchronous="1" index="31" - label="confirm bind successful"> - <doc>This method confirms that the bind was successful.</doc> - - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="unbind" synchronous="1" index="40" - label="unbind an exchange from an exchange"> - <doc>This method unbinds an exchange from an exchange.</doc> - <rule name="01"> - <doc>If a unbind fails, the server MUST raise a connection - exception. - </doc> - </rule> - <chassis name="server" implement="MUST"/> - <response name="unbind-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="destination" domain="exchange-name"> - <doc>Specifies the name of the destination exchange to unbind. - </doc> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to unbind an exchange that - does not exist from an exchange. - </doc> - <doc type="scenario"> - The client attempts to unbind a non-existent exchange - from - an exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares an exchange, binds a blank exchange - name to it, and then unbinds a blank exchange name from - it. - </doc> - </rule> - </field> - - <field name="source" domain="exchange-name"> - <doc>Specifies the name of the source exchange to unbind.</doc> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to unbind an exchange from - an - exchange that does not exist. - </doc> - <doc type="scenario"> - The client attempts to unbind an exchange from a - non-existent exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares an exchange, binds an exchange to a - blank exchange name, and then unbinds an exchange from a - black exchange name. - </doc> - </rule> - </field> - - <field name="routing-key" domain="shortstr" - label="routing key of binding"> - <doc>Specifies the routing key of the binding to unbind.</doc> - </field> - - <field name="no-wait" domain="no-wait"/> - - <field name="arguments" domain="table" - label="arguments of binding"> - <doc>Specifies the arguments of the binding to unbind.</doc> - </field> - </method> - - <method name="unbind-ok" synchronous="1" index="51" - label="confirm unbind successful"> - <doc>This method confirms that the unbind was successful.</doc> - <chassis name="client" implement="MUST"/> - </method> - - </class> - - <!-- == QUEUE ============================================================ --> - - <class name="queue" handler="channel" index="50" label="work with queues"> - <doc> - 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. - </doc> - - <doc type="grammar"> - queue = C:DECLARE S:DECLARE-OK - / C:BIND S:BIND-OK - / C:UNBIND S:UNBIND-OK - / C:PURGE S:PURGE-OK - / C:DELETE S:DELETE-OK - </doc> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="declare" synchronous="1" index="10" - label="declare queue, create if needed"> - <doc> - This method creates or checks a queue. When creating a new queue - the client can - specify various properties that control the durability of the - queue and its - contents, and the level of sharing for the queue. - </doc> - - <rule name="default-binding"> - <doc> - The server MUST create a default binding for a - newly-declared queue to the - default exchange, which is an exchange of type 'direct' and - use the queue - name as the routing key. - </doc> - <doc type="scenario"> - Client declares 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 routing - key. - </doc> - </rule> - - <rule name="minimum-queues"> - <doc> - The server SHOULD support a minimum of 256 queues per - virtual host and ideally, - impose no limit except as defined by available resources. - </doc> - <doc type="scenario"> - Client attempts to declare as many queues as it can until - the server reports - an error. The resulting count must at least be 256. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - <response name="declare-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <rule name="default-name"> - <doc> - The queue name MAY be empty, in which case the server - MUST create a new - queue with a unique generated name and return this to - the client in the - Declare-Ok method. - </doc> - <doc type="scenario"> - Client attempts to declare several queues with an empty - name. The client then - verifies that the server-assigned names are unique and - different. - </doc> - </rule> - <rule name="reserved" on-failure="access-refused"> - <doc> - Queue names starting with "amq." are reserved for - pre-declared and - standardised queues. The client MAY declare a queue - starting with - "amq." if the passive option is set, or the queue - already exists. - </doc> - <doc type="scenario"> - The client attempts to declare a non-existing queue - starting with - "amq." and with the passive option set to zero. - </doc> - </rule> - <rule name="syntax" on-failure="precondition-failed"> - <doc> - The queue name can be empty, or a sequence of these - characters: - letters, digits, hyphen, underscore, period, or colon. - </doc> - <doc type="scenario"> - The client attempts to declare a queue with an illegal - name. - </doc> - </rule> - </field> - - <field name="passive" domain="bit" label="do not create queue"> - <doc> - If set, the server will reply with Declare-Ok if the queue - already - exists with the same name, and raise an error if not. The - client can - use this to check whether a queue exists without modifying - the - server state. When set, all other method fields except name - and no-wait - are ignored. A declare with both passive and no-wait has no - effect. - Arguments are compared for semantic equivalence. - </doc> - <rule name="passive" on-failure="not-found"> - <doc> - 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. - </doc> - <doc type="scenario"> - Client declares an existing queue with the passive - option and expects - the server to respond with a declare-ok. Client then - attempts to declare - a non-existent queue with the passive option, and the - server must close - the channel with the correct reply-code. - </doc> - </rule> - <rule name="equivalent"> - <doc> - If not set and the queue exists, the server MUST check - that the - existing queue has the same values for durable, - exclusive, auto-delete, - and arguments fields. The server MUST respond with - Declare-Ok if the - requested queue matches these fields, and MUST raise a - channel exception - if not. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="durable" domain="bit" label="request a durable queue"> - <doc> - 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. - </doc> - - <rule name="persistence"> - <doc>The server MUST recreate the durable queue after a - restart. - </doc> - - <doc type="scenario"> - Client declares a durable queue. The server is then - restarted. The client - then attempts to send a message to the queue. The - message should be successfully - delivered. - </doc> - </rule> - - <rule name="types"> - <doc>The server MUST support both durable and transient - queues. - </doc> - <doc type="scenario"> - A client declares two named queues, one durable and one - transient. - </doc> - </rule> - </field> - - <field name="exclusive" domain="bit" - label="request an exclusive queue"> - <doc> - Exclusive queues may only be accessed by the current - connection, and are - deleted when that connection closes. Passive declaration of - an exclusive - queue by other connections are not allowed. - </doc> - - <rule name="types"> - <doc> - The server MUST support both exclusive (private) and - non-exclusive (shared) - queues. - </doc> - <doc type="scenario"> - A client declares two named queues, one exclusive and - one non-exclusive. - </doc> - </rule> - - <rule name="exclusive" on-failure="resource-locked"> - <doc> - The client MAY NOT attempt to use a queue that was - declared as exclusive - by another still-open connection. - </doc> - <doc type="scenario"> - One client declares an exclusive queue. A second client - on a different - connection attempts to declare, bind, consume, purge, - delete, or declare - a queue of the same name. - </doc> - </rule> - </field> - - <field name="auto-delete" domain="bit" - label="auto-delete queue when unused"> - <doc> - If set, the queue is deleted when all consumers have - finished using it. The last - consumer can be cancelled either explicitly or because its - channel is closed. If - there was no consumer ever on the queue, it won't be - deleted. Applications can - explicitly delete auto-delete queues using the Delete method - as normal. - </doc> - - <rule name="pre-existence"> - <doc> - The server MUST ignore the auto-delete field if the - queue already exists. - </doc> - <doc type="scenario"> - Client declares two named queues, one as auto-delete and - one explicit-delete. - 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. - </doc> - </rule> - </field> - - <field name="no-wait" domain="no-wait"/> - - <field name="arguments" domain="table" - label="arguments for declaration"> - <doc> - A set of arguments for the declaration. The syntax and - semantics of these - arguments depends on the server implementation. - </doc> - </field> - </method> - - <method name="declare-ok" synchronous="1" index="11" - label="confirms a queue definition"> - <doc> - This method confirms a Declare method and confirms the name of - the queue, essential - for automatically-named queues. - </doc> - - <chassis name="client" implement="MUST"/> - - <field name="queue" domain="queue-name"> - <doc> - Reports the name of the queue. If the server generated a - queue name, this field - contains that name. - </doc> - <assert check="notnull"/> - </field> - - <field name="message-count" domain="message-count"/> - - <field name="consumer-count" domain="long" - label="number of consumers"> - <doc> - Reports the number of active consumers for the queue. Note - that consumers can - suspend activity (Channel.Flow) in which case they do not - appear in this count. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="bind" synchronous="1" index="20" - label="bind queue to an exchange"> - <doc> - This method 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. - </doc> - - <rule name="duplicates"> - <doc> - A server MUST allow ignore duplicate bindings - that is, two - or more bind - methods for a specific queue, with identical arguments - - without treating these - as an error. - </doc> - <doc type="scenario"> - A client binds a named queue to an exchange. The client then - repeats the bind - (with identical arguments). - </doc> - </rule> - - <rule name="unique"> - <doc> - A server MUST not deliver the same message more than once to - a queue, even if - the queue has multiple bindings that match the message. - </doc> - <doc type="scenario"> - A client declares a named queue and binds it using multiple - bindings to the - amq.topic exchange. The client then publishes a message that - matches all its - bindings. - </doc> - </rule> - - <rule name="transient-exchange"> - <doc> - The server MUST allow a durable queue to bind to a transient - exchange. - </doc> - <doc type="scenario"> - A client declares a transient exchange. The client then - declares a named durable - queue and then attempts to bind the transient exchange to - the durable queue. - </doc> - </rule> - - <rule name="durable-exchange"> - <doc> - Bindings of durable queues to durable exchanges are - automatically durable - and the server MUST restore such bindings after a server - restart. - </doc> - <doc type="scenario"> - A server declares 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. - </doc> - </rule> - - <rule name="binding-count"> - <doc> - The server SHOULD support at least 4 bindings per queue, and - ideally, impose no - limit except as defined by available resources. - </doc> - <doc type="scenario"> - A client declares a named queue and attempts to bind it to 4 - different - exchanges. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - - <response name="bind-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <doc>Specifies the name of the queue to bind.</doc> - <rule name="queue-known" on-failure="not-found"> - <doc> - The client MUST either specify a queue name or have - previously declared a - queue on the same channel - </doc> - <doc type="scenario"> - The client opens a channel and attempts to bind an - unnamed queue. - </doc> - </rule> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to bind a queue that does - not exist. - </doc> - <doc type="scenario"> - The client attempts to bind a non-existent queue. - </doc> - </rule> - </field> - - <field name="exchange" domain="exchange-name" - label="name of the exchange to bind to"> - <rule name="exchange-existence" on-failure="not-found"> - <doc> - A client MUST NOT be allowed to bind a queue to a - non-existent exchange. - </doc> - <doc type="scenario"> - A client attempts to bind an named queue to a undeclared - exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares a queue and binds it to a blank - exchange name. - </doc> - </rule> - </field> - - <field name="routing-key" domain="shortstr" - label="message routing key"> - <doc> - Specifies the routing key for the binding. The routing key - is used for routing - messages depending on the exchange configuration. Not all - exchanges use a - routing key - refer to the specific exchange documentation. - If the queue name - is empty, the server uses the last queue declared on the - channel. If the - routing key is also empty, the server uses this queue name - for the routing - key as well. If the queue name is provided but the routing - key is empty, the - server does the binding with that empty routing key. The - meaning of empty - routing keys depends on the exchange implementation. - </doc> - <rule name="direct-exchange-key-matching"> - <doc> - If a message queue binds to a direct exchange using - routing key K and a - publisher sends the exchange a message with routing key - R, then the message - MUST be passed to the message queue if K = R. - </doc> - </rule> - </field> - - <field name="no-wait" domain="no-wait"/> - - <field name="arguments" domain="table" - label="arguments for binding"> - <doc> - A set of arguments for the binding. The syntax and semantics - of these arguments - depends on the exchange class. - </doc> - </field> - </method> - - <method name="bind-ok" synchronous="1" index="21" - label="confirm bind successful"> - <doc>This method confirms that the bind was successful.</doc> - - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="unbind" synchronous="1" index="50" - label="unbind a queue from an exchange"> - <doc>This method unbinds a queue from an exchange.</doc> - <rule name="01"> - <doc>If a unbind fails, the server MUST raise a connection - exception. - </doc> - </rule> - <chassis name="server" implement="MUST"/> - <response name="unbind-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <doc>Specifies the name of the queue to unbind.</doc> - <rule name="queue-known" on-failure="not-found"> - <doc> - The client MUST either specify a queue name or have - previously declared a - queue on the same channel - </doc> - <doc type="scenario"> - The client opens a channel and attempts to unbind an - unnamed queue. - </doc> - </rule> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to unbind a queue that does - not exist. - </doc> - <doc type="scenario"> - The client attempts to unbind a non-existent queue. - </doc> - </rule> - </field> - - <field name="exchange" domain="exchange-name"> - <doc>The name of the exchange to unbind from.</doc> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to unbind a queue from an - exchange that - does not exist. - </doc> - <doc type="scenario"> - The client attempts to unbind a queue from a - non-existent exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares a queue and binds it to a blank - exchange name. - </doc> - </rule> - </field> - - <field name="routing-key" domain="shortstr" - label="routing key of binding"> - <doc>Specifies the routing key of the binding to unbind.</doc> - </field> - - <field name="arguments" domain="table" label="arguments of binding"> - <doc>Specifies the arguments of the binding to unbind.</doc> - </field> - </method> - - <method name="unbind-ok" synchronous="1" index="51" - label="confirm unbind successful"> - <doc>This method confirms that the unbind was successful.</doc> - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="purge" synchronous="1" index="30" label="purge a queue"> - <doc> - This method removes all messages from a queue which are not - awaiting - acknowledgment. - </doc> - - <rule name="02"> - <doc> - The server MUST NOT purge messages that have already been - sent to a client - but not yet acknowledged. - </doc> - </rule> - - <rule name="03"> - <doc> - 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. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - - <response name="purge-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <doc>Specifies the name of the queue to purge.</doc> - <rule name="queue-known" on-failure="not-found"> - <doc> - The client MUST either specify a queue name or have - previously declared a - queue on the same channel - </doc> - <doc type="scenario"> - The client opens a channel and attempts to purge an - unnamed queue. - </doc> - </rule> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to purge a queue that does - not exist. - </doc> - <doc type="scenario"> - The client attempts to purge a non-existent queue. - </doc> - </rule> - </field> - - <field name="no-wait" domain="no-wait"/> - </method> - - <method name="purge-ok" synchronous="1" index="31" - label="confirms a queue purge"> - <doc>This method confirms the purge of a queue.</doc> - - <chassis name="client" implement="MUST"/> - - <field name="message-count" domain="message-count"> - <doc> - Reports the number of messages purged. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="delete" synchronous="1" index="40" label="delete a queue"> - <doc> - This method deletes a queue. When a queue is deleted any pending - messages are sent - to a dead-letter queue if this is defined in the server - configuration, and all - consumers on the queue are cancelled. - </doc> - - <rule name="01"> - <doc> - The server SHOULD use a dead-letter queue to hold messages - that were pending on - a deleted queue, and MAY provide facilities for a system - administrator to move - these messages back to an active queue. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - - <response name="delete-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <doc>Specifies the name of the queue to delete.</doc> - <rule name="queue-known" on-failure="not-found"> - <doc> - The client MUST either specify a queue name or have - previously declared a - queue on the same channel - </doc> - <doc type="scenario"> - The client opens a channel and attempts to delete an - unnamed queue. - </doc> - </rule> - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to delete a queue that does - not exist. - </doc> - <doc type="scenario"> - The client attempts to delete a non-existent queue. - </doc> - </rule> - </field> - - <field name="if-unused" domain="bit" label="delete only if unused"> - <doc> - 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 a channel - exception instead. - </doc> - <rule name="in-use" on-failure="precondition-failed"> - <doc> - The server MUST NOT delete a queue that has consumers on - it, if the if-unused - field is true. - </doc> - <doc type="scenario"> - The client declares a queue, and consumes from it, then - tries to delete it - setting if-unused to true. - </doc> - </rule> - </field> - - <field name="if-empty" domain="bit" label="delete only if empty"> - <doc> - If set, the server will only delete the queue if it has no - messages. - </doc> - <rule name="not-empty" on-failure="precondition-failed"> - <doc> - The server MUST NOT delete a queue that has messages on - it, if the - if-empty field is true. - </doc> - <doc type="scenario"> - The client declares a queue, binds it and publishes some - messages into it, - then tries to delete it setting if-empty to true. - </doc> - </rule> - </field> - - <field name="no-wait" domain="no-wait"/> - </method> - - <method name="delete-ok" synchronous="1" index="41" - label="confirm deletion of a queue"> - <doc>This method confirms the deletion of a queue.</doc> - - <chassis name="client" implement="MUST"/> - - <field name="message-count" domain="message-count"> - <doc>Reports the number of messages deleted.</doc> - </field> - </method> - </class> - - <!-- == BASIC ============================================================ --> - - <class name="basic" handler="channel" index="60" - label="work with basic content"> - <doc> - The Basic class provides methods that support an industry-standard - messaging model. - </doc> - - <doc type="grammar"> - basic = C:QOS S:QOS-OK - / C:CONSUME S:CONSUME-OK - / C:CANCEL S:CANCEL-OK - / C:PUBLISH content - / S:RETURN content - / S:DELIVER content - / C:GET ( S:GET-OK content / S:GET-EMPTY ) - / C:ACK - / S:ACK - / C:REJECT - / C:NACK - / S:NACK - / C:RECOVER-ASYNC - / C:RECOVER S:RECOVER-OK - </doc> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MAY"/> - - <rule name="01"> - <doc> - The server SHOULD respect the persistent property of basic - messages and - SHOULD make a best-effort to hold persistent basic messages on a - reliable - storage mechanism. - </doc> - <doc type="scenario"> - 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. - </doc> - </rule> - - <rule name="02"> - <doc> - The server MUST NOT discard a persistent basic message in case - of a queue - overflow. - </doc> - <doc type="scenario"> - Declare a queue overflow situation with persistent messages and - verify that - messages do not get lost (presumably the server will write them - to disk). - </doc> - </rule> - - <rule name="03"> - <doc> - The server MAY use the Channel.Flow method to slow or stop a - basic message - publisher when necessary. - </doc> - <doc type="scenario"> - Declare a queue overflow situation with non-persistent messages - and verify - whether the server responds with Channel.Flow or not. Repeat - with persistent - messages. - </doc> - </rule> - - <rule name="04"> - <doc> - The server MAY overflow non-persistent basic messages to - persistent - storage. - </doc> - <!-- Test scenario: untestable --> - </rule> - - <rule name="05"> - <doc> - The server MAY discard or dead-letter non-persistent basic - messages on a - priority basis if the queue size exceeds some configured limit. - </doc> - <!-- Test scenario: untestable --> - </rule> - - <rule name="06"> - <doc> - The server MUST implement at least 2 priority levels for basic - messages, - where priorities 0-4 and 5-9 are treated as two distinct levels. - </doc> - <doc type="scenario"> - Send a number of priority 0 messages to a queue. Send one - priority 9 - message. Consume messages from the queue and verify that the - first message - received was priority 9. - </doc> - </rule> - - <rule name="07"> - <doc> - The server MAY implement up to 10 priority levels. - </doc> - <doc type="scenario"> - Send a number of messages with mixed priorities to a queue, so - that all - priority values from 0 to 9 are exercised. A good scenario would - be ten - messages in low-to-high priority. Consume from queue and verify - how many - priority levels emerge. - </doc> - </rule> - - <rule name="08"> - <doc> - The server MUST deliver messages of the same priority in order - irrespective of - their individual persistence. - </doc> - <doc type="scenario"> - Send a set of messages with the same priority but different - persistence - settings to a queue. Consume and verify that messages arrive in - same order - as originally published. - </doc> - </rule> - - <rule name="09"> - <doc> - The server MUST support un-acknowledged delivery of Basic - content, i.e. - consumers with the no-ack field set to TRUE. - </doc> - </rule> - - <rule name="10"> - <doc> - The server MUST support explicitly acknowledged delivery of - Basic content, - i.e. consumers with the no-ack field set to FALSE. - </doc> - <doc type="scenario"> - Declare a queue and a consumer using explicit acknowledgements. - Publish a - set of messages to the queue. Consume the messages but - acknowledge only - half of them. Disconnect and reconnect, and consume from the - queue. - Verify that the remaining messages are received. - </doc> - </rule> - - <!-- These are the properties for a Basic content --> - - <!-- MIME typing --> - <field name="content-type" domain="shortstr" label="MIME content type"/> - <!-- MIME typing --> - <field name="content-encoding" domain="shortstr" - label="MIME content encoding"/> - <!-- For applications, and for header exchange routing --> - <field name="headers" domain="table" - label="message header field table"/> - <!-- For queues that implement persistence --> - <field name="delivery-mode" domain="octet" - label="non-persistent (1) or persistent (2)"/> - <!-- For queues that implement priorities --> - <field name="priority" domain="octet" label="message priority, 0 to 9"/> - <!-- For application use, no formal behaviour --> - <field name="correlation-id" domain="shortstr" - label="application correlation identifier"/> - <!-- For application use, no formal behaviour but may hold the - name of a private response queue, when used in request messages --> - <field name="reply-to" domain="shortstr" label="address to reply to"/> - <!-- For implementation use, no formal behaviour --> - <field name="expiration" domain="shortstr" - label="message expiration specification"/> - <!-- For application use, no formal behaviour --> - <field name="message-id" domain="shortstr" - label="application message identifier"/> - <!-- For application use, no formal behaviour --> - <field name="timestamp" domain="timestamp" label="message timestamp"/> - <!-- For application use, no formal behaviour --> - <field name="type" domain="shortstr" label="message type name"/> - <!-- For application use, no formal behaviour --> - <field name="user-id" domain="shortstr" label="creating user id"/> - <!-- For application use, no formal behaviour --> - <field name="app-id" domain="shortstr" label="creating application id"/> - <!-- Deprecated, was old cluster-id property --> - <field name="reserved" domain="shortstr" - label="reserved, must be empty"/> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="qos" synchronous="1" index="10" - label="specify quality of service"> - <doc> - This method requests a specific quality of service. The QoS can - be specified for the - current channel or for all channels on the connection. The - particular properties and - semantics of a qos method always depend on the content class - semantics. Though the - qos method could in principle apply to both peers, it is - currently meaningful only - for the server. - </doc> - - <chassis name="server" implement="MUST"/> - <response name="qos-ok"/> - - <field name="prefetch-size" domain="long" - label="prefetch window in octets"> - <doc> - 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 down the channel. Prefetching - gives a performance - improvement. This field specifies the prefetch window size - in octets. The server - will send a message in advance if it is equal to or smaller - in size than the - available prefetch size (and also falls into other prefetch - limits). May be set - to zero, meaning "no specific limit", although other - prefetch limits may still - apply. The prefetch-size is ignored if the no-ack option is - set. - </doc> - <rule name="01"> - <doc> - The server MUST ignore this setting when the client is - not processing any - messages - i.e. the prefetch size does not limit the - transfer of single - messages to a client, only the sending in advance of - more messages while - the client still has one or more unacknowledged - messages. - </doc> - <doc type="scenario"> - Define a QoS prefetch-size limit and send a single - message that exceeds - that limit. Verify that the message arrives correctly. - </doc> - </rule> - </field> - - <field name="prefetch-count" domain="short" - label="prefetch window in messages"> - <doc> - Specifies a prefetch 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 prefetch windows (and those at the channel - and connection level) - allow it. The prefetch-count is ignored if the no-ack option - is set. - </doc> - <rule name="01"> - <doc> - The server may send less data in advance than allowed by - the client's - specified prefetch windows but it MUST NOT send more. - </doc> - <doc type="scenario"> - Define a QoS prefetch-size limit and a prefetch-count - limit greater than - one. Send multiple messages that exceed the prefetch - size. Verify that - no more than one message arrives at once. - </doc> - </rule> - </field> - - <field name="global" domain="bit" - label="apply to entire connection"> - <doc> - RabbitMQ has reinterpreted this field. The original - specification said: "By default the QoS settings apply to - the current channel only. If this field is set, they are - applied to the entire connection." Instead, RabbitMQ takes - global=false to mean that the QoS settings should apply - per-consumer (for new consumers on the channel; existing - ones being unaffected) and global=true to mean that the QoS - settings should apply per-channel. - </doc> - </field> - </method> - - <method name="qos-ok" synchronous="1" index="11" - label="confirm the requested qos"> - <doc> - This method 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. - </doc> - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="consume" synchronous="1" index="20" - label="start a queue consumer"> - <doc> - This method asks the server to start a "consumer", which is a - transient request for - messages from a specific queue. Consumers last as long as the - channel they were - declared on, or until the client cancels them. - </doc> - - <rule name="01"> - <doc> - The server SHOULD support at least 16 consumers per queue, - and ideally, impose - no limit except as defined by available resources. - </doc> - <doc type="scenario"> - Declare a queue and create consumers on that queue until the - server closes the - connection. Verify that the number of consumers created was - at least sixteen - and report the total number. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - <response name="consume-ok"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <doc>Specifies the name of the queue to consume from.</doc> - </field> - - <field name="consumer-tag" domain="consumer-tag"> - <doc> - Specifies the identifier for the consumer. The consumer tag - is local to a - channel, so two clients can use the same consumer tags. If - this field is - empty the server will generate a unique tag. - </doc> - <rule name="01" on-failure="not-allowed"> - <doc> - The client MUST NOT specify a tag that refers to an - existing consumer. - </doc> - <doc type="scenario"> - Attempt to create two consumers with the same non-empty - tag, on the - same channel. - </doc> - </rule> - <rule name="02" on-failure="not-allowed"> - <doc> - The consumer tag is valid only within the channel from - which the - consumer was created. I.e. a client MUST NOT create a - consumer in one - channel and then use it in another. - </doc> - <doc type="scenario"> - Attempt to create a consumer in one channel, then use in - another channel, - in which consumers have also been created (to test that - the server uses - unique consumer tags). - </doc> - </rule> - </field> - - <field name="no-local" domain="no-local"/> - - <field name="no-ack" domain="no-ack"/> - - <field name="exclusive" domain="bit" - label="request exclusive access"> - <doc> - Request exclusive consumer access, meaning only this - consumer can access the - queue. - </doc> - - <rule name="01" on-failure="access-refused"> - <doc> - The client MAY NOT gain exclusive access to a queue that - already has - active consumers. - </doc> - <doc type="scenario"> - Open two connections to a server, and in one connection - declare a shared - (non-exclusive) queue and then consume from the queue. - In the second - connection attempt to consume from the same queue using - the exclusive - option. - </doc> - </rule> - </field> - - <field name="no-wait" domain="no-wait"/> - - <field name="arguments" domain="table" - label="arguments for declaration"> - <doc> - A set of arguments for the consume. The syntax and semantics - of these - arguments depends on the server implementation. - </doc> - </field> - </method> - - <method name="consume-ok" synchronous="1" index="21" - label="confirm a new consumer"> - <doc> - The server provides the client with a consumer tag, which is - used by the client - for methods called on the consumer at a later stage. - </doc> - <chassis name="client" implement="MUST"/> - <field name="consumer-tag" domain="consumer-tag"> - <doc> - Holds the consumer tag specified by the client or provided - by the server. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="cancel" synchronous="1" index="30" - label="end a queue consumer"> - <doc> - This method 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 client may receive an arbitrary number of - messages in - between sending the cancel method and receiving the cancel-ok - reply. - - It may also be sent from the server to the client in the event - of the consumer being unexpectedly cancelled (i.e. cancelled - for any reason other than the server receiving the - corresponding basic.cancel from the client). This allows - clients to be notified of the loss of consumers due to events - such as queue deletion. Note that as it is not a MUST for - clients to accept this method from the server, it is advisable - for the broker to be able to identify those clients that are - capable of accepting the method, through some means of - capability negotiation. - </doc> - - <rule name="01"> - <doc> - If the queue does not exist the server MUST ignore the - cancel method, so - long as the consumer tag is valid for that channel. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="SHOULD"/> - <response name="cancel-ok"/> - - <field name="consumer-tag" domain="consumer-tag"/> - <field name="no-wait" domain="no-wait"/> - </method> - - <method name="cancel-ok" synchronous="1" index="31" - label="confirm a cancelled consumer"> - <doc> - This method confirms that the cancellation was completed. - </doc> - <chassis name="client" implement="MUST"/> - <chassis name="server" implement="MAY"/> - <field name="consumer-tag" domain="consumer-tag"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="publish" content="1" index="40" label="publish a message"> - <doc> - This method 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 when the transaction, if any, is committed. - </doc> - - <chassis name="server" implement="MUST"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="exchange" domain="exchange-name"> - <doc> - 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 a channel - exception. - </doc> - - <rule name="must-exist" on-failure="not-found"> - <doc> - The client MUST NOT attempt to publish a content to an - exchange that - does not exist. - </doc> - <doc type="scenario"> - The client attempts to publish a content to a - non-existent exchange. - </doc> - </rule> - <rule name="default-exchange"> - <doc> - The server MUST accept a blank exchange name to mean the - default exchange. - </doc> - <doc type="scenario"> - The client declares a queue and binds it to a blank - exchange name. - </doc> - </rule> - <rule name="02"> - <doc> - If the exchange was declared as an internal exchange, - the server MUST raise - a channel exception with a reply code 403 (access - refused). - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <rule name="03"> - <doc> - The exchange MAY refuse basic content in which case it - MUST raise a channel - exception with reply code 540 (not implemented). - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="routing-key" domain="shortstr" - label="Message routing key"> - <doc> - Specifies the routing key for the message. The routing key - is used for routing - messages depending on the exchange configuration. - </doc> - </field> - - <field name="mandatory" domain="bit" - label="indicate mandatory routing"> - <doc> - 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 method. If this flag is zero, the server silently - drops the message. - </doc> - - <rule name="01"> - <doc> - The server SHOULD implement the mandatory flag. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="immediate" domain="bit" - label="request immediate delivery"> - <doc> - 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 method. If this flag is - zero, the server - will queue the message, but with no guarantee that it will - ever be consumed. - </doc> - - <rule name="01"> - <doc> - The server SHOULD implement the immediate flag. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - </method> - - <method name="return" content="1" index="50" - label="return a failed message"> - <doc> - This method 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. - </doc> - - <chassis name="client" implement="MUST"/> - - <field name="reply-code" domain="reply-code"/> - <field name="reply-text" domain="reply-text"/> - - <field name="exchange" domain="exchange-name"> - <doc> - Specifies the name of the exchange that the message was - originally published - to. May be empty, meaning the default exchange. - </doc> - </field> - - <field name="routing-key" domain="shortstr" - label="Message routing key"> - <doc> - Specifies the routing key name specified when the message - was published. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="deliver" content="1" index="60" - label="notify the client of a consumer message"> - <doc> - This method delivers a message to the client, via a consumer. In - the asynchronous - message delivery model, the client starts a consumer using the - Consume method, then - the server responds with Deliver methods as and when messages - arrive for that - consumer. - </doc> - - <rule name="01"> - <doc> - 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 - unprocessable (possibly causing client applications to - abort), and move the - message to a dead letter queue. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <chassis name="client" implement="MUST"/> - - <field name="consumer-tag" domain="consumer-tag"/> - <field name="delivery-tag" domain="delivery-tag"/> - <field name="redelivered" domain="redelivered"/> - - <field name="exchange" domain="exchange-name"> - <doc> - Specifies the name of the exchange that the message was - originally published to. - May be empty, indicating the default exchange. - </doc> - </field> - - <field name="routing-key" domain="shortstr" - label="Message routing key"> - <doc>Specifies the routing key name specified when the message - was published. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="get" synchronous="1" index="70" - label="direct access to a queue"> - <doc> - This method provides a direct access to the messages in a queue - using a synchronous - dialogue that is designed for specific types of application - where synchronous - functionality is more important than performance. - </doc> - - <response name="get-ok"/> - <response name="get-empty"/> - <chassis name="server" implement="MUST"/> - - <!-- Deprecated: "ticket", must be zero --> - <field name="reserved-1" type="short" reserved="1"/> - - <field name="queue" domain="queue-name"> - <doc>Specifies the name of the queue to get a message from. - </doc> - </field> - <field name="no-ack" domain="no-ack"/> - </method> - - <method name="get-ok" synchronous="1" content="1" index="71" - label="provide client with a message"> - <doc> - This method delivers a message to the client following a get - method. A message - delivered by 'get-ok' must be acknowledged unless the no-ack - option was set in the - get method. - </doc> - - <chassis name="client" implement="MAY"/> - - <field name="delivery-tag" domain="delivery-tag"/> - <field name="redelivered" domain="redelivered"/> - <field name="exchange" domain="exchange-name"> - <doc> - Specifies the name of the exchange that the message was - originally published to. - If empty, the message was published to the default exchange. - </doc> - </field> - - <field name="routing-key" domain="shortstr" - label="Message routing key"> - <doc>Specifies the routing key name specified when the message - was published. - </doc> - </field> - - <field name="message-count" domain="message-count"/> - </method> - - <method name="get-empty" synchronous="1" index="72" - label="indicate no messages available"> - <doc> - This method tells the client that the queue has no messages - available for the - client. - </doc> - <chassis name="client" implement="MAY"/> - <!-- Deprecated: "cluster-id", must be empty --> - <field name="reserved-1" type="shortstr" reserved="1"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="ack" index="80" label="acknowledge one or more messages"> - <doc> - When sent by the client, this method acknowledges one or more - messages delivered via the Deliver or Get-Ok methods. - - When sent by server, this method acknowledges one or more - messages published with the Publish method on a channel in - confirm mode. - - The acknowledgement can be for a single message or a set of - messages up to and including a specific message. - </doc> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <field name="delivery-tag" domain="delivery-tag"/> - <field name="multiple" domain="bit" - label="acknowledge multiple messages"> - <doc> - If set to 1, the delivery tag is treated as "up to and - including", so that multiple messages can be acknowledged - with a single method. If set to zero, the delivery tag - refers to a single message. If the multiple field is 1, and - the delivery tag is zero, this indicates acknowledgement of - all outstanding messages. - </doc> - <rule name="exists" on-failure="precondition-failed"> - <doc> - A message MUST not be acknowledged more than once. The - receiving peer MUST validate that a non-zero - delivery-tag - refers to a delivered message, and raise a channel - exception if this is not the case. On a transacted - channel, this check MUST be done immediately and not - delayed until a Tx.Commit. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="reject" index="90" label="reject an incoming message"> - <doc> - This method allows a client to reject a message. It can be used - to interrupt and - cancel large incoming messages, or return untreatable messages - to their original - queue. - </doc> - - <rule name="01"> - <doc> - The server SHOULD be capable of accepting and process the - Reject method while - sending message content with a Deliver or Get-Ok method. - I.e. the server should - read and process incoming methods while sending output - frames. To cancel a - partially-send content, the server sends a content body - frame of size 1 (i.e. - with no data except the frame-end octet). - </doc> - </rule> - - <rule name="02"> - <doc> - The server SHOULD interpret this method as meaning that the - client is unable to - process the message at this time. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <rule name="03"> - <doc> - The client MUST NOT use this method as a means of selecting - messages to process. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - - <field name="delivery-tag" domain="delivery-tag"/> - - <field name="requeue" domain="bit" label="requeue the message"> - <doc> - If requeue is true, the server will attempt to requeue the - message. If requeue - is false or the requeue attempt fails the messages are - discarded or dead-lettered. - </doc> - - <rule name="01"> - <doc> - The server MUST NOT deliver the message to the same - client within the - context of the current channel. 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. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="recover-async" index="100" - label="redeliver unacknowledged messages" - deprecated="1"> - <doc> - This method asks the server to redeliver all unacknowledged - messages on a - specified channel. Zero or more messages may be redelivered. - This method - is deprecated in favour of the synchronous Recover/Recover-Ok. - </doc> - <rule name="01"> - <doc> - The server MUST set the redelivered flag on all messages - that are resent. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - <chassis name="server" implement="MAY"/> - <field name="requeue" domain="bit" label="requeue the message"> - <doc> - If this field is zero, the message will be redelivered to - the original - recipient. If this bit is 1, the server will attempt to - requeue the message, - potentially then delivering it to an alternative subscriber. - </doc> - </field> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="recover" index="110" - label="redeliver unacknowledged messages"> - <doc> - This method asks the server to redeliver all unacknowledged - messages on a - specified channel. Zero or more messages may be redelivered. - This method - replaces the asynchronous Recover. - </doc> - <rule name="01"> - <doc> - The server MUST set the redelivered flag on all messages - that are resent. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - <chassis name="server" implement="MUST"/> - <field name="requeue" domain="bit" label="requeue the message"> - <doc> - If this field is zero, the message will be redelivered to - the original - recipient. If this bit is 1, the server will attempt to - requeue the message, - potentially then delivering it to an alternative subscriber. - </doc> - </field> - </method> - - <method name="recover-ok" synchronous="1" index="111" - label="confirm recovery"> - <doc> - This method acknowledges a Basic.Recover method. - </doc> - <chassis name="client" implement="MUST"/> - </method> - - <method name="nack" index="120" - label="reject one or more incoming messages"> - <doc> - This method allows a client to reject one or more incoming - messages. It can be - used to interrupt and cancel large incoming messages, or return - untreatable - messages to their original queue. - - This method is also used by the server to inform publishers on - channels in - confirm mode of unhandled messages. If a publisher receives this - method, it - probably needs to republish the offending messages. - </doc> - - <rule name="01"> - <doc> - The server SHOULD be capable of accepting and processing the - Nack method while - sending message content with a Deliver or Get-Ok method. - I.e. the server should - read and process incoming methods while sending output - frames. To cancel a - partially-send content, the server sends a content body - frame of size 1 (i.e. - with no data except the frame-end octet). - </doc> - </rule> - - <rule name="02"> - <doc> - The server SHOULD interpret this method as meaning that the - client is unable to - process the message at this time. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <rule name="03"> - <doc> - The client MUST NOT use this method as a means of selecting - messages to process. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - - <rule name="04"> - <doc> - A client publishing messages to a channel in confirm mode - SHOULD be capable of accepting - and somehow handling the Nack method. - </doc> - <doc type="scenario"> - TODO - </doc> - </rule> - - <chassis name="server" implement="MUST"/> - <chassis name="client" implement="MUST"/> - - <field name="delivery-tag" domain="delivery-tag"/> - - <field name="multiple" domain="bit" - label="reject multiple messages"> - <doc> - If set to 1, the delivery tag is treated as "up to and - including", so that multiple messages can be rejected - with a single method. If set to zero, the delivery tag - refers to a single message. If the multiple field is 1, and - the delivery tag is zero, this indicates rejection of - all outstanding messages. - </doc> - <rule name="exists" on-failure="precondition-failed"> - <doc> - A message MUST not be rejected more than once. The - receiving peer MUST validate that a non-zero - delivery-tag - refers to an unacknowledged, delivered message, and - raise a channel exception if this is not the case. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - - <field name="requeue" domain="bit" label="requeue the message"> - <doc> - If requeue is true, the server will attempt to requeue the - message. If requeue - is false or the requeue attempt fails the messages are - discarded or dead-lettered. - Clients receiving the Nack methods should ignore this flag. - </doc> - - <rule name="01"> - <doc> - The server MUST NOT deliver the message to the same - client within the - context of the current channel. 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. - </doc> - <doc type="scenario"> - TODO. - </doc> - </rule> - </field> - </method> - - </class> - - <!-- == TX =============================================================== --> - - <class name="tx" handler="channel" index="90" - label="work with transactions"> - <doc> - The Tx class allows publish and ack operations to be batched into - atomic - units of work. The intention is that all publish and ack requests - issued - within a transaction will complete successfully or none of them - will. - Servers SHOULD implement atomic transactions at least where all - publish - or ack requests affect a single queue. Transactions that cover - multiple - queues may be non-atomic, given that queues can be created and - destroyed - asynchronously, and such events do not form part of any transaction. - Further, the behaviour of transactions with respect to the immediate - and - mandatory flags on Basic.Publish methods is not defined. - </doc> - - <rule name="not multiple queues"> - <doc> - Applications MUST NOT rely on the atomicity of transactions that - affect more than one queue. - </doc> - </rule> - <rule name="not immediate"> - <doc> - Applications MUST NOT rely on the behaviour of transactions that - include messages published with the immediate option. - </doc> - </rule> - <rule name="not mandatory"> - <doc> - Applications MUST NOT rely on the behaviour of transactions that - include messages published with the mandatory option. - </doc> - </rule> - - <doc type="grammar"> - tx = C:SELECT S:SELECT-OK - / C:COMMIT S:COMMIT-OK - / C:ROLLBACK S:ROLLBACK-OK - </doc> - - <chassis name="server" implement="SHOULD"/> - <chassis name="client" implement="MAY"/> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="select" synchronous="1" index="10" - label="select standard transaction mode"> - <doc> - This method sets the channel to use standard transactions. The - client must use this - method at least once on a channel before using the Commit or - Rollback methods. - </doc> - <chassis name="server" implement="MUST"/> - <response name="select-ok"/> - </method> - - <method name="select-ok" synchronous="1" index="11" - label="confirm transaction mode"> - <doc> - This method confirms to the client that the channel was - successfully set to use - standard transactions. - </doc> - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="commit" synchronous="1" index="20" - label="commit the current transaction"> - <doc> - This method commits all message publications and acknowledgments - performed in - the current transaction. A new transaction starts immediately - after a commit. - </doc> - <chassis name="server" implement="MUST"/> - <response name="commit-ok"/> - - <rule name="transacted" on-failure="precondition-failed"> - <doc> - The client MUST NOT use the Commit method on non-transacted - channels. - </doc> - <doc type="scenario"> - The client opens a channel and then uses Tx.Commit. - </doc> - </rule> - </method> - - <method name="commit-ok" synchronous="1" index="21" - label="confirm a successful commit"> - <doc> - This method confirms to the client that the commit succeeded. - Note that if a commit - fails, the server raises a channel exception. - </doc> - <chassis name="client" implement="MUST"/> - </method> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="rollback" synchronous="1" index="30" - label="abandon the current transaction"> - <doc> - This method abandons all message publications and - acknowledgments performed in - the current transaction. A new transaction starts immediately - after a rollback. - Note that unacked messages will not be automatically redelivered - by rollback; - if that is required an explicit recover call should be issued. - </doc> - <chassis name="server" implement="MUST"/> - <response name="rollback-ok"/> - - <rule name="transacted" on-failure="precondition-failed"> - <doc> - The client MUST NOT use the Rollback method on - non-transacted channels. - </doc> - <doc type="scenario"> - The client opens a channel and then uses Tx.Rollback. - </doc> - </rule> - </method> - - <method name="rollback-ok" synchronous="1" index="31" - label="confirm successful rollback"> - <doc> - This method confirms to the client that the rollback succeeded. - Note that if an - rollback fails, the server raises a channel exception. - </doc> - <chassis name="client" implement="MUST"/> - </method> - </class> - - <!-- == CONFIRM ========================================================== --> - - <class name="confirm" handler="channel" index="85" - label="work with confirms"> - <doc> - The Confirm class allows publishers to put the channel in - confirm mode and subsequently be notified when messages have been - handled by the broker. The intention is that all messages - published on a channel in confirm mode will be acknowledged at - some point. By acknowledging a message the broker assumes - responsibility for it and indicates that it has done something - it deems reasonable with it. - - Unroutable mandatory or immediate messages are acknowledged - right after the Basic.Return method. Messages are acknowledged - when all queues to which the message has been routed - have either delivered the message and received an - acknowledgement (if required), or enqueued the message (and - persisted it if required). - - Published messages are assigned ascending sequence numbers, - starting at 1 with the first Confirm.Select method. The server - confirms messages by sending Basic.Ack methods referring to these - sequence numbers. - </doc> - - <rule name="all messages acknowledged"> - <doc> - The server MUST acknowledge all messages received after the - channel was put into confirm mode. - </doc> - </rule> - - <rule name="all queues"> - <doc> - The server MUST acknowledge a message only after it was - properly handled by all the queues it was delivered to. - </doc> - </rule> - - <rule name="unroutable messages"> - <doc> - The server MUST acknowledge an unroutable mandatory or - immediate message only after it sends the Basic.Return. - </doc> - </rule> - - <rule name="time guarantees"> - <doc> - No guarantees are made as to how soon a message is - acknowledged. Applications SHOULD NOT make assumptions about - this. - </doc> - </rule> - - <doc type="grammar"> - confirm = C:SELECT S:SELECT-OK - </doc> - - <chassis name="server" implement="SHOULD"/> - <chassis name="client" implement="MAY"/> - - <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> - - <method name="select" synchronous="1" index="10"> - select confirm mode (i.e. enable publisher acknowledgements) - <doc> - This method sets the channel to use publisher acknowledgements. - The client can only use this method on a non-transactional - channel. - </doc> - <chassis name="server" implement="MUST"/> - <response name="select-ok"/> - <field name="nowait" type="bit"> - do not send a reply method - <doc> - If set, the server will not respond to the method. The - client should - not wait for a reply method. If the server could not - complete the - method it will raise a channel or connection exception. - </doc> - </field> - </method> - - <method name="select-ok" synchronous="1" index="11"> - acknowledge confirm mode - <doc> - This method confirms to the client that the channel was - successfully - set to use publisher acknowledgements. - </doc> - <chassis name="client" implement="MUST"/> - </method> - </class> - -</amqp>