Spring을 통해 Rabbit MQ 큐의 뒷면에 메시지를 다시 큐에 넣는 방법

Nov 20 2020

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...
        }
    }

답변

DapperDan Nov 25 2020 at 01:48

요점 : 수신 대기 서비스에서 중개자없이 원래 큐로 메시지를 다시 전달할 수있는 방법이 없습니다.

배달 못한 편지 대기열 / 배달 편지 교환을 중심으로하는 몇 가지 옵션이 있지만, 우리가 찾은 비 DLQ / DLX 솔루션은 시간 제한 교환이었습니다. 본질적으로 :

메시지는 MessageExchange (MsgX)로 들어가 서비스 큐 (SvcQ)로 전파됩니다. 서비스 (Svc)는 SvcQ에서 메시지를 가져옵니다.

메시지가 SvcQ의 뒷면으로 전송되어야한다고 결정하면 Svc는 다음을 수행해야합니다.

  1. SvcQ에 승인을 보냅니다.
  2. 다른 거래소, 우리의 시간 제한 psuedo-DLX로 메시지 보내기
  3. psuedo-DLX는 일정 시간 간격으로 (BACK OF !!) SvcQ에 메시지를 릴리스하도록 구성 할 수 있습니다.