RabbitMQ 학습노트: mandatory,publisher-confirms,publisher-return 속성 차이
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();
}
위의 원본 코드를 읽으면 다음과 같은 정보를 얻을 수 있습니다.
GitHub 주소:https://github.com/mingyang66/spring-parent/tree/master/doc/rabbitmq