[英]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.