In the absence of consumer failures, RabbitMQ will deliver messages from
a queue in order.
So, if messages 1, 2, 3 reach a queue in order, RabbitMQ will deliver
them to consumers in the same order (1, 2, 3).
But, if consumers fail before acknowledging the messages (or if they
reject the messages), those messages will requeued at the end of the
queue. So, if the consumer that got message 1 rejects it, the new
order of messages will be 2, 3, 1.
This all deals with message *delivery*.
> There are multiple consumer threads consuming the messages.
> Though multiple threads are consuming the messages, I observed that
> messages still get processed sequentially.
> Is that the case and if NOT, what is the way to guarantee sequential
> processing of messages on one queue?
The library makes no guarantees about the order in which you process
messages, only about the order in which they're delivered.
If you want to process all the messages on a queue in order, only
consume from one thread (doing basic.get from one thread like you
suggested in the other email would work, but would also be highly
inefficient).
Does this answer your question?
Cheers,
Alex
On Sun, Jan 22, 2012 at 09:38:40AM -0800, Yogesh Ketkar wrote:
> Running the code below, gives
> channel.basicConsume(QUEUE_NAME, autoAck, CONSUMER_TAG,
> new DefaultConsumer(channel) {
> @Override
> public void handleDelivery(String consumerTag, Envelope
> envelope, BasicProperties properties, byte[] body) {
> System.out.println(Thread.currentThread().getName());
> }
> }
>
> o/p like
> pool-1-thread-1
> pool-1-thread-2
> pool-1-thread-3
> etc
>
> There are multiple consumer threads consuming the messages.
> Though multiple threads are consuming the messages, I observed that
> messages still get processed sequentially.
> Is that the case and if NOT, what is the way to guarantee sequential
> processing of messages on one queue?
>
> regards, Yogesh
>
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq...@lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
_______________________________________________
rabbitmq-discuss mailing list
rabbitmq...@lists.rabbitmq.com
https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
On 22/01/12 17:38, Yogesh Ketkar wrote:
> Is that the case and if NOT, what is the way to guarantee sequential
> processing of messages on one queue?
If I understand your question correctly, you want to know whether
messages will always be delivered in order. This page has relevant info:
http://www.rabbitmq.com/semantics.html#ordering :
"""
messages published in one channel, passing through one exchange and one
queue and one outgoing channel will be received in the same order that
they were sent
"""
This remains true whether you use basic.get or basic.consume. A consumer
may observe messages out of order if there are multiple consumers
consuming from the same queue and some of them perform requeues.
-Emile
> using channel.basicConsume on the channel which is created like this
> ExecutorService es = Executors.newSingleThreadExecutor();
> Connection connection = factory.newConnection(es);
> final Channel channel = connection.createChannel();
>
> is probably a better approach.
> Any comments on this?
I don't quite see the point of the ExecutorService.
Just doing this:
> Connection connection = factory.newConnection(es);
> final Channel channel = connection.createChannel();
Then, calling basicConsume with your own subclass of DefaultConsumer
should be fine.
Cheers,
Alex
I thought, using default Connection con = factory.newConnection(),
ThreadPool which gets created will have more than one thread and
calling basicConsume will result in processing of messages on multiple
threads.
But if we explicitly provide Executors.newSingleThreadExecutor() to
newConnection method, only single thread will come into play with
basicConsume.
Is my understanding correct?
regards, Yogesh
> > 2012/1/23 Alexandru Scvorţov <alexan...@rabbitmq.com>
> > > > rabbitmq-disc...@lists.rabbitmq.com
> > > >https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
>
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-disc...@lists.rabbitmq.comhttps://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
Almost. Deliveries will happen serially on a channel, so, as long as you
only have one consumer, everything should be fine.
> > Steve Powell (*a hoppy bunny*)
> > *----------some more definitions from the SPD----------*
> > *vermin* (*v.*) Treating the dachshund for roundworm.
> > *chinchilla* (*n.*) Cooling device for the lower jaw.
> > *socialcast* (*n.*) Someone to whom everyone is speaking but nobody likes.