Đâ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.
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
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
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