java - 如何从队列中获取所有现有消息并停止消费者

标签 java rabbitmq

我想从队列中获取所有正在等待的消息,然后停止消费者。但它仍在等待新消息。我删除了所有不必要的代码:

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/

相关文章:

java - 程序没有输出(预计 408 行),没有编译或运行时错误

C#/Java 异常与条件语句

c# - Rabbitmq - 连接/ channel /消费者的恢复

python - 使用主题交换运行多个 Celery 任务

java - 如何计算内部类创建的对象数

java - 如何优化 Oracle 11g 和 Hibernate 的批量 INSERT?

java - Scala:如何进行字符串连接以避免 GC 开销问题

rabbitmq - 运行客户端 channel 备份轮询器 Celery Beat

queue - 队列发送者如何知道消费者崩溃了?

c# - 如何覆盖 MassTransit 默认交换和队列拓扑约定?