Я пытаюсь дозвониться до 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
.
Обновление:
Добавил этот боб в мой @Configuration
класс согласно рекомендации Гэри:
@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
, пожалуйста, см. Редактирование Гэри его ответа.