我有一个收到消息的代码:
@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的帮助下完成此操作,或者您可以通过某种方式获得频道?我找不到例子。
答案 0 :(得分:2)
您需要使用doInRabbit()
进行所有处理,然后根据处理的成功/失败来调用basicAck()
或basicReject()
。
像这样无条件调用basicReject()
,将始终重新排队该消息。
您还可以在事务中运行RabbitTemplate.receive()
,事务管理器将根据事务是提交还是回滚来确认或否决消息。