[rabbitmq-discuss] [help] [beginner] testing with pika: some questions and complaints

Alistair Bayley alistair at abayley.org
Wed Feb 29 01:54:24 GMT 2012


I've been testing rabbitmq with pika (python) to understand how they
interact and learn about the AMQP protocol. I've some questions and
some complaints; no doubt much of this will be from my
misunderstandings of the AMQP/rabbitmq specs.

Pika (is this better posted to the pika mailing list?):

1.  why is the test in channel.py:102 like so:
        if callback and not isinstance(callback, types.FunctionType) and \
           not isinstance(callback, types.MethodType):
            raise TypeError("callback should be None, a function or method.")

    i.e. why isn't is just a callable() test e.g.
        if callback and not callable(callback):
            raise TypeError("callback should be callable.")

    (is this a python-3 compatibility thing?)


2.  documentation for callback functions is mostly non-existent, and when it
    exists is sometimes wrong e.g. on http://pika.github.com/channel.html :

    (i) channel.basic_get:
        "callback method signature should have 3 parameters:
        The method frame, header frame and the body"
    In fact the callback gets 4 parameters:
        channel, method (Basic.GetOk), properties (Basic.Properties), body

    (ii) channel.add_on_close_callback:
        "The callback function should receive a frame parameter."
    In fact the callback gets 2 parameters: error_code, error_message


3.  why does basic_ack cause this warning?
    CallbackManager.add: Duplicate callback found for "0:Connection.CloseOk"
    i.e. why does it appear to add a(nother) connection close callback?
    I've grubbed through the pika source but can't see how/where it happens.


AMQP/rabbitmq:

4.  why doesn't basic_ack do what I expect?
    If I do a basic_get with no_ack=False, and then a basic_ack,
    the message stays on the queue.
    I can repeatedly fetch-and-ack it, and each time redelivered=true.


5.  if the server reaches a state where it stops accepting messages
    (e.g. memory usage exceeds the high water mark) it does not send
    nack or return responses to basic_publish.
    This is both with transactions, or with channel confirm_delivery
    enabled.


(5) is a concern when one requires guaranteed delivery. Having the
server swallow the message and not respond doesn't seem reliable to
me. Is there some other method I should be using for guaranteed
delivery?

Alistair


More information about the rabbitmq-discuss mailing list