我正在编写一个SpringBoot RabbitMQ使用者,我需要偶尔将消息重新排队到队列的后面
我认为这是负面确认的工作方式,但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...
}
}发布于 2020-11-24 18:48:05
TL;DR:我无法在没有中介的情况下将来自侦听服务的消息转发回起始队列。
有几个选项围绕死信队列/死信交换,但我们发现的非DLQ/ DLX解决方案是一个时间Exchange,如果您愿意的话,是一个psuedo DLX。实质上:
消息进入MessageExchange (MsgX),该消息传播到服务队列(SvcQ)。服务(Svc)从SvcQ获得一条消息。
一旦确定消息应该发送到SvcQ的后面,Svc应该:
上
https://stackoverflow.com/questions/64920605
复制相似问题