[rabbitmq-discuss] Java client transaction with basic.consume

Matthias Radestock matthias at lshift.net
Mon Apr 6 20:43:32 BST 2009


Tsuraan,

tsuraan wrote:
> My desired workflow is:
> 
> basicConsume(...)
> forever() {
> consumer.nextDelivery()
> channel.txSelect()
> channel.basicAck(...)
> for(msg in some messages that depend on the delivered message) {
>   channel.basicPublish(msg)
> }
> channel.txCommit()
> }
> 
> My understanding (probably wrong) is that attempting to do blocking
> calls (like txSelect) on the channel being used by my consumer will
> cause a deadlock.  The documentation for QueueingConsumer says that it
> has straightforward blocking semantics, but I'm not sure what that
> means.  Is there a way to have my desired workflow using basicConsume,
> or do I need to do basicGet?

The above code should work with just a little bit of tweaking:

- call the basicConsume with a QueuingConsumer
- do the txSelect outside the loop - once a channel is in tx mode it 
stays in it

Or, to put it another way, just take the code from
   http://www.rabbitmq.com/api-guide.html#consuming
and add a channel.txSelect() outside the loop, and add the publishes and 
a channel.txCommit() inside the loop.


Matthias.




More information about the rabbitmq-discuss mailing list