有没有办法使用单个同步调用接收多条消息?
当我知道队列中有N条消息(N可能是小于10的小值)时,我应该可以执行类似channel.basic_get(String queue,boolean autoAck,int numberofMsg)的操作。我不想向服务器发出多个请求。
答案 0 :(得分:8)
RabbitMQ basic.get
不支持多条消息as seen in the docs。检索多条消息的首选方法是使用basic.consume,它会将消息推送到客户端,避免多次往返。 acks
是异步的,因此您的客户端不会等待服务器响应。 basic.consume
还有一个好处,即如果客户端断开连接,允许RabbitMQ重新传递消息,basic.get
无法做到。也可以关闭此功能,同时将no-ack
设置为true
。
设置basic.qos
prefetch-count
将设置随时推送到客户端的邮件数。如果客户端没有等待消息(将立即返回),客户端库往往会阻塞可选的超时。
答案 1 :(得分:3)
您可以使用QueueingConsumer
Consumer
接口的实现,它允许您在单个请求中检索多条消息。
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;
}
}
答案 2 :(得分:1)
首先声明QueueingBasicConsumer()的实例,它包装模型
从模型执行model.BasicConsume(QueueName,false,consumer)
然后实现一个循环,它将循环来自队列的消息,然后处理
下一行 - consumer.Queue.Dequeue()方法 - 等待从队列接收消息
然后将字节数组转换为字符串并显示它
Model.BasicAck() - 从队列中释放消息以接收下一条消息
然后在服务器端可以开始等待下一条消息通过:
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;
}
答案 3 :(得分:0)
这不是一个很好的解决方案,也不能解决多次调用的问题,但是您可以使用MessageCount方法。例如:
bool noAck = false;
var messageCount = channel.MessageCount("hello");
BasicGetResult result = null;
if (messageCount == 0)
{
// No messages available
}
else
{
while (messageCount > 0)
{
result = channel.BasicGet("hello", noAck);
var message = Encoding.UTF8.GetString(result.Body);
//process message .....
messageCount = channel.MessageCount("hello");
}