2010-03-18 23 views
13

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?

Trả lời

4

Nói chung, bạn nên đăng câu hỏi liên quan đến thỏmq trên danh sách gửi thư thỏmq-thảo luận. Chúng tôi không có xu hướng theo dõi các câu hỏi được hỏi bên ngoài điều này.

Có một nhịp tim mà bạn có thể định cấu hình, mặc dù nó bị tắt theo mặc định. Bạn cũng có thể bật TCP Keep Alive. Hãy gọi setRequestedHeartbeat trên ConnectionFactory trước khi tạo kết nối mới hoặc, phân lớp ConnectionFactory, ghi đè phương thức configureSocket và gọi socket.setKeepAlive(true). Cả hai sẽ dẫn đến kết nối nhận thấy khi mạng chết.

3

Về phương pháp ISOpen, đó là mô tả tốt trong các tài liệu: http://www.rabbitmq.com/api-guide.html#shutdown-atomicity

Về tắt: với đóng cửa node1 hoặc 2 bạn có nghĩa là các ứng dụng ngay, không phải là máy chủ RabbitMQ bản thân? Tại sao bạn muốn biết trên bất kỳ ứng dụng nào nếu ứng dụng khác ngắt kết nối khỏi nhà môi giới tin nhắn? Đó không phải là điểm nhắn tin.

Điều duy nhất bạn có thể làm là gửi thông báo có tham số 'bắt buộc'. Điều đó nói với các máy chủ RabbitMQ bạn mong đợi ít nhất 1 người nghe cho tin nhắn bạn đã gửi (cho dù đó là một hàng đợi trực tiếp hoặc một số hàng đợi trong một trao đổi chủ đề/fanout). Nếu thông báo sau đó không thể được gửi đến bất kỳ hàng đợi nào, thông báo sẽ trở lại kênh của bạn và được chuyển tiếp đến ReturnListener đã cho.

Các vấn đề liên quan