gpt4 book ai didi

java - 如何通过 Spring 将消息重新排队到 Rabbit MQ 队列的后端

转载 作者:行者123 更新时间:2023-12-05 06:57:17 27 4
gpt4 key购买 nike

我正在编写一个 SpringBoot RabbitMQ Consumer,我偶尔需要将消息重新排队到队列的 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...
}
}

最佳答案

TL;DR:我没有找到在没有中介的情况下将消息从监听服务转发回原始队列的方法。

围绕死信队列/死信交换有多种选择,但我们发现的非 DLQ/DLX 解决方案是定时交换,如果您愿意,可以使用伪 DLX。本质上:

消息进入 MessageExchange (MsgX),传播到服务队列 (SvcQ)。服务 (Svc) 从 SvcQ 获取消息。

一旦确定消息应该发送到 SvcQ 的后端,Svc 应该:

  1. 向 SvcQ 发送确认。
  2. 将消息发送到另一个交易所,我们的定时伪 DLX
  3. 伪 DLX 可以配置为在某个时间间隔向(BACK OF!!)SvcQ 发布消息

关于java - 如何通过 Spring 将消息重新排队到 Rabbit MQ 队列的后端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64920605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com