【发布时间】:2021-03-03 08:18:13
【问题描述】:
我正在编写一个 SpringBoot RabbitMQ 消费者,我需要偶尔将一条消息重新排队到队列的 BACK
我认为这就是否定确认的工作原理,但是
basicReject(deliveryTag, true) 只是将消息放回队列中尽可能接近其原始位置的位置,在我的一次一个的情况下,它正好回到队列的前面。
我的第一个想法是在某个时间间隔 (similar to the approach mentioned in this answer) 使用死信队列反馈到消息队列,但如果有某种方法可以简单地重新排队到初始队列
我的下面的结构只是简单地消耗了消息并且无法将它重新添加到队列中。
如果没有 DLQ,如何做到这一点?
@ServiceActivator(inputChannel = "amqpInputChannel")
public void handle(@Payload String message,
@Header(AmqpHeaders.CHANNEL) Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) Long deliveryTag){
try{
methodThatThrowsRequeueError();
methodThatThrowsMoveToErrorQueueError();
} catch (RequeueError re) {
channel.basicAck(deliveryTag, false);
sendMessageToBackOfQueue(message);
return;
} catch (MoveToErrorQueueError me) {
//Structured the same as sendMessageToBackOfQueue, works fine
moveMessageToErrorQueue(message);
}
channel.basicAck(deliveryTag, false);
}
private void sendMessageToBackOfQueue(String message) {
try {
rabbitTemplate.convertAndSend(
exchangeName,
routingKeyRequeueMessage,
message,
message -> {
message.getMessageProperties().setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN);
return message;
}
);
} catch (AmqpException amqpEx) {
//error handling which is not triggered...
}
}
【问题讨论】:
标签: java spring-boot rabbitmq