[rabbitmq-discuss] More RabbitMQ Erlang client woes

Edwin Fine rabbitmq-discuss_efine at usa.net
Fri May 9 14:30:35 BST 2008


Ben,

>
> In your patch, you also added an extra method to handle a spurious
> consume_ok message;
>
> %% Edwin Fine bugfix: This is actually being called wrong from somewhere,
> %% but this will fix it.
> handle_method({'basic.consume_ok', ConsumerTag}, State) ->
>     io:format("[~p] Got bad handle_method call!~n", [self()]),
>     handle_method(#'basic.consume_ok'{consumer_tag = ConsumerTag}, State);
>
> This method is preceded in the code by the following function:
>
> handle_method(BasicConsumeOk = #'basic.consume_ok'{consumer_tag =
> ConsumerTag},
>                         State = #channel_state{pending_consumer =
> Consumer}) ->
>     Consumer ! BasicConsumeOk,
>     NewState = register_consumer(ConsumerTag, Consumer, State),
>     {noreply, NewState2} = rpc_bottom_half(BasicConsumeOk, NewState),
>     {noreply, NewState2#channel_state{pending_consumer = <<>>} };
>
> So I not quite sure why that didn't match first
> because #'basic.consume_ok'{consumer_tag = ConsumerTag} should match
> against {'basic.consume_ok', ConsumerTag}
> and #channel_state{pending_consumer = Consumer} should match even if the
> pending_consumer was not defined.
>

Actually, I was in the middle of trying to get that right, and it was late,
so I would ignore that comment (and the code) completely. In fact I have
removed it from the most recent code. I was trying to get rid of the error
that I saw in the stack trace of the amqp_channel, namely

** Reason for termination ==
** {badarg,[{amqp_channel,handle_method,2},
            {gen_server,handle_msg,5},
            {proc_lib,init_p,5}]}

Now that I am doing the basic.consume in the process that starts the
consumers, the above issue does not occur.
Thanks for all your help. In the meantime, until you have a more elegant
bugfix (to the rabbit_writer proliferation) than my hack, I will just
continue to use my modified Erlang client.

Ben, you also wrote:

>>> That's a good point. I think the cleanup code should go into the
gen_server terminate callback to keep it one place.

Funny thing, that - I *did* put the cleanup code into the terminate, but it
did not seem to be called. It was only when I put it directly before the
{stop, xxx} returns that it finally got called. Again, this may have just
been late night syndrome, but I had extensive print statements and could
clearly see that it was not happening. At that time all I wanted was to get
it to work. Please understand that all the code I have submitted (other than
amqp_channel) is a pure hack to try to expose and duplicate the errors!

Thanks again.
Regards,
Ed
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20080509/0bb836e1/attachment.htm 


More information about the rabbitmq-discuss mailing list