RabbitMQ C# pilote cesse de recevoir des messages

Avez-vous des pointeurs de la façon de déterminer quand un abonnement problème a eu lieu donc je ne peux reconnecter?

Mon service utilise RabbitMQ.Client.MessagePatterns.Abonnement pour un abonnement. Après un certain temps, mon client silencieusement cesse de recevoir des messages. Je soupçonne des problèmes de réseau que j'notre connexion VPN n'est pas le plus fiable.

J'ai lu dans les docs pour un certain temps à la recherche d'une clé pour savoir quand cet abonnement peut être rompu en raison d'un problème de réseau sans beaucoup de chance. J'ai essayé de vérifier que la connexion et le canal sont encore ouvertes, mais il semble toujours à signaler qu'il est toujours ouvert.

Les messages qu'il n'processus de travail assez bien et sont reconnus en arrière de la file d'attente, donc je ne pense pas que c'est un problème avec le "ack".

Je suis sûr que je dois être en manque juste quelque chose de simple, mais je n'ai pas encore trouvé.

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);
}
}
}
}
}
}

Mise à JOUR:

J'ai simulé une panne de réseau, par l'exécution de l'server dans une machine virtuelle et je ne obtenir une exception (RabbitMQ.Client.Des Exceptions.OperationInterruptedException: Le AMQP opération a été interrompue) quand je me casse la connexion assez longtemps, alors peut-être que ce n'est pas un problème de réseau. Maintenant, je ne sais pas ce qu'il serait, mais il ne parvient pas au bout de seulement quelques heures de cours.

InformationsquelleAutor Aaron Milner | 2012-09-19