如何使用Spring AMQP拦截器

时间:2016-10-21 19:17:02

标签: spring spring-boot rabbitmq spring-amqp

在将消息传递给RabbitMQ之前,有没有办法在调用template.convertAndSend时拦截消息。

还有任何方法可以在到达处理程序之前拦截消息吗?

我可以使用PostProcessor为发布者处理消息,但更喜欢使用拦截器。

public class TestPostProcessor implements MessagePostProcessor {

    @Autowired
    Tracer defaultTracer;

    @Override
    public Message postProcessMessage(Message message) throws AmqpException {
        //.....
        //.... 
        return message;
    }
}

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

MessagePostProcessor是一种拦截器。

有两种方法可以调用一种方法 - 使用一个以MPP作为参数的重载convertAndSend()方法,或使用RabbitTemplatesetBeforePublishPostProcessors()添加一个或多个方法。 / 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);
  }
}