我想从队列中获取所有正在等待的消息,然后停止消费者。但它仍在等待新消息。我删除了所有不必要的代码:
public class Listener {
private Channel channel;
public Listener(boolean futureActionsAllowed) {
this.futureActionsAllowed = futureActionsAllowed;
channel = RabbitMQ.getChannel(TasksStatusOpts.QUEUE_NAME, TasksStatusOpts.DURABLE, TasksStatusOpts.EXCLUSIVE,
TasksStatusOpts.AUTO_DELETE);
}
public void getAndExit() throws IOException, InterruptedException {
QueueingConsumer queueingConsumer = new QueueingConsumer(channel);
String consumerTag = channel.basicConsume(TasksStatusOpts.QUEUE_NAME, TasksStatusOpts.AUTO_ACK,
queueingConsumer);
while (true) {
QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
if (delivery == null) {
channel.basicCancel(consumerTag);
Connection conn = channel.getConnection();
channel.close();
conn.close();
break;
} else {
String message = new String(delivery.getBody(), Charsets.UTF_8);
handle(message, delivery.getEnvelope());
}
}
}
public static void main(String[] args) throws IOException {
new Listener(false).getAndExit();
}
}
最佳答案
不带参数的
nextDelivery()
仅在队列为空时等待消息。它永远不会返回null
。相反,您可能正在寻找 nextDelivery(timeout)有超时。当超时时,该方法将返回null
。
您可能还注意到此方法已被弃用,请参阅 RabbitMQ Java API Guide举一个现代的例子。
关于java - 如何从队列中获取所有现有消息并停止消费者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42011198/