Sterownik RabbitMQ C # przestaje odbierać wiadomości
Czy masz jakieś wskazówki, jak określić, kiedy wystąpił problem z subskrypcją, aby móc się ponownie połączyć?
Moja usługa korzysta z RabbitMQ.Client.MessagePatterns.Subskrypcja na jej subskrypcję. Po pewnym czasie mój klient po cichu przestaje odbierać wiadomości. Podejrzewam, że problemy z siecią, ponieważ nasze połączenie VPN nie jest najbardziej niezawodne.
Przeczytałem dokumenty przez chwilę szukając klucza, aby dowiedzieć się, kiedy ta subskrypcja może zostać zerwana z powodu problemu z siecią bez większego szczęścia. Próbowałem sprawdzić, czy połączenie i kanał są nadal otwarte, ale zawsze wydaje się, że nadal jest otwarty.
Przetwarzane przez niego komunikaty działają całkiem dobrze i są potwierdzane z powrotem w kolejce, więc nie wydaje mi się, aby był to problem z „ack”.
Jestem pewien, że po prostu brakuje mi czegoś prostego, ale jeszcze go nie znalazłem.
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);
}
}
}
}
}
}
AKTUALIZACJA:
Symulowałem awarię sieci, uruchamiając serwer na maszynie wirtualnej i jarobić uzyskaj wyjątek (RabbitMQ.Client.Exceptions.OperationInterruptedException: Operacja AMQP została przerwana), gdy przerwam połączenie na wystarczająco długo, więc może nie jest to problem z siecią. Teraz nie wiem, co by to było, ale zawodzi po zaledwie kilku godzinach pracy.