您是否有任何指示如何确定何时发生订阅问题以便我可以重新连接?
我的服务使用 RabbitMQ.Client.MessagePatterns.Subscription 进行订阅。一段时间后,我的客户默默地停止接收消息。我怀疑网络问题,因为我的 VPN 连接不是最可靠的。
我已经通读了一段时间的文档,寻找一个密钥来找出这个订阅何时可能由于网络问题而被破坏,但运气不佳。我试过检查连接和通道是否仍然打开,但它似乎总是报告它仍然打开。
它处理的消息工作得很好,并被确认回队列,所以我认为这不是“ack”的问题。
我确定我一定只是错过了一些简单的东西,但我还没有找到它。
public void Run(string brokerUri, Action<byte[]> handler)
{
log.Debug("Connecting to broker: {0}".Fill(brokerUri));
ConnectionFactory factory = new ConnectionFactory { Uri = brokerUri };
using (IConnection connection = factory.CreateConnection())
{
using (IModel channel = connection.CreateModel())
{
channel.QueueDeclare(queueName, true, false, false, null);
using (Subscription subscription = new Subscription(channel, queueName, false))
{
while (!Cancelled)
{
BasicDeliverEventArgs args;
if (!channel.IsOpen)
{
log.Error("The channel is no longer open, but we are still trying to process messages.");
throw new InvalidOperationException("Channel is closed.");
}
else if (!connection.IsOpen)
{
log.Error("The connection is no longer open, but we are still trying to process message.");
throw new InvalidOperationException("Connection is closed.");
}
bool gotMessage = subscription.Next(250, out args);
if (gotMessage)
{
log.Debug("Received message");
try
{
handler(args.Body);
}
catch (Exception e)
{
log.Debug("Exception caught while processing message. Will be bubbled up.", e);
throw;
}
log.Debug("Acknowledging message completion");
subscription.Ack(args);
}
}
}
}
}
}
更新:
我通过在虚拟机中运行服务器来模拟网络故障,当我断开连接足够长的时间时,我确实得到了一个异常(RabbitMQ.Client.Exceptions.OperationInterruptedException:AMQP 操作被中断)所以它可能不是网络问题。现在我不知道它会是什么,但运行几个小时后它就失败了。