[rabbitmq-discuss] Synchronous confirmation of delivery to the queue

Andrius Norkaitis andrius.norkaitis at oryo.lt
Mon Jul 5 21:39:54 BST 2010


Thanks Matthew.

I tried it, but BasicPublish and TxCommit completes event if there are no
queues to route.

public bool Publish() {
          try{
	ch.TxSelect();
	bool Mandatory = true; Immediate = false;
	ch.BasicPublish("direct", routingKey,Mandatory, Immediate,
basicProperties, body);
	ch.TxCommit();
	return true;
          }
	catch { return false; }
}

I always get TRUE event I there is no consumer/query available.
How to detect that message wasn't published to the queue in same method
calling BasicPublish? I need to return bool flag after trying to publish.

If it is possible only in asynchronous matter using BasicReturn event then I
think I have two options:
1. Lock thread after calling BasicPublish for limited time or while
BasicReturn is returned. (Theading is hard .. Is it good way?)
2. Because I use autodelete query I can check is query available by calling:

bool isConsumerAvailable = false;
try{
ch.QueueDelete(routingKey, true, true, false);
} catch 
{
//if there is no query I get exception code=404, text="NOT_FOUND"
isConsumerAvailable = true;
}

What do you think?

-----Original Message-----
From: rabbitmq-discuss-bounces at lists.rabbitmq.com
[mailto:rabbitmq-discuss-bounces at lists.rabbitmq.com] On Behalf Of Matthew
Sackman
Sent: Monday, July 05, 2010 12:42 PM
To: rabbitmq-discuss at lists.rabbitmq.com
Subject: Re: [rabbitmq-discuss] Synchronous confirmation of delivery to the
queue

Hi,

On Mon, Jul 05, 2010 at 11:05:00AM +0300, Andrius Norkaitis wrote:
> I have publisher which send message to consumer (using direct exchange 
> and non-durable, autodelete queue) and it needs instant confirmation 
> that the message is routed to the query. I can't use asynchronous 
> IModel.BasicReturn event because I need to know is message routed to 
> query instantly after I call publish method. I think it may be done 
> using autodelete queue, mandatory and immediate message flags, and 
> transactions. If subscriber is offline there would be no query to 
> deliver the message so publisher should get exception after it calls
publish method.

The immediate is pretty meaningless in the context of a transaction, and we
largely reinterpret it as mandatory. I suspect you just want to use
mandatory and a transaction.

However note that if you're doing a commit per publish, performance will be
rather slower. This may not affect your application, depending on its needs.

Matthew
_______________________________________________
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