J'utilise RabbitMQ sur RHEL 5.3 en utilisant le client Java. J'ai 2 noeuds (machines). Node1 consomme des messages à partir d'une file d'attente sur Node2 à l'aide de la classe auxiliaire Java QueueingConsumer.En utilisant RabbitMQ (client Java), existe-t-il un moyen de déterminer si la connexion réseau est fermée pendant la consommation?
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
while (true)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
... Process message - delivery.getBody()
}
Si l'interface est désactivée sur Node1 ou Node2 (par exemple ifconfig eth1 vers le bas), le client (ci-dessus) ne sait jamais le réseau est plus là. RabbitMQ fournit-il un type de configuration sur le client Java qui peut être utilisé pour déterminer si la connexion a disparu. L'arrêt du serveur RabbitMQ sur Node2 déclenche une exception ShutdownSignalException, qui peut être interceptée et l'application peut entrer dans une boucle de reconnexion. Mais l'abaissement de l'interface ne provoque aucun type d'exception, donc le code attendra toujours sur consumer.nextDelivery().
J'ai également essayé d'utiliser la version timeout de cet appel. par exemple.
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
int timeout_ms = 30000;
while (true)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery(timeout_ms);
if (delivery == null)
{
if (channel.isOpen() == false) // Seems to always return true
{ throw new ShutdownSignalException(); }
}
else
{
... Process message - delivery.getBody()
}
}
mais semble que cela retourne toujours vrai (même si l'interface est en panne). Je suppose que l'inscription pour le ShutdownListener sur la connexion donnera les mêmes résultats, mais je n'ai pas encore essayé.
Existe-t-il un moyen de configurer une sorte de pulsation, ou avez-vous juste besoin d'écrire une logique de location personnalisée (par exemple "Je suis là maintenant") pour que cela fonctionne?