2013-06-09 86 views
6

Có cách nào để nhận nhiều tin nhắn bằng một cuộc gọi đồng bộ duy nhất không?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

Khi tôi biết rằng có N tin nhắn (N có thể là một giá trị nhỏ hơn 10) trong hàng đợi, sau đó tôi sẽ có thể làm một cái gì đó như channel.basic_get (Chuỗi hàng đợi, boolean autoAck, int numberofMsg). Tôi không muốn thực hiện nhiều yêu cầu đến máy chủ.

Trả lời

6

RabbitMQ's basic.get không hỗ trợ nhiều thư tiếc là as seen in the docs. Phương pháp ưa thích để truy xuất nhiều thư là sử dụng basic.consume để đẩy thư đến khách hàng tránh nhiều chuyến đi khứ hồi. acks không đồng bộ nên khách hàng của bạn sẽ không đợi máy chủ trả lời. basic.consume cũng có lợi ích cho phép RabbitMQ gửi lại tin nhắn nếu khách hàng ngắt kết nối, điều mà basic.get không thể thực hiện được. Bạn cũng có thể tắt cài đặt này no-ack thành true.

Đặt basic.qosprefetch-count sẽ đặt số lượng thư để đẩy cho khách hàng bất kỳ lúc nào. Nếu không có một tin nhắn chờ đợi ở phía khách hàng (mà sẽ trở lại ngay lập tức) thư viện khách hàng có xu hướng chặn với một thời gian chờ tùy chọn.

1

Bạn có thể sử dụng thực thi QueueingConsumer Giao diện người dùng cho phép bạn truy xuất một số thư trong một yêu cầu.

QueueingConsumer queueingConsumer = new QueueingConsumer(channel); 
channel.basicConsume(plugin.getQueueName(), false, queueingConsumer); 

for(int i = 0; i < 10; i++){ 
    QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery(100);//read timeout in ms 
    if(delivery == null){ 
     break; 
    } 
} 
+0

Ngày nay nó là một giải pháp không dùng nữa. https://www.rabbitmq.com/releases/rabbitmq-java-client/v3.4.1/rabbitmq-java-client-javadoc-3.4.1/com/rabbitmq/client/QueueingConsumer.html – pisaruk

+0

Có cách nào tốt hơn để giải quyết vấn đề? – Robinho

1

Ví dụ khai báo đầu tiên của QueueingBasicConsumer() bao gồm mô hình.
Từ mô hình thực hiện mô hình.BasicConsume (QueueName, false, consumer)
Sau đó, thực hiện một vòng lặp sẽ lặp lại các tin nhắn từ hàng đợi, sau đó sẽ xử lý
Phương thức tiếp theo - consumer.Queue.Dequeue() tin nhắn được nhận từ hàng đợi.
Sau đó chuyển đổi mảng byte thành chuỗi và hiển thị nó.
Model.BasicAck() - thông điệp giải thoát ra khỏi hàng đợi để nhận được thông báo tiếp theo
Và sau đó ở phía máy chủ có thể bắt đầu chờ đợi thông điệp bên cạnh đi qua:

public string GetMessagesByQueue(string QueueName) 
    { 
     var consumer = new QueueingBasicConsumer(_model); 
     _model.BasicConsume(QueueName, false, consumer); 

     string message = string.Empty; 

     while (Enabled) 
     { 
      //Get next message 
      var deliveryArgs = (BasicDeliverEventArgs)consumer.Queue.Dequeue(); 

      //Serialize message 
      message = Encoding.Default.GetString(deliveryArgs.Body); 
       _model.BasicAck(deliveryArgs.DeliveryTag, false); 
     } 
     return message; 
    } 
Các vấn đề liên quan