Tôi đang sử dụng RabbitMQ trên RHEL 5.3 bằng ứng dụng khách Java. Tôi có 2 nút (máy). Node1 đang tiêu thụ các thông điệp từ một hàng đợi trên Node2 bằng cách sử dụng lớp trình trợ giúp Java QueueingConsumer.Sử dụng RabbitMQ (máy khách Java), có cách nào để xác định xem kết nối mạng có bị đóng trong khi sử dụng không?
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume("MyQueueOnNode2", noAck, consumer);
while (true)
{
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
... Process message - delivery.getBody()
}
Nếu giao diện được đưa xuống Node1 hoặc Node2 (ví dụ ifconfig eth1 down), máy khách (ở trên) không bao giờ biết mạng không còn ở đó nữa. Có RabbitMQ cung cấp một số loại cấu hình trên máy khách Java có thể được sử dụng để xác định xem kết nối đã biến mất chưa. Tắt máy chủ RabbitMQ trên Node2 sẽ kích hoạt một ShutdownSignalException, có thể bị bắt và ứng dụng có thể đi vào vòng lặp kết nối lại. Nhưng việc đưa giao diện xuống không gây ra bất kỳ loại ngoại lệ nào xảy ra, vì vậy mã sẽ chờ đợi mãi mãi trên consumer.nextDelivery().
Tôi cũng đã thử sử dụng phiên bản hết giờ của cuộc gọi này. ví dụ.
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()
}
}
nhưng dường như điều này luôn trả về đúng (mặc dù giao diện bị hỏng). Tôi giả định đăng ký ShutdownListener trên kết nối sẽ mang lại kết quả tương tự, nhưng chưa thử.
Có cách nào để định cấu hình một số loại nhịp tim hay bạn chỉ phải viết logic cho thuê tùy chỉnh (ví dụ: "Tôi ở đây bây giờ") để làm việc này?