2017-07-03 5 views
2

CONTEXTE INFORabbitMQ EventBasicConsumer ne fonctionne pas

J'ai une file d'attente (des e-mails) à RabbitMQ, et que vous voulez construire un consommateur pour lui. La file d'attente est utilisée par une autre application .NET pour l'envoi de courriels aux clients. Je voulais que la logique de l'emailing soit installée en dehors de l'application .NET, et qu'elle ait aussi les avantages de la durabilité ... etc qu'offre RabbitMQ.

NUMÉRO

L'application .NET est en mesure de publier/push e-mails sur la file d'attente, mais je du mal à élaborer le consommateur! Voici mon code pour le consommateur:

// A console app that would be turned into a service via TopShelf 
public void Start() 
{ 
    using (_connection = _connectionFactory.CreateConnection()) 
    { 
    using (var model = _connection.CreateModel()) 
    { 
     model.QueueDeclare(_queueName, true, false, false, null); 
     model.BasicQos(0, 1, false); 

     var consumer = new EventingBasicConsumer(model); 
     consumer.Received += (channelModel, ea) => 
     { 
     var message = (Email) ea.Body.DeSerialize(typeof(Email)); 
     Console.WriteLine("----- Email Processed {0} : {1}", message.To, message.Subject); 
     model.BasicAck(ea.DeliveryTag, false); 
     }; 
     var consumerTag = model.BasicConsume(_queueName, false, consumer); 
    } 
    } 
} 

Le code ci-dessus doit être en mesure de saisir les messages de la file d'attente et de les traiter (selon ce official guide), mais cela ne se produit pas.

+0

Beaucoup de choses peuvent mal tourner. Comment publiez-vous les messages (à quel échange)? Aussi dans votre code actuel - la connexion sera fermée immédiatement après la création de votre client (après 'BasicConsume') de sorte que vous ne serez pas en mesure d'obtenir des messages de toute façon. Ne jetez pas votre connexion juste après le début de la consommation. – Evk

+0

@Evk à la fois l'éditeur et le consommateur visent le même échange et la file d'attente, j'en suis certain. Mais je pense que vous avez raison au sujet de l'élimination des connexions, je vais corriger cela, et voir si cela fait quoi que ce soit. – Ciwan

+0

@Evk vous aviez raison, la disposition de la connexion était le problème, s'il vous plaît répondre et je vais marquer comme réponse :) – Ciwan

Répondre

1

Le problème est l'élimination prématurée des connexions. Les gens pensent souvent que BasicConsume est un appel bloquant, mais ce n'est pas le cas. Il reviendra presque immédiatement, et la déclaration suivante mettra fin à la chaîne et à la connexion, ce qui bien sûr annulera votre abonnement. Donc, pour réparer - stocker la connexion et le modèle dans des champs privés et ne les disposer que lorsque vous avez terminé avec la consommation de la file d'attente.

+0

Merci, c'était tout. – Ciwan

0

Vous avez dit que la file d'attente est utilisée par une autre application .Net, est-ce un autre consommateur? Si c'est un autre consommateur, pouvez-vous s'il vous plaît confirmer l'échange que vous utilisez? Si vous voulez que plusieurs consommateurs prennent le message, passez à l'échange "FanOut"

+0

Il s'est avéré être ce que @Evk suggéré. – Ciwan