Messaging that just works

RabbitMQ


Interoperation with Qpid

We have performed basic interoperability testing against Qpid's M1 release. So far, we have run

  • RabbitMQ's Java client against Qpid's M1 Java broker
  • Qpid's M1 Java client against RabbitMQ's Erlang broker
  • Qpid's Python test-suite against RabbitMQ's Erlang broker

Qpid Java client -> RabbitMQ broker

  • When using any AMQP client, including Qpid's Java client, the required users accounts must first be created and granted access to the appropriate virtual hosts.

    Failure to do so will result in the Qpid client reporting "Unable to connect" or ACCESS_REFUSED errors, and RabbitMQ's log file will contain errors such as

    VHost access refused: no mapping for User <<"guest">>, VHost <<"/test">>

    Use RabbitMQ's administration tool to provision user access, based on the information provided in the error messages.

  • The Qpid Java client does not properly handle negotiated maximum frame sizes of zero (meaning "unlimited").

    If the server presents a maximum frame size of zero during connection negotiation, subsequent attempts by the Qpid client to publish a message result in a "Error in client: java.lang.NegativeArraySizeException" error message.

    The RabbitMQ server works around this limitation by presenting a maximum frame size of 131072 octets during connection negotiation.

  • Some of the Qpid Java client tests and examples use features that are not implemented in RabbitMQ.

    The discrepancies are listed below. In most of these cases RabbitMQ has a dummy implementation in place for improved interoperability.

RabbitMQ Java client -> Qpid Java broker

  • Some of the RabbitMQ Java client tests and examples use features that are not implemented in Qpid.

    One such case are "fanout" exchanges, which are implemented in RabbitMQ and used in several of the examples. Qpid will report an error "Unknown exchange type: fanout" in its logs and close the connection.

Test results from Qpid/Python Test Suite

The Qpid project is developing a broker-neutral test suite in Python. The following table details the results of running the AMQP 0-8 tests from that test suite against the RabbitMQ Erlang broker.

Note that the 0-8 spec file that comes with the test suite is different from the official spec. In order to run the tests you must download the official spec and run the test suite as follows:

run-tests -v -s specfile

Current StatusTest NameNotes
oktest_example
invalidtest_rollback The test assumes that delivered messages are requeued on rollback, which is in violation of the spec.
invalidtest_auto_rollback The test is actually the same as test_rollback and is therefore invalid for the same reason.
oktest_commit
oktest_commit_overlapping_acks
oktest_ack
oktest_cancel
oktest_consume_exclusive
failingtest_consume_no_local"no_local" planned but unimplemented
oktest_consume_queue_errors
oktest_consume_unique_consumers
oktest_get
oktest_qos_prefetch_count
failingtest_qos_prefetch_sizeprefetch size windowing planned but unimplemented
oktest_recover_requeue
oktest
oktestDefaultExchange
oktestMatchAll
oktestMatchAny
oktestDifferentDeclaredType
oktestTypeNotKnown
oktestDirect
oktestFanout
oktestHeaders
oktestTopic
oktestAmqDirect
oktestAmqFanOut
oktestAmqMatch
oktestAmqTopic
oktest_amqp_basic_13
oktest_basic_delivery_immediate
oktest_basic_delivery_queued
oktest_closed_channel
oktest_invalid_channel
oktest_bind
oktest_declare_exclusive
oktest_declare_passive
oktest_delete_ifempty
oktest_delete_ifunused
oktest_delete_simple
oktest_purge
oktestAssertEmptyFail
oktestAssertEmptyPass
oktestMessageProperties