2010-08-11 22 views
21

Comment puis-je vérifier si une file d'attente de messages existe déjà ou non?Comment puis-je vérifier si une file d'attente de messages RabbitMQ existe ou non?

J'ai 2 applications différentes, l'une créant une file d'attente et l'autre lisant de cette file d'attente. Donc, si j'exécute le client qui lit d'abord dans la file d'attente, il se bloque. Donc, pour éviter cela, je voudrais d'abord vérifier si la file d'attente existe ou non.

est ici l'extrait de code de la façon dont je l'ai lu la file d'attente:

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

voici l'extrait de code de la façon dont je lis la file d'attente QueueingBasicConsumer = new QueueingBasicConsumer (); .BasicConsume ("", null, ); BasicDeliverEventArgs e = (BasicDeliverEventArgs) .Queue.Dequeue(); –

+0

J'ai ajouté cet extrait de code à votre message. À l'avenir, veuillez cliquer sur le lien ** modifier ** lorsque vous ajoutez plus de contexte, au lieu d'ajouter un commentaire.Pour plus d'informations, reportez-vous à la section ** _ Quand dois-je commenter? _ ** sur [la page d'aide relative aux commentaires] (https://stackoverflow.com/help/privileges/comment). –

Répondre

40

Ne pas pris la peine de vérifier.

queue.declare est une opération idempotente. Donc, si vous l'exécutez une fois, deux fois, N fois, le résultat sera toujours le même.

Si vous souhaitez vous assurer que la file d'attente existe, déclarez-la simplement avant de l'utiliser. Assurez-vous de le déclarer avec la même durabilité, l'exclusivité, la suppression automatique à chaque fois, sinon vous obtiendrez une exception.

Si vous avez réellement besoin de vérifier si une file d'attente existe (vous ne devriez normalement pas le faire), faites une déclaration passive de la file d'attente. Cette opération réussit si la file d'attente existe ou échoue dans une erreur si ce n'est pas le cas.

+1

Pouvez-vous s'il vous plaît mentionner la syntaxe pour déclarer la file d'attente passivement dans C# api –

+4

Utilisez IModel.QueueDeclare et définissez passive à true. 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

je l'ai fait déclarer la file d'attente avant de l'utiliser..a bien travaillé .. merci –

0

Cela ne fonctionnera pas dans les situations où il y a quelqu'un d'autre (autre application) responsable de la déclaration q. Et je ne pouvais tout simplement pas connaître tous les paramètres du q, juste le nom.

Je préférerais utiliser passiveDeclare et vérifier la IOException que q n'existe pas

0

Actuellement, vous pouvez savoir que les informations et beaucoup plus throught RabbitMQ Management HTTP API.

Par exemple, pour savoir si une file d'attente est en cours à ce moment, vous pouvez appeler l'interface GET /api/queues/vhost/name de l'API.

0

Utilisez QueueDeclare() pour effectuer cela comme suggéré. En outre, nous avons toujours fait en sorte que le consommateur de la file d'attente soit le propriétaire de la file d'attente et publions toujours dans les échanges qui sont créés et détenus par les éditeurs. Les consommateurs lient ensuite leurs files d'attente aux échanges auxquels ils souhaitent recevoir du trafic et utilisent un filtre de clé de route approprié pour le trafic qu'ils souhaitent. De cette façon, les éditeurs ne sont pas pris en compte par les consommateurs pour les files d'attente non durables, et les consommateurs sont libres d'aller et venir avec des files d'attente durables ou non durables mappées avec les clés de routage appropriées. Il en résulte un système facile à administrer et permet d'utiliser l'administration Web pour créer une file d'attente durable et la lier à un échange, obtenir du trafic, la dissocier, puis inspecter le contenu de la file pour comprendre le trafic et la charge venir à travers l'échange.