我正在处理一个从rabbitmq队列中使用的worker服务,并且我正在尝试找出如何处理通道关闭事件,例如:假设我的消费者在30分钟内没有确认经纪人,经纪人因此关闭了通道。
我知道rabbitmq clinet库(我使用的是C#库)会在连接关闭时自动尝试重新连接,但当连接处于活动状态但通道关闭时,最佳做法是什么?我可以注册“通道关闭”事件的处理程序,但除了记录它之外,我还应该在此处理程序中做什么?我毕竟希望继续从相关队列中使用。
这是我的代码,我试图再次创建通道,但我得到超时异常:
var consumer = ...
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
channel.BasicQos(0, 100, false);
channel.ModelShutdown += (sender, args) =>
{
try
{
Log.Error($"channel was shut down");
channel = _connection.CreateModel();
channel.BasicConsume(queue: queueName, autoAck: false, consumer: consumer);
channel.BasicQos(0, 100, false)
}
catch (Exception exception)
{
Log.Error(exception);
}
1条答案
按热度按时间zzlelutf1#
据我所知,这个问题与以下事实有关:事件处理发生在试图访问RabbitMQ服务器的同一个线程中,或者有一个锁阻止了通道的创建。