2011-11-04 20 views
7

Estoy intentando escribir un servicio wcf que funcione sobre el enlace rabbitMQ. Pude crear con éxito un servidor y un cliente y hacer que el cliente envíe mensajes al servidor a través de la cola. Estoy confundido acerca de 2 problemas.RabbitMQ con WCF y una cola persistente

  1. Tan pronto como se cierre el servicio, la cola se eliminará. ¿Hay alguna forma de configurar wcf y rabbitMQ para que la cola sea persistente? De esta forma, no tengo que preocuparme por perder datos si mi servidor falla.

  2. Parece que no puedo controlar el nombre de la cola. Cuando ejecuto rabbitmqctl.bat list_queues veo que la cola se llama amq.gen-3IgZD30XvTEQWNRsezSUUA==. ¿Hay alguna manera de controlar el nombre de la cola?

Respuesta

9

Eso no se puede hacer con los enlaces WCF. Vea el hilo de la lista de correo this para más detalles.

Básicamente, no se puede controlar el nombre de la cola a través de WCF, lo que significa que se limitan a colas anónimos (como el que usted está viendo), que, a su vez, significa que sólo se puede utilizar no persistente colas

Si necesita más control de lo que ofrecen los enlaces WCF, debería considerar utilizar el cliente .NET completo. Es bastante fácil de usar, y hay un montón de tutorials para ayudarlo a comenzar (están en Java, pero la API de .NET es muy similar).

+4

Gracias. Esa es la respuesta que estaba buscando. Básicamente, hace que sea inútil incluso tener un enlace WCF para rabbitMQ si no puede darte este control. –

5

Tuve el mismo problema que tú y lo que hice fue editar el código fuente de rabbitMQDotNetClient.

del archivo: RabbitMQInputChannel.cs

public override void Open(TimeSpan timeout) 
    {    
     if (State != CommunicationState.Created && State != CommunicationState.Closed) 
      throw new InvalidOperationException(string.Format("Cannot open the channel from the {0} state.", base.State)); 

     OnOpening(); 
#if VERBOSE 
     DebugHelper.Start(); 
#endif 
     //Create a queue for messages destined to this service, bind it to the service URI routing key 
#if USE_DEFINED_QUEUE_NAMES 
     //here we create a queue that uses the name given in the service address in the wcf binding. 
     //if the address in the web.config is: soap.amq:///QueueName 
     //the name of the queue will be: QueueName 
     //LVV 
     string queue = m_model.QueueDeclare(base.LocalAddress.Uri.PathAndQuery, true, false, false, null); 
#else 
     string queue = m_model.QueueDeclare(); 
#endif 
     m_model.QueueBind(queue, Exchange, base.LocalAddress.Uri.PathAndQuery, null); 

     //Listen to the queue 
     m_messageQueue = new QueueingBasicConsumer(m_model); 
     m_model.BasicConsume(queue, false, m_messageQueue); 

#if VERBOSE 
     DebugHelper.Stop(" ## In.Channel.Open {{\n\tAddress={1}, \n\tTime={0}ms}}.", LocalAddress.Uri.PathAndQuery); 
#endif 
     OnOpened(); 
    } 

compilar con la bandera USE_DEFINED_QUEUE_NAMES. Esto creará un nombre de cola con el nombre que ha dado en su archivo app.config o web.config. Siempre puede cambiar las opciones de colas en QueueDeclare (...) si desea que sus colas se comporten de manera diferente a las que estoy creando. ¡Salud!

Cuestiones relacionadas