2017-07-03 6 views
2

HINTERGRUND INFORabbitMQ EventBasicConsumer nicht

Arbeit habe ich eine Warteschlange (für E-Mails) in RabbitMQ, und will für sie einen Verbraucher aufzubauen. Die Warteschlange wird von einer anderen .NET-App zum Senden von E-Mails an Kunden verwendet. Ich wollte, dass die E-Mail-Logik außerhalb der .NET-App sitzt, und auch die Vorteile der Haltbarkeit ... etc, die RabbitMQ bietet.

AUSGABE

Die NET-Anwendung ist in der Lage zu veröffentlichen/Push-E-Mails in die Warteschlange, aber ich habe Schwierigkeiten den Aufbau der Verbraucher! Hier ist mein Code für den Verbraucher:

// 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); 
    } 
    } 
} 

Der obige Code sollte in der Lage sein, Nachrichten aus der Warteschlange zu greifen und verarbeiten sie (nach dieser official guide), aber dies ist nicht der Fall.

+0

Viele Dinge können schief gehen. Wie publizierst du Nachrichten (an welchen Austausch)? Auch in Ihrem aktuellen Code - Verbindung wird sofort geschlossen, nachdem Sie Ihren Consumer erstellen (nach 'BasicConsume'), so dass Sie sowieso keine Nachrichten erhalten können. Entsorgen Sie Ihre Verbindung nicht direkt nach dem Beginn des Verbrauchs. – Evk

+0

@Evk sowohl der Publisher als auch der Verbraucher zielen auf denselben Austausch und dieselbe Warteschlange ab, davon bin ich sicher. Aber ich denke, Sie haben Recht mit der Verbindungsentsorgung, ich werde das beheben und sehen, ob das irgendetwas bewirkt. – Ciwan

+0

@Evk Sie hatten Recht, die Beseitigung der Verbindung war das Problem, bitte antworten Sie und ich werde als Antwort markieren :) – Ciwan

Antwort

1

Das Problem ist vorzeitige Verbindung Entsorgung. Leute denken oft, dass BasicConsume ein blockierender Anruf ist, aber es ist nicht. Es wird fast sofort zurückkehren, und die nächste Erklärung ist die Entsorgung (Schließung) des Kanals und der Verbindung, die natürlich Ihr Abonnement kündigen wird. So, um zu reparieren - speichern Sie Verbindung und Modell in den privaten Feldern und entsorgen Sie sie nur, wenn Sie mit Queue-Verbrauch fertig sind.

+0

Danke, das war es. – Ciwan

0

Sie sagten, Warteschlange wird von einer anderen .Net-App verwendet, ist das ein anderer Verbraucher? Wenn das ein anderer Verbraucher ist, können Sie dann bitte bestätigen, welchen Austausch Sie verwenden? Wenn Sie möchten, dass mehrere Verbraucher die Nachricht abholen, dann fahren Sie bitte mit "FanOut" Austausch

+0

Es stellte sich heraus, was @Evk vorgeschlagen. – Ciwan