這是它的一個例子,但標明答案是什麼導致我這個。
var factory = new ConnectionFactory
{
HostName = "MY_HOST_NAME",
UserName = "USERNAME",
Password = "PASSWORD",
RequestedHeartbeat = 30
};
using (var connection = factory.CreateConnection())
{
connection.ConnectionShutdown += (o, e) =>
{
//handle disconnect
};
using (var model = connection.CreateModel())
{
model.ExchangeDeclare(EXCHANGE_NAME, "topic");
var queueName = model.QueueDeclare();
model.QueueBind(queueName, EXCHANGE_NAME, "#");
var consumer = new QueueingBasicConsumer(model);
model.BasicConsume(queueName, true, consumer);
while (!stop)
{
BasicDeliverEventArgs args;
consumer.Queue.Dequeue(5000, out args);
if (stop) return;
if (args == null) continue;
if (args.Body.Length == 0) continue;
Task.Factory.StartNew(() =>
{
//Do work here on different thread then this one
}, TaskCreationOptions.PreferFairness);
}
}
}
需要注意的一些事項。
我正在使用#作爲主題。這抓住了一切。通常你想限制一個主題。
我設置了一個名爲「stop」的變量來確定進程何時結束。您會注意到循環會一直運行,直到該變量爲真。
如果沒有新消息,則出隊等待5秒鐘,然後離開而不獲取數據。這是爲了確保我們監聽那個停止變量,並在某個時刻實際退出。根據您的喜好更改值。
當消息進來時,我在新線程上產生處理代碼。當前線程僅用於監聽rabbitmq消息,並且如果處理程序花費太長時間處理,我不希望它減慢其他消息的速度。您可能會也可能不需要這取決於您的實施。但要小心編寫處理消息的代碼。如果需要一分鐘時間運行,並且您在次秒鐘內收到消息,則會導致內存不足,或者至少會導致嚴重的性能問題。
您可以將心跳添加到將檢測服務中斷的連接 – robthewolf 2013-02-23 08:20:03
您可以發佈整個代碼嗎?我面臨同樣的問題。提前致謝。 – Pritam 2015-01-16 10:51:42
你真的需要3件東西。 1 ConnectionFactory需要設置一個RequestedHeartBeat。 2在創建連接之後定義ConnectionShutdown事件,如標記答案中所述。 3確保你已經在rabbitmq配置文件中正確設置了它。 (對不起,我目前沒有這部分內容)。我會看看我是否可以在沒有任何特定實現的情況下提取代碼。 – Kelly 2015-01-18 17:24:15