在Spring RabbitTemplate中全局配置MessagePostProcessor

时间:2018-11-29 09:25:09

标签: spring-amqp

  

有关   How do we hook into before/After message processing using @RabbitListener

如果我想全局配置RabbitTemplate并设置MessagePostProcessor,最好的方法是什么?

  1. 我应该从RabbitAutoConfiguration复制bean定义吗?
  2. 还是应该使用BeanPostProcessor截取bean定义?

第一个解决方案的问题是 RabbitAutoConfiguration中的RabbitTemplate不仅是bean实例的bounding属性,而且还设置了消息转换:

MessageConverter messageConverter = this.messageConverter.getIfUnique();
if (messageConverter != null) {
    template.setMessageConverter(messageConverter);
}

因此,我应该重复以下逻辑,还是像Sleuth那样遵循BeanPostProcessor的第二个选项?

@ConfigurationProperties(prefix = "spring.rabbitmq.template")
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,
                                     ObjectProvider<MessageConverter> messageConverterObjectProvider) {

    RabbitTemplate template = new RabbitTemplate(connectionFactory);
    MessageConverter messageConverter = messageConverterObjectProvider.getIfUnique();
    if (messageConverter != null) {
        template.setMessageConverter(messageConverter);
    }
    template.setBeforePublishPostProcessors(myBeforePublishMPP());
    return template;
}

2 个答案:

答案 0 :(得分:1)

我想说的是,@Autowired足以RabbitTemplate并将MessagePostProcessor注入到RabbitTemplate中:

@Autowired
private RabbitTemplate rabbitTemplate;

@PostConstruct
public void init() {
    this.rabbitTemplate.setBeforePublishPostProcessors(myMessagePostProcessor());
}

@Bean
public MessagePostProcessor myMessagePostProcessor() {
    return message -> null;
}

答案 1 :(得分:1)

我会首先采用这种方式来应用application.properties,但是要像在Sleuth中一样更改方法签名以接收ObjectProvider< MessageConverter>