这是它的一个例子,但标明答案是什么导致我这个。
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