在将消息传递给RabbitMQ之前,有没有办法在调用template.convertAndSend时拦截消息。
还有任何方法可以在到达处理程序之前拦截消息吗?
我可以使用PostProcessor为发布者处理消息,但更喜欢使用拦截器。
public class TestPostProcessor implements MessagePostProcessor {
@Autowired
Tracer defaultTracer;
@Override
public Message postProcessMessage(Message message) throws AmqpException {
//.....
//....
return message;
}
}
有什么建议吗?
答案 0 :(得分:4)
MessagePostProcessor
是一种拦截器。
有两种方法可以调用一种方法 - 使用一个以MPP作为参数的重载convertAndSend()
方法,或使用RabbitTemplate
向setBeforePublishPostProcessors()
添加一个或多个方法。 / p>
您还可以使用在setAfterReceivePostProcessors()
方法返回收到的消息之前调用的receive()
拦截收到的消息。
侦听器容器在接收之后以及通过其setAfterReceivePostProcessors()
方法传递给侦听器之前也支持MPP。
答案 1 :(得分:0)
如果要继续在application.properties文件中使用spring引导属性(来自org.springframework.boot.autoconfigure.amqp.RabbitProperties),则可以提供自己的RabbitListenerContainerFactory:
@Bean
public CustomRabbitListenerContainerFactory rabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory, MyContextMessageProcessor messageProcessor) {
CustomRabbitListenerContainerFactory factory = new CustomRabbitListenerContainerFactory(messageProcessor);
configurer.configure(factory, connectionFactory);
return factory;
}
CustomRabbitListenerContainerFactory.java:
public class CustomRabbitListenerContainerFactory
extends org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory {
private MessagePostProcessor[] messagePostProcessor;
public CustomRabbitListenerContainerFactory(MessagePostProcessor... messagePostProcessor) {
super();
this.messagePostProcessor = messagePostProcessor;
}
@Override
protected void initializeContainer(SimpleMessageListenerContainer instance, RabbitListenerEndpoint endpoint) {
super.initializeContainer(instance, endpoint);
instance.addAfterReceivePostProcessors(messagePostProcessor);
}
}