如何从队列中删除消息

时间:2020-07-15 17:39:23

标签: java spring rabbitmq spring-amqp

我有一个收到消息的代码:

    @Override
    public Message doInRabbit(Channel channel) throws Exception {
        GetResponse result = channel.basicGet("club-pro-not-available", false);
        if (result == null) {
            return null;
        }
        channel.basicReject(result.getEnvelope().getDeliveryTag(), true);
        return new Message(result.getBody(), propertiesConverter.toMessageProperties(
                result.getProps(), result.getEnvelope(), "UTF-8"));
    }

我在带有预定标志的方法中调用此方法:

  @Scheduled(fixedDelay = 10000)
    public void sendMessageClubPro() throws IOException {
        while (true) {
            try {
                 Message message = getMessagesOfRabbit();
              Logic
            } catch (Exception e) {
                Error logic
            }
        }
    }

如果一切都成功,我想尝试从队列中删除消息,但是我不知道该怎么做,因为我只有一条消息,但是没有任何渠道。我该如何解决这个问题?

P.S。也许可以在RabbitTemplate的帮助下完成此操作,或者您可以通过某种方式获得频道?我找不到例子。

1 个答案:

答案 0 :(得分:2)

您需要使用doInRabbit()进行所有处理,然后根据处理的成功/失败来调用basicAck()basicReject()

像这样无条件调用basicReject(),将始终重新排队该消息。

您还可以在事务中运行RabbitTemplate.receive(),事务管理器将根据事务是提交还是回滚来确认或否决消息。