Есть ли у вас какие-либо указания, как определить, когда возникла проблема с подпиской, чтобы я мог повторно подключиться?
Мой сервис использует RabbitMQ.Client.MessagePatterns.Subscription для своей подписки. Через некоторое время мой клиент молча перестает получать сообщения. Я подозреваю проблемы с сетью, так как наше VPN-соединение не самое надежное.
Я некоторое время читал документы в поисках ключа, чтобы узнать, когда эта подписка может быть нарушена из-за проблемы с сетью, но без особой удачи. Я пытался проверить, что соединение и канал все еще открыты, но всегда кажется, что он все еще открыт.
Сообщения, которые он обрабатывает, работают довольно хорошо и подтверждаются обратно в очередь, поэтому я не думаю, что это проблема с «подтверждением».
Я уверен, что мне просто не хватает чего-то простого, но я еще не нашел его.
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 была прервана), когда я разрываю соединение на достаточно долгое время, поэтому возможно дело не в сети. Теперь я не знаю, что бы это было, но это выходит из строя всего через пару часов работы.