【发布时间】:2019-05-15 17:49:07
【问题描述】:
我正在尝试调用 RabbitTemplate#addBeforePublishPostProcessors 和 RabbitTemplate#addAfterReceivePostProcessors 而不会过多地干扰 Spring 的自动配置。
我正在尝试执行此操作,但我的 MessagePostProcessor 没有触发(我在发布的消息中没有看到“test_header”)。
@EventListener
void test(ApplicationPreparedEvent event) {
ConfigurableApplicationContext applicationContext = event.getApplicationContext();
RabbitTemplate rabbitTemplate = applicationContext.getBean(RabbitTemplate.class);
rabbitTemplate.addBeforePublishPostProcessors(new MessagePostProcessor() {
@Override
public Message postProcessMessage(Message message) throws AmqpException {
message.getMessageProperties().setHeader("test_header", "test_header_value");
return message;
}
});
}
什么地方适合做这个?
我也试过收听ApplicationStartedEvent。
更新:
根据 Gary 的建议,在我的 @Configuration 课程中添加了这个 bean:
@Bean
public static BeanPostProcessor rabbitTemplatePostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if(bean instanceof RabbitTemplate) {
RabbitTemplate rabbitTemplate = (RabbitTemplate) bean;
rabbitTemplate.addBeforePublishPostProcessors(m -> {
m.getMessageProperties()
.setHeader(MESSAGE_PUBLISHED_TIME, currentTimeMillis());
return m;
});
rabbitTemplate.addAfterReceivePostProcessors(m -> {
m.getMessageProperties().setHeader(MESSAGE_RECEIVED_TIME, currentTimeMillis());
return m;
});
}
return bean;
}
};
}
如果您正在使用@RabbitListener 和@SendTo,如果您正在寻找有关如何执行此操作的答案的任何人,请参阅 Gary 对其答案的编辑。
【问题讨论】:
标签: java spring-boot spring-amqp