[rabbitmq-discuss] Using Subscriptions in different ways (was Re: Multiple consumers)

Adriana Rodean adrya1984 at gmail.com
Tue Jul 28 13:11:58 BST 2009


Hi Tony,

Thank you very much for your reply and example :)
I subscribed like this but now i get the published message only when
both subscribers are online.
If subscribers are offline when message is published neither of them
gets the message.
What can i change so the subscribers get the message even if they are
offline when message is published?

Subscription sub = new Subscription(channel,
                                "{27}{47}{System}",
                                ExchangeType.Topic,
                                "System");
            Console.WriteLine("Consumer tag: " + sub.ConsumerTag);
            foreach (BasicDeliverEventArgs e in sub)
            {

                Console.WriteLine(Encoding.UTF8.GetString(e.Body));
                sub.Ack(e);

            }

Thank you again,
Adriana

On Tue, Jul 28, 2009 at 14:19, Tony Garnock-Jones<tonyg at lshift.net> wrote:
> Hi Adriana,
>
> Adriana Rodean wrote:
>>
>> When i publish message 1 subscriber receives the message. After i
>> close this subscriber the other one receives the message.
>> I want both subscribers to receive the message when they are open.
>> What am i doing wrong?
>> Please help!
>
> Here is a schematic of what the code you posted sets up:
>
>   exchange "{27}{47}{System}"
>     |
>     |
>     V
>   queue "{27}{47}{System}"
>     |
>     +-----+
>     |     |
>     V     V
>     s1    s2
>
> In AMQP, queues perform *round-robin* distribution of messages to consumers
> (a.k.a subscribers), meaning that only *one* subscriber to a queue will get
> each message. (See also Matthew's explanation of acknowledgements.) AMQP's
> *exchanges*, on the other hand, perform message *broadcasting*, copying
> messages onto all (matching) bound queues.
>
> So to get your example of a single publication arriving at two different
> subscribers/consumers simultaneously, you would want something like the
> following:
>
>   exchange "{27}{47}{System}"
>     |
>     +----------------------+
>     |                      |
>     V                      V
>   queue 1                queue 2
>     |                      |
>     |                      |
>     V                      V
>     s1                     s2
>
> Each subscriber should declare an auto-delete, private, uniquely-named queue
> for themselves. Here's how to do that with the .NET client:
>
>  Subscription sub = new Subscription(channel,
>                                      "{27}{47}{System}",
>                                      ExchangeType.Topic,
>                                      "System");
>  foreach (BasicDeliverEventArgs e in sub) {
>    Console.WriteLine(Encoding.UTF8.GetString(e.Body));
>  }
>
> Notice how a queue name is not mentioned: the Subscription calls
> channel.QueueDeclare() for you and uses the resulting private,
> uniquely-named, autodelete queue to bind and consume from.
>
> Matthew wrote about acknowledgements: it's important to call sub.Ack(e)
> after your program successfully processes each message, otherwise the server
> will attempt to redeliver the messages later on, because it isn't being told
> that it's safe to remove them from its queues.
>
> (As an aside, the Subscription generally takes care of declaring exchange
> and queue resources for you -- you don't generally need to call
> ExchangeDeclare, QueueDeclare, QueueBind if you're using Subscription.)
>
> Regards,
>  Tony
>
>




More information about the rabbitmq-discuss mailing list