2013-02-22 16 views
8

Nếu tôi kết nối với RabbitMQ và nghe các sự kiện bằng EventingBasicConsumer, làm thế nào tôi có thể biết liệu tôi có bị ngắt kết nối khỏi máy chủ không?Làm thế nào một ứng dụng khách hàng của RabbitMQ có thể cho biết khi nào nó mất kết nối với máy chủ?

Tôi biết có sự kiện Tắt máy, nhưng nó không kích hoạt nếu tôi rút cáp mạng của mình để mô phỏng lỗi.

Tôi cũng đã thử sự kiện ModelShutdown và CallbackException trên mô hình nhưng dường như không có cách nào hoạt động.

CHỈNH SỬA ----- Tôi đánh dấu là câu trả lời đúng, nhưng đó chỉ là một phần của giải pháp cho tôi. Ngoài ra còn có chức năng HeartBeat được xây dựng trong RabbitMQ. Máy chủ chỉ định nó trong tệp cấu hình. Nó mặc định là 10 phút nhưng tất nhiên bạn có thể thay đổi điều đó.

Máy khách cũng có thể yêu cầu một khoảng thời gian khác cho nhịp tim bằng cách đặt giá trị RequestedHeartbeat trên cá thể ConnectionFactory.

+0

Bạn có thể thêm nhịp tim vào kết nối sẽ phát hiện gián đoạn dịch vụ – robthewolf

+0

Bạn có thể đăng toàn bộ mã không? Tôi đang đối mặt với cùng một vấn đề. Cảm ơn trước. – Pritam

+0

Bạn thực sự cần 3 thứ. 1 ConnectionFactory cần thiết lập một RequestedHeartBeat. 2 sau khi bạn tạo một kết nối xác định sự kiện ConnectionShutdown như được mô tả trong câu trả lời được đánh dấu. 3 đảm bảo bạn đã thiết lập chính xác trong tập tin cấu hình thỏmq. (xin lỗi tôi không có phần đó xung quanh hiện tại.) Tôi sẽ xem nếu tôi có thể giải nén mã mà không có bất kỳ công cụ cụ thể thực hiện. – Kelly

Trả lời

5

Tôi đoán bạn đang sử dụng thư viện C#? (nhưng ngay cả như vậy tôi nghĩ những người khác có một sự kiện tương tự).

Bạn có thể làm như sau:

public class MyRabbitConsumer 
{ 
    private IConnection connection; 

    public void Connect() 
    { 
    connection = CreateAndOpenConnection(); 
    connection.ConnectionShutdown += connection_ConnectionShutdown; 
    } 

    public IConnection CreateAndOpenConnection() { ... } 

    private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason) 
    { 

    } 
} 
+0

Tôi nên triển khai mã này ở đâu? – Pritam

0

Đây là một ví dụ về điều đó, nhưng câu trả lời được đánh dấu là những gì đưa tôi đến đây.

var factory = new ConnectionFactory 
{ 
    HostName = "MY_HOST_NAME", 
    UserName = "USERNAME", 
    Password = "PASSWORD", 
    RequestedHeartbeat = 30 
}; 

using (var connection = factory.CreateConnection()) 
{ 
    connection.ConnectionShutdown += (o, e) => 
    {      
     //handle disconnect        
    }; 

    using (var model = connection.CreateModel()) 
    { 
     model.ExchangeDeclare(EXCHANGE_NAME, "topic"); 
     var queueName = model.QueueDeclare(); 

     model.QueueBind(queueName, EXCHANGE_NAME, "#"); 

     var consumer = new QueueingBasicConsumer(model); 
     model.BasicConsume(queueName, true, consumer); 

     while (!stop) 
     { 
      BasicDeliverEventArgs args;      
      consumer.Queue.Dequeue(5000, out args); 

      if (stop) return; 

      if (args == null) continue; 
      if (args.Body.Length == 0) continue; 

      Task.Factory.StartNew(() => 
      { 
       //Do work here on different thread then this one 
      }, TaskCreationOptions.PreferFairness); 
     } 
    } 
} 

Một vài điều cần lưu ý về điều này.

Tôi đang sử dụng # cho chủ đề. Điều này lấy tất cả mọi thứ. Thông thường bạn muốn giới hạn bởi một chủ đề.

Tôi đang đặt biến được gọi là "dừng" để xác định thời điểm quá trình kết thúc. Bạn sẽ nhận thấy vòng lặp chạy mãi mãi cho đến khi biến đó là đúng.

Dequeue đợi 5 giây sau đó thoát mà không nhận dữ liệu nếu không có thông báo mới. Điều này là để đảm bảo chúng tôi lắng nghe biến số dừng đó và thực sự thoát tại một số điểm. Thay đổi giá trị theo ý thích của bạn.

Khi thông báo đến, tôi sinh ra mã xử lý trên một chuỗi mới. Các chủ đề hiện tại đang được dành riêng cho chỉ nghe các tin nhắn thỏmq và nếu một xử lý mất quá nhiều thời gian để xử lý tôi không muốn nó làm chậm các tin nhắn khác. Bạn có thể hoặc không cần điều này tùy thuộc vào việc triển khai của bạn. Hãy cẩn thận tuy nhiên viết mã để xử lý các tin nhắn. Nếu phải mất một phút để chạy và nhận được tin nhắn của bạn ở lần thứ hai, bạn sẽ hết bộ nhớ hoặc ít nhất là vào các vấn đề hiệu suất nghiêm trọng.

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