[rabbitmq-discuss] rabbitmq-c: amqp_exchange_declare() always sets auto-delete to no

Lowell.Boggs at emc.com Lowell.Boggs at emc.com
Wed Jul 6 21:47:45 BST 2011


In rabbitmq-c:


Is there a reason that you cannot create an exchange with the auto_delete property == true?

Here is the source code for the amqp_exchange_declare function:

amqp_exchange_declare_ok_t *
amqp_exchange_declare(amqp_connection_state_t state, amqp_channel_t channel,
                      amqp_bytes_t exchange, amqp_bytes_t type,
                      amqp_boolean_t durable, amqp_table_t arguments)
{
  amqp_exchange_declare_t req;
  req.ticket = 0;
  req.exchange = exchange;
  req.type = type;
  req.passive = passive;
  req.durable = durable;
  req.auto_delete = 0;   // Why always no?
  req.internal = 0;
  req.nowait = 0;
  req.arguments = arguments;

  return amqp_simple_rpc_decoded(state, channel,
                                 AMQP_EXCHANGE_DECLARE_METHOD,
                                 AMQP_EXCHANGE_DECLARE_OK_METHOD,
                                 &req);
}
Is it safe for me as an application devloper to create a clone of this function that has the auto_delete property passed in?  Does the rabbitmq team have plans to change the way the underlying functions work?

Is a temporary exchange even a good idea?

I am trying to simplify the shutdown logic of a multi-threaded application.  I don't want to have to invent a way of signaling my worker threads to shut down.  Instead, I want to send them a message that they can read like normal but have a quick way of identifying that this is a shutdown command.  I am currently writing code for my threads that work like this:

void Thread()
{

    // create the connection
    // declare the primary command exchange
    // declare the qrimary queue
    // declare a "stop command" exchange
    // declare a "stop command" queue
    // bind everyone up and call basic_consume on the queues


    for(;;)
     {
        string exchangeName;
        string topicName;
        string messageBody;

         int error = readMessage(exchangeName, topicName, messageBody);

         if(error) break;

        if(exchangeName == "stop")
           break;

       processMesage(messageBody);

    }
}
Note that I am having multiple threads in multiple executables on multiple machines all reading from the same primary command exchange for performance and redundancy reasons -- so I can't really use the topic to indicate shutdown.  I might want to shutdown a given executable on a given host, not the entire system.

The above logic is working fine, but when I kill a process, I have to remember to delete the exchanges because they don't have an autoDelete flag.

Is there a better way to handle this shutdown logic?

Thanks,
Lowell


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/attachments/20110706/2d2621b3/attachment.htm>


More information about the rabbitmq-discuss mailing list