我正在编写一个springboot rabbitmq使用者,需要偶尔将消息重新排队到队列的后面
我以为这就是否定性承认的作用,但是 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...
}
}
1条答案
按热度按时间eh57zj3b1#
热释光;dr:在没有中间层的情况下,我无法将消息从侦听服务转发回原始队列。
有几个选项围绕死信队列/死信交换,但我们发现的一个非dlq/dlx解决方案是定时交换,如果您愿意的话,是psuedo-dlx。基本上:
消息进入messageexchange(msgx),它传播到服务队列(svcq)。服务(svc)从svcq获取消息。
一旦您确定消息应该发送到svcq的后面,svc应该:
向svcq发送确认。
将消息发送到另一个exchange,我们的定时psuedo dlx
psuedo dlx可以配置为将消息发布到(的背面!!)某时间间隔上的svcq