2017-07-03 23 views
2

背景資料的RabbitMQ EventBasicConsumer不工作

我(對電子郵件)在RabbitMQ的隊列,並希望建立一個消費它。該隊列被另一個.NET應用程序用於向客戶發送電子郵件。我希望電子郵件邏輯能夠放在.NET應用程序之外,並且還具有RabbitMQ提供的耐用性等優點。

發行

的.NET應用程序能夠發佈/電子郵件推到隊列中,但我有困難,構建客戶!這是我對消費者代碼:

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

上面的代碼應該能夠抓住關閉消息隊列並處理它們(根據本official guide),但這沒有發生。

+0

許多事情都可能出錯。你如何發佈消息(交換)?同樣在你當前的代碼中 - 在你創建你的客戶之後(在'BasicConsume'後面),連接會立即關閉,所以你將無法得到任何消息。開始使用後不要立即處理您的連接。 – Evk

+0

@Evk發佈者和消費者都是針對相同的交易所和隊列,我確信這一點。但我認爲你對連接處理是正確的,我會解決這個問題,並且看看它是否能夠做到。 – Ciwan

+0

@Evk你是對的,處理連接是問題,請回復,我會標記爲答案:) – Ciwan

回答

1

問題是過早的連接處置。人們經常認爲BasicConsume是一個阻塞呼叫,但事實並非如此。它將幾乎立即返回,而下一個聲明將處理(關閉)頻道和連接,這當然會取消您的訂閱。所以要修復 - 將連接和模型存儲在專用字段中,並僅在完成隊列消耗時才處理它們。

+0

謝謝,就是這樣。 – Ciwan

0

你說隊列被另一個.Net應用程序使用,是另一個消費者嗎?如果這是另一位消費者,那麼您能否確認您使用的是哪種兌換?如果您希望多個消費者提取消息,請繼續使用「FanOut」交換

+0

原來是@Evk建議的。 – Ciwan

相關問題