RabbitMQ 학습노트: mandatory,publisher-confirms,publisher-return 속성 차이

rabbitmq 클라이언트가 메시지를 먼저 보내는 교환기 exchange를 보내고 루트 키routingKey와bindingKey를 통해 메시지를 그 대기열queue에 보내야 한다고 비교 판정합니다.이 과정에서 두 곳의 메시지가 분실될 수 있습니다. 첫 번째 메시지가 교환기 exchange에 전송되는 과정, 두 번째 메시지가 교환기 exchange에서 대기열queue로 전송되는 과정입니다.
1.publiser-confirm 모드는 생산자가 교환기exchange 메시지를 성공적으로 보냈는지 확인할 수 있습니다
# 
spring.rabbitmq.publisher-confirms=true

2.publisher-return 모드는 메시지가 지정한queue로 연결되지 않았을 때 메시지를 되돌려주지 않고 버릴 수 있습니다
# 
spring.rabbitmq.publisher-returns=true

위의 속성 설정을 사용할 때 보통 mandatory 속성과 함께 사용됩니다.
# 
spring.rabbitmq.template.mandatory=true

이 두 설정 모두 적당한 대기열을 찾지 못했을 때 메시지를 되돌려주는 것이 도대체 어떻게 각각 작용하는지 의문이 생길 수 있습니다.다음은 RabbitAutoConfiguration 자동화 구성 클래스를 살펴보겠습니다.
        @Bean
        @ConditionalOnSingleCandidate(ConnectionFactory.class)
        @ConditionalOnMissingBean
        public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory) {
            PropertyMapper map = PropertyMapper.get();
            RabbitTemplate template = new RabbitTemplate(connectionFactory);
            MessageConverter messageConverter = (MessageConverter)this.messageConverter.getIfUnique();
            if (messageConverter != null) {
                template.setMessageConverter(messageConverter);
            }
						// rabbitmq queue 
            template.setMandatory(this.determineMandatoryFlag());
            Template properties = this.properties.getTemplate();
            if (properties.getRetry().isEnabled()) {
                template.setRetryTemplate((new RetryTemplateFactory((List)this.retryTemplateCustomizers.orderedStream().collect(Collectors.toList()))).createRetryTemplate(properties.getRetry(), Target.SENDER));
            }

            properties.getClass();
            map.from(properties::getReceiveTimeout).whenNonNull().as(Duration::toMillis).to(template::setReceiveTimeout);
            properties.getClass();
            map.from(properties::getReplyTimeout).whenNonNull().as(Duration::toMillis).to(template::setReplyTimeout);
            properties.getClass();
            map.from(properties::getExchange).to(template::setExchange);
            properties.getClass();
            map.from(properties::getRoutingKey).to(template::setRoutingKey);
            properties.getClass();
            map.from(properties::getDefaultReceiveQueue).whenNonNull().to(template::setDefaultReceiveQueue);
            return template;
        }
				// queue 
        private boolean determineMandatoryFlag() {
          	/**
              *  spring.rabbitmq.template.mandatory ;
              *  , null、false、true
              *  mandatory null publisher-return 
              **/
            Boolean mandatory = this.properties.getTemplate().getMandatory();
            return mandatory != null ? mandatory : this.properties.isPublisherReturns();
        }

위의 원본 코드를 읽으면 다음과 같은 정보를 얻을 수 있습니다.
  • spring.rabbitmq.template.mandatory 속성의 우선순위가spring보다 높습니다.rabbitmq.publisher-returns의 우선 순위입니다
  • spring.rabbitmq.template.mandatory 속성은 세 가지 값null,false,true를 되돌릴 수 있습니다
  • spring.rabbitmq.template.mandatory 결과가true,false일 때spring을 무시합니다.rabbitmq.publisher-returns 속성의 값입니다
  • spring.rabbitmq.template.mandatory 결과가null (즉 설정하지 않음) 일 때 결과는spring입니다.rabbitmq.publisher-returns 확정

  • GitHub 주소:https://github.com/mingyang66/spring-parent/tree/master/doc/rabbitmq

    좋은 웹페이지 즐겨찾기