Sto usando RabbitMQ su RHEL 5.3 utilizzando il client Java. Ho 2 nodi (macchine). Il nodo 1 sta consumando messaggi da una coda su Nodo2 utilizzando la classe helper Java QueueingConsumer.Utilizzando RabbitMQ (client Java), esiste un modo per determinare se la connessione di rete viene chiusa durante il consumo?
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
while (true)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
... Process message - delivery.getBody()
}
Se l'interfaccia è portato giù sul Nodo 1 o Nodo2 (ad esempio ifconfig eth1 verso il basso), il cliente (sopra) non si sa mai la rete non è più lì. RabbitMQ fornisce un tipo di configurazione sul client Java che può essere utilizzata per determinare se la connessione è andata via. La chiusura del server RabbitMQ su Nodo2 attiverà un'eccezione ShutdownSignalException, che può essere intercettata e l'app può entrare in un ciclo di riconnessione. Ma l'interruzione dell'interfaccia non causa alcun tipo di eccezione, quindi il codice sarà in attesa per sempre su consumer.nextDelivery().
Ho anche provato a utilizzare la versione di timeout di questa chiamata. per esempio.
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()
}
}
ma sembra che questo restituisca sempre true (anche se l'interfaccia è inattiva). Presumo che la registrazione per ShutdownListener sulla connessione produrrà gli stessi risultati, ma non l'ho ancora provato.
C'è un modo per configurare una sorta di heartbeat, o devi solo scrivere la logica del lease personalizzato (ad esempio "Sono qui ora") per farlo funzionare?