[rabbitmq-discuss] event-based use of the RabbitMQ C library

David Wragg david at rabbitmq.com
Sun Feb 6 17:03:26 GMT 2011

Hi Mike,

mike castleman <m at mlcastle.net> writes:
> I'm looking at using RabbitMQ and the C library for a project.
> In all three of the consumer examples provided with the C library
> (amqp_consumer.c, amqp_listen.c, amqp_listenq.c), it seems like
> consuming messages blocks on calling amqp_simple_wait_frame().
> Is there any way we can select(2) on something or otherwise be notified
> when a message is ready to be received?

librabbitmq does not currently support non-blocking operation.

One workaround is to call librabbitmq from within a thread, and run the
rest of your application within other threads.  But note that
librabbitmq does not allow you to share a connection between threads, so
you won't be able to consume and publish concurrently within a single
thread.  You could open multiple connections, and use one for
publishing, and another for consuming.

And I think you can make the select approach work, but it's a hack.

> As far as I can tell, just select()ing on the socket is not sufficient,
> because if amqp_simple_wait_frame() reads a partial frame, it will still
> block.

You will need to set O_NONBLOCK on the socket.  Then in the partial
frame case, the recv call will return EGAIN or EWOULDBLOCK, and
amqp_simple_wait_frame will return this value in a translated form
(-(errno | ERR_CATEGORY_OS)).  You could detect that and proceed

As I said, it's a hack.

> Are there examples anywhere of event-driven uses of the RabbitMQ C
> library which send and receive on different channels on the same
> connection based on some kind of external events?

librabbitmq does not currently support such cases well.  That might
change in the future, but that's the situation today.


David Wragg
Staff Engineer, RabbitMQ
SpringSource, a division of VMware

More information about the rabbitmq-discuss mailing list