2010-08-11 22 views
21

¿Cómo puedo verificar si ya existe o no un mensaje Cola?¿Cómo puedo verificar si existe o no una cola de mensajes RabbitMQ?

Tengo 2 aplicaciones diferentes, una creando una cola y la otra leyendo desde esa cola.

Así que si ejecuto el Cliente que lee primero de la cola, entonces se bloquea.
Para evitar eso, me gustaría verificar primero si la cola existe o no.

aquí es el fragmento de código de cómo leo la cola:

QueueingBasicConsumer <ConsumerName> = new QueueingBasicConsumer(<ChannelName>); 
<ChannelName>.BasicConsume("<queuename>", null, <ConsumerName>); 
BasicDeliverEventArgs e = (BasicDeliverEventArgs)<ConsumerName>.Queue.Dequeue(); 
+0

aquí está el fragmento de código de cómo leo la cola QueueingBasicConsumer = new QueueingBasicConsumer (); .BasicConsume ("", null, ); BasicDeliverEventArgs e = (BasicDeliverEventArgs) .Queue.Dequeue(); –

+0

He agregado ese fragmento de código a su publicación. En el futuro, haga clic en el enlace ** editar ** al agregar más contexto, en lugar de agregar un comentario.Para obtener más información, consulte la sección ** _ ¿Cuándo debo comentar? _ ** en [la página de Ayuda para comentarios] (https://stackoverflow.com/help/privileges/comment). –

Respuesta

40

No se moleste en comprobar.

queue.declare es una operación idempotente. Por lo tanto, si lo ejecuta una vez, dos veces, N veces, el resultado seguirá siendo el mismo.

Si desea asegurarse de que la cola exista, solo debe declararla antes de usarla. Asegúrese de declararlo con la misma durabilidad, exclusividad y eliminación automática cada vez; de lo contrario, obtendrá una excepción.

Si realmente necesita verificar si existe una cola (normalmente no debería hacerlo), haga una declaración pasiva de la cola. Esa operación tiene éxito si la cola existe, o falla en un error si no lo hace.

+1

Puede mencionar la sintaxis para declarar la cola de forma pasiva en C# api –

+4

Use IModel.QueueDeclare y establezca pasivo en verdadero. http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v1.8.1/rabbitmq-dotnet-client-1.8.1-client-htmldoc/html/type-RabbitMQ.Client.IModel.html – scvalex

+0

lo hice declare la cola antes de usarla ... trabajó bien ... gracias –

0

Esto no funcionará en situaciones en las que haya otra persona (otra aplicación) responsable de la declaración q. Y simplemente no podía saber todos los parámetros de la q, solo el nombre.

Prefiero usar passiveDeclare y comprobar la IOException que el q no existe

0

Actualmente se puede saber que información y mucho más throught RabbitMQ Management HTTP API.

Por ejemplo, para saber si una cola está activa en este momento, puede invocar a GET /api/queues/vhost/name interfaz de la API.

0

Use QueueDeclare() para realizar esto como se sugiere. Además, lo que siempre hemos hecho es hacer que el consumidor de la cola sea el propietario de la cola y publicar siempre en los intercambios creados y de propiedad de los editores. A continuación, los consumidores vinculan sus colas a los intercambios de los que desean recibir tráfico y utilizan un filtro de clave de ruta apropiado para el tráfico que desean. De esta manera, los editores son silenciados por los consumidores para las colas no duraderas, y los consumidores son libres de ir y venir con colas duraderas o no duraderas mapeadas con las claves de ruta apropiadas.

Esto da como resultado un sistema administrado fácilmente y permite que la administración web se use para crear una cola duradera y vincularla a un intercambio, obtener tráfico, desvincularla y luego inspeccionar el contenido de la cola para comprender qué tráfico y carga llegando a través del intercambio.

Cuestiones relacionadas