2012-11-08 30 views
5

Tôi sử dụng RabbitMQ.Client (phiên bản thời gian chạy v2.0.50727, phiên bản 2.8.1.0) với ứng dụng C# .NET.Đóng kết nối RabbitMQ ngay cả khi ứng dụng không kết thúc một cách duyên dáng

tôi có thể tạo kết nối như thế này:

using (IConnection connection = _factory.CreateConnection()) 
{ 
    using (IModel channel = connection.CreateModel()) 
    { 
     // code... 
    } 
} 

Nếu tôi đóng ứng dụng đúng cách, nó chỉ đơn giản là đóng kênh và kết nối. Nhưng nếu ứng dụng bị đóng không chính xác (ví dụ: nhấn nút khởi động lại trên PC), nó không phải. Tôi muốn đảm bảo rằng tất cả các kết nối không cần thiết (từ các phiên trước hoặc thậm chí các ứng dụng khác, nếu do nhầm lẫn trường hợp ứng dụng đang chạy ở nơi khác) được đóng trước khi tôi khởi động ứng dụng của mình.

Tôi biết tôi có thể sử dụng nhịp tim nhưng có thể ứng dụng của tôi cần nhiều thời gian để bắt đầu làm bất cứ điều gì (nhiều giờ kết nối mở và không được sử dụng). Vì vậy, tôi nghĩ nhịp tim không phải là điều tốt nhất.

Làm cách nào để đóng tất cả các kết nối đã mở cho RMQ? (Hoặc, thậm chí tốt hơn, tất cả các kết nối đã mở, ngoại trừ một IP đã cho)?

Trân trọng!

Trả lời

1

Âm thanh như Heartbeats là giải pháp tốt nhất của bạn. Tôi đã thêm nhịp đập vào các ứng dụng RabbitMQ của tôi vì lý do tương tự (tắt máy vô hiệu). Nó không quan trọng là có một khoảng cách thời gian dài giữa các tin nhắn, nhịp tim sẽ chỉ xác minh rằng kết nối vẫn mở trên cả hai mặt.

3

Tôi gặp phải vấn đề tương tự như bạn. Tôi đã thử rất nhiều phương pháp để đóng những kết nối đó.

Những phương pháp này, một số là công trình một số chỉ là một phần hoạt động. Có lẽ bạn có thể thử.

  1. Sử dụng lệnh rabbitmqctl để xóa hàng đợi sau đó sử dụng trang web quản lý của RMQ đóng các kết nối. Nó có nghĩa là hàng đợi mở hiện tại sẽ hết hạn sau 1 giây (1000 mili giây). Bằng cách này, tất cả các hàng đợi sẽ bị xóa. Sau đó, bạn có thể đóng các kết nối.

    lệnh: "*"

    rabbitmqctl set_policy hết hạn '{ "hết hạn": 1000}' --apply-to hàng đợi

    Queue Time-To-Live hoạch định chính sách ->https://www.rabbitmq.com/ttl.html

    Phương pháp này hoạt động một phần.

  2. Sau khi tìm kiếm, đã có ý tưởng rằng lý do có thể là:

    sản xuất của bạn chờ đợi sự trở lại ACK trở lại, nó sẽ không bị phá hủy cho đến khi bạn gửi ACK để thừa nhận công việc đã hoàn tất.

  3. Cách đột ngột. Công trinh. RMQ lưu các thông tin kết nối trong DB menisa của nó.

    Bước 1: Dừng máy chủ thỏ trước và hủy chuỗi thỏmq bằng 'ps aux | grep thỏmq 'để tìm pid của nó sau đó giết tất cả các thread thỏmq.

    Tìm RMQ DB mensia location (1).$> cd/var/lib/rabbitmq/

    Bước 2: đổi tên tệp mensia thành tên khác thành "xóa" (2). $> Mv mensia mensia-bak

    Bước 3: restart RabbitMQ-server

    Các thứ ba phương pháp làm việc cho tôi bây giờ. Nó có thể đóng tất cả các kết nối mở.

0

Tôi gặp sự cố tương tự khi mở nhân viên trong bảng điều khiển và dừng nó bằng ctrl + c. Sau khi quá trình được đóng lại nhưng kết nối vẫn còn ở đó và nó hiển thị trong bảng quản trị.

  • Một giải pháp là để đóng kết nối trong bảng điều khiển quản trị RabbitMQ
  • hoặc bạn có thể tìm thấy quá trình này và giết nó thủ công sudo kill -9 pid
  • hoặc khi bạn mở một kết nối thiết nhịp tim. Đọc [Dead TCP Connections]
Các vấn đề liên quan