Thanks Alex.<div><br></div><div>I think, for sequential message processing, rather than this pattern</div><div><div>while(true) {</div><div>    GetResponse res = channel.basicGet(QUEUE_NAME, false);</div><div>    if(res != null) {</div>
<div>        // process and ack message</div><div>   }</div><div>}</div><div><br></div><div>using channel.basicConsume on the channel which is created like this</div><div><div>ExecutorService es = Executors.newSingleThreadExecutor();</div>
<div>Connection connection = factory.newConnection(es);</div><div>final Channel channel = connection.createChannel();</div><div><br></div><div>is probably a better approach.</div><div>Any comments on this?</div><div><br></div>
<div>regards, Yogesh</div><br><div class="gmail_quote">2012/1/23 Alexandru Scvorţov <span dir="ltr">&lt;<a href="mailto:alexandru@rabbitmq.com">alexandru@rabbitmq.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Yogesh,<br>
<br>
In the absence of consumer failures, RabbitMQ will deliver messages from<br>
a queue in order.<br>
<br>
So, if messages 1, 2, 3 reach a queue in order, RabbitMQ will deliver<br>
them to consumers in the same order (1, 2, 3).<br>
<br>
But, if consumers fail before acknowledging the messages (or if they<br>
reject the messages), those messages will requeued at the end of the<br>
queue.  So, if the consumer that got message 1 rejects it, the new<br>
order of messages will be 2, 3, 1.<br>
<br>
This all deals with message *delivery*.<br>
<div class="im"><br>
&gt; There are multiple consumer threads consuming the messages.<br>
&gt; Though multiple threads are consuming the messages, I observed that<br>
&gt; messages still get processed sequentially.<br>
&gt; Is that the case and if NOT, what is the way to guarantee sequential<br>
&gt; processing of messages on one queue?<br>
<br>
</div>The library makes no guarantees about the order in which you process<br>
messages, only about the order in which they&#39;re delivered.<br>
<br>
If you want to process all the messages on a queue in order, only<br>
consume from one thread (doing basic.get from one thread like you<br>
suggested in the other email would work, but would also be highly<br>
inefficient).<br>
<br>
Does this answer your question?<br>
<br>
Cheers,<br>
Alex<br>
<div class="HOEnZb"><div class="h5"><br>
On Sun, Jan 22, 2012 at 09:38:40AM -0800, Yogesh Ketkar wrote:<br>
&gt; Running the code below, gives<br>
&gt; channel.basicConsume(QUEUE_NAME, autoAck, CONSUMER_TAG,<br>
&gt;       new DefaultConsumer(channel)  {<br>
&gt;         @Override<br>
&gt;         public void handleDelivery(String consumerTag, Envelope<br>
&gt; envelope, BasicProperties properties, byte[] body) {<br>
&gt;                 System.out.println(Thread.currentThread().getName());<br>
&gt;          }<br>
&gt; }<br>
&gt;<br>
&gt; o/p like<br>
&gt; pool-1-thread-1<br>
&gt; pool-1-thread-2<br>
&gt; pool-1-thread-3<br>
&gt; etc<br>
&gt;<br>
&gt; There are multiple consumer threads consuming the messages.<br>
&gt; Though multiple threads are consuming the messages, I observed that<br>
&gt; messages still get processed sequentially.<br>
&gt; Is that the case and if NOT, what is the way to guarantee sequential<br>
&gt; processing of messages on one queue?<br>
&gt;<br>
&gt; regards, Yogesh<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; rabbitmq-discuss mailing list<br>
&gt; <a href="mailto:rabbitmq-discuss@lists.rabbitmq.com">rabbitmq-discuss@lists.rabbitmq.com</a><br>
&gt; <a href="https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss" target="_blank">https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss</a><br>
</div></div></blockquote></div><br></div></div>