【问题标题】:How to delete a message from Queue in RabbitMQ如何从 RabbitMQ 的队列中删除消息
【发布时间】:2020-03-15 06:34:20
【问题描述】:

我正在使用 Rabbit MQ 来复制 Jenkins 所做的事情。 我面临的唯一问题是,可以说,当 10 条消息在队列中时。并且有一些重复的消息处于unacknowledged 状态。 我需要从队列中删除这些消息,我该如何实现?

我的rabbitmq配置如下,每个队列只有一个消费者。因此,如果我有 10 条消息,所有消息都将通过同一个消费者的线程进行处理。

Queue queue = new Queue(sfdcConnectionDetails.getGitRepoId() + "_" + sfdcConnectionDetails.getBranchConnectedTo(), true);
rabbitMqSenderConfig.amqpAdmin().declareQueue(queue);
rabbitMqSenderConfig.amqpAdmin().declareBinding(BindingBuilder.bind(queue).to(new DirectExchange(byRepositoryRepositoryId.getRepository().getRepositoryId())).withQueueName());
RabbitMqConsumer container = new RabbitMqConsumer();
container.setConnectionFactory(rabbitMqSenderConfig.connectionFactory());
container.setQueueNames(queue.getName());
container.setConcurrentConsumers(1);
container.setMessageListener(new MessageListenerAdapter(new ConsumerHandler(****, ***), new Jackson2JsonMessageConverter()));
container.startConsumers();

【问题讨论】:

    标签: java spring-boot rabbitmq


    【解决方案1】:
    1. 您可以使用任何插件(例如 this)在 rabbit 端对消息进行重复数据删除。
    2. 在您的消费者上使用缓存来检测最近是否正在处理相同的消息。

    【讨论】:

      【解决方案2】:

      正如@ekiryuhin 已经建议的那样,您可以采取的一种方法是在向RabbitMQ 生成消息之前将request_id 标记分配给有效负载,并在您的消费者端缓存request_id。如果已经存在忽略有效负载,请注意 request_id 并将其删除。 此 request_id 可能用作您的有效负载的重复数据删除 ID。

      【讨论】:

        最近更新 更多