Tôi muốn gửi tin nhắn đến máy chủ RabbitMQ và sau đó chờ tin nhắn trả lời (trên hàng đợi "trả lời"). Tất nhiên, tôi không muốn chờ đợi mãi mãi trong trường hợp ứng dụng xử lý các tin nhắn này là xuống - cần phải có một thời gian chờ. Nghe có vẻ như một nhiệm vụ rất cơ bản, nhưng tôi không thể tìm ra cách để làm điều này. Bây giờ tôi đã gặp phải vấn đề này với Java API.RabbitMQ Đợi tin nhắn hết thời gian
Trả lời
Có câu hỏi tương tự. Mặc dù câu trả lời không sử dụng java, có thể bạn có thể nhận được một số gợi ý.
com.rabbitmq.client.QueueingConsumer
có một phương pháp nextDelivery(long timeout)
, mà sẽ làm những gì bạn muốn. Tuy nhiên, điều này đã không được chấp nhận. Viết thời gian chờ của riêng bạn không quá khó, mặc dù có thể tốt hơn để có một chuỗi liên tục và danh sách các số nhận dạng trong thời gian, thay vì thêm và xóa người tiêu dùng và các chuỗi thời gian chờ liên quan.
Chỉnh sửa để thêm: Đã chú ý ngày này sau khi trả lời!
Tôi đã tiếp cận vấn đề này bằng cách sử dụng C# bằng cách tạo một đối tượng để theo dõi phản hồi cho một thư cụ thể. Nó thiết lập hàng đợi trả lời duy nhất cho một tin nhắn và đăng ký nó. Nếu không nhận được phản hồi trong khung thời gian đã chỉ định, bộ đếm thời gian đếm ngược sẽ hủy đăng ký, việc này sẽ xóa hàng đợi. Riêng biệt, tôi có các phương thức có thể đồng bộ từ chuỗi chính của tôi (sử dụng semaphore) hoặc không đồng bộ (sử dụng gọi lại) để sử dụng chức năng này.
Về cơ bản, việc thực hiện trông như thế này:
//Synchronous case:
//Throws TimeoutException if timeout happens
var msg = messageClient.SendAndWait(theMessage);
//Asynchronous case
//myCallback receives an exception message if there is a timeout
messageClient.SendAndCallback(theMessage, myCallback);
Thư viện client RabbitMQ Java tại supports a timeout argument to its QueueConsumer.nextDelivery()
method.
Ví dụ, hướng dẫn RPC sử dụng đoạn mã sau:
channel.basicPublish("", requestQueueName, props, message.getBytes());
while (true) {
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
if (delivery.getProperties().getCorrelationId().equals(corrId)) {
response = new String(delivery.getBody());
break;
}
}
Bây giờ, bạn có thể sử dụng consumer.nextDelivery(1000)
phải chờ tối đa một giây. Nếu hết thời gian chờ, phương thức trả về null
.
channel.basicPublish("", requestQueueName, props, message.getBytes());
while (true) {
// Use a timeout of 1000 milliseconds
QueueingConsumer.Delivery delivery = consumer.nextDelivery(1000);
// Test if delivery is null, meaning the timeout was reached.
if (delivery != null &&
delivery.getProperties().getCorrelationId().equals(corrId)) {
response = new String(delivery.getBody());
break;
}
}
- 1. Thông báo thời gian đến của tin nhắn Rabbitmq
- 2. Đợi một tin nhắn RabbitMQ duy nhất với thời gian chờ
- 3. Tin nhắn bị trễ trong RabbitMQ
- 4. Cách rút lại tin nhắn trong RabbitMQ?
- 5. Thứ tự thời gian của tin nhắn
- 6. xcode hết thời gian chờ đợi ứng dụng khởi chạy
- 7. Hết thời gian chờ đợi cho một MongoConnection
- 8. Yêu cầu hết thời gian - Yêu cầu hết thời gian
- 9. Tiêu thụ không xác nhận tin nhắn từ RabbitMq
- 10. thông điệp hàng đợi RabbitMQ
- 11. Tự động hết hạn tin nhắn trong Camel
- 12. Hàng đợi JMS nhận được tin nhắn?
- 13. Hàng đợi tin nhắn dựa trên Memcache?
- 14. java.net.SocketTimeoutException: Đọc hết thời gian
- 15. Hàng đợi tin nhắn trong Ruby on Rails
- 16. WGET có hết thời gian chờ không?
- 17. Người tiêu dùng tin nhắn RabbitMQ ngừng tiêu thụ thông báo
- 18. RabbitMQ tạm ngừng tiêu thụ hàng đợi
- 19. JQuery Cookie Set Hết Hạn Thời Gian
- 20. Tăng Hàng đợi Tin nhắn không dựa trên hàng đợi tin nhắn POSIX? Không thể chọn (2)?
- 21. 'giải cứu trong rbuf_fill': Hết thời gian :: Lỗi (Hết thời gian :: Lỗi)
- 22. Hàng đợi công việc/tin nhắn có thể mở rộng đơn giản với độ trễ
- 23. Thời gian chờ ReportViewer mặc dù cài đặt hết thời gian
- 24. Gửi tin nhắn đến khách hàng cụ thể với socket.io và hàng đợi tin nhắn rỗng
- 25. Tránh hết thời gian chờ trong SQLAlchemy
- 26. Rabbitmq truy xuất nhiều tin nhắn bằng cách sử dụng một cuộc gọi đồng bộ đơn
- 27. TIdHTTP - phiên đã hết hạn tin nhắn theo Delphi XE
- 28. Có thể xem nội dung tin nhắn RabbitMQ trực tiếp từ dòng lệnh không?
- 29. Sử dụng EasyNetQ với RabbitMQ để xuất bản và nhận tin nhắn
- 30. GetBufferLock hết thời gian cho chủ đề