[英]How to requeue a message to the Back of a Rabbit MQ Queue via Spring
我正在编写一个 SpringBoot RabbitMQ Consumer,我需要偶尔将消息重新排队到队列的 BACK
我认为这就是否定确认的工作方式,但是basicReject(deliveryTag, true)
只是将消息尽可能地放回队列中的原始位置,在我一次一个的情况下,它正好回到队列的前面。
我的第一个想法是在某个时间间隔内使用死信队列反馈到消息队列(类似于本答案中提到的方法),但如果有某种方法可以简单地重新排队到消息队列,我宁愿不创建额外的队列返回初始队列
我下面的结构只是消耗消息,无法将其重新添加到队列中。
如果没有 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...
}
}
TL;DR :我发现没有办法在没有中介的情况下将消息从侦听服务转发回原始队列。
有几个选项围绕死信队列/死信交换,但我们发现的非 DLQ/DLX 解决方案是定时交换,如果您愿意,可以使用伪 DLX。 本质上:
消息进入 MessageExchange (MsgX),然后传播到服务队列 (SvcQ)。 服务 (Svc) 从 SvcQ 获取消息。
一旦您确定应该将消息发送到 SvcQ 的后面,Svc 应该:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.