簡體   English   中英

如何通過 Spring 將消息重新排隊到 Rabbit MQ 隊列的后面

[英]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 應該:

  1. 向 SvcQ 發送確認。
  2. 將消息發送到另一個交易所,我們的定時偽 DLX
  3. psuedo-DLX 可以配置為在某個時間間隔內向(BACK OF !!)SvcQ 釋放消息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM