[rabbitmq-discuss] Persistent message in perl
Alexandru Scvorţov
alexandru at rabbitmq.com
Mon Dec 20 16:11:22 GMT 2010
Hi,
Queues and exchanges don't work like that.
An exchange is just a router, it doesn't store messages. That's the
queues' job.
What you want to do is this:
- publisher declares a durable queue with a known name and binds it to an
exchange (by default it's bound the default exchange with its name
as routing key; the default exchange is "amq.default" or "")
- publisher publishes a persistent message to the exchange, which
routes it to the queue (the routing key should be the queue's name,
or whatever you bound the queue with)
- consumer declares a durable queue with the same name (this is just
to make sure that it exists; it's effectively a no-op)
- consumer consumes or gets from the queue.
Hope this helps.
Cheers,
Alex
On Mon, Dec 20, 2010 at 03:38:11PM +0000, underattack7 wrote:
> Hi,
>
> I am struggling with persistent message in perl.
>
> What I am trying to achieve is :
> - publish message to a direct exchange
> - the exchange stores the message
> - a consumer creates a queue, binds it to the exchange, and get all the
> stored messages
>
> I have a durable exchange, and apparently I would need to publish message
> using "delivery_mode = 2" for the exchange to store the message until a
> queue is bound to it....is that right ?
>
> The problem I have is that when my consumer creates a queue and bind it to
> the exchange, it does not get all the message sent.
>
>
> My publisher code :
>
> #!/usr/bin/perl
> use Net::RabbitMQ;
>
> my $myexchange=$ARGV[0];
> my $rkey=$ARGV[1];
> my $text=$ARGV[2];
>
> my $mq = Net::RabbitMQ->new();
> $mq->connect("rabbitmqserver", { vhost=>"chat", user => "guest", password =>
> "guest" });
> $mq->channel_open(1);
> $mq->publish(1, $rkey, $text, {exchange => $myexchange}, { content_type =>
> 'text/plain', delivery_mode => 2});
> mqdisconnect;
> exit 0;
>
>
> I execute it with for example :
> ./publish.pl "exchangechat" "toto" "hi toto1"
> ./publish.pl "exchangechat" "toto" "hi toto2"
> ./publish.pl "exchangechat" "toto" "hi toto3"
>
>
>
> The consumer code is :
> #!/usr/bin/perl
> use Net::RabbitMQ;
>
> my $exchange=$ARGV[0];
> my $rkey=$ARGV[1];
>
> my $mq = Net::RabbitMQ->new();
> $mq->connect("rabbitmqserver", { vhost => "chat", user => "guest", password
> => "guest" });
> $mq->channel_open(1);
> my $queuename = $mq->queue_declare(1, '', {exclusive => 1, durable => 0,
> auto_delete => 1});
> $mq->queue_bind(1, "$queue", "$exchange", "$rkey");
>
> while(1) {
> my $message = $mq->get(1, $queuename);
> if ( defined($message) ) {
> print $message->{'routing_key'} . "\n";
> print $message->{'body'} . "\n";
> print "\n\n";
> }
> sleep(1);
> }
> exit 0;
>
> And I run it with :
> ./consume.pl exchangechat "toto"
>
> but I do not get the message "hi toto1"
>
>
> Any idea what's wrong here ?
>
> Thanks,
>
> Fab
> _______________________________________________
> rabbitmq-discuss mailing list
> rabbitmq-discuss at lists.rabbitmq.com
> https://lists.rabbitmq.com/cgi-bin/mailman/listinfo/rabbitmq-discuss
More information about the rabbitmq-discuss
mailing list