我正在设置一个标准的独立线程,在C#中监听RabbitMQ。假设在线程监听的方法是这样的:在C#客户端为RabbitMQ正常停止消息消息的优雅方式是什么?
public void Listen()
{
using (var channel = connection.CreateModel())
{
var consumer = SetupQueues(channel);
while (true)
{
var ea = consumer.Queue.Dequeue(); // blocking call
handler.HandleMessage(channel, ea);
}
}
}
什么是对的RabbitMQ C#的客户端正常停止的消息消费的一个优雅的方式?请记住,我没有发现任何利用在RabbitMQ的例子/文档或这些所谓的问题:
- How to stop consuming message from selective queue - RabbitMQ
- How to pause and resume consumption gracefully in rabbitmq, pika python
- What is the best way to safely end a java application with running RabbitMQ consumers
这里的问题是consumer.Queue.Dequeue()
是一个阻塞调用。我试过这些选项:
打电话
channel.BasicCancel(string tag)
。这导致阻塞呼叫中的System.IO.EndOfStreamException
。我不想将这个异常作为控制流程的一部分,原因很明显。调用
consumer.Queue.Dequeue(int millisecondsTimeout, out T result)
并检查循环迭代之间的标志。这可以工作,但似乎hacky。
我想平稳地让线程退出并清理所有非托管资源,我可能有,所以没有线程中止,等
任何帮助表示赞赏。谢谢
据我所知,没有“干净”的方式来做到这一点。我个人使用超时方法 - 我的消费者线程检查一个标志,并根据此标志决定要执行的操作。这实际上似乎工作正常。从本质上讲,应用程序的状态决定了队列是否应该被消费 - 并且消费者循环只是在它尝试之前检查它是否应该消耗。 – Beardy 2014-09-29 17:17:12