【问题标题】:How to use interceptor with Spring AMQP如何在 Spring AMQP 中使用拦截器
【发布时间】:2016-10-21 19:17:01
【问题描述】:

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

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

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

public class TestPostProcessor implements MessagePostProcessor {

    @Autowired
    Tracer defaultTracer;

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

有什么建议吗?

【问题讨论】:

  • >I can handle the message using PostProcessor for publisher, but prefer to use interceptor. 你能解释一下你的意思吗? MPP 一种拦截器。侦听器容器还支持在接收之后和交付给侦听器之前的 MPP:setAfterReceivePostProcessors()
  • 要使用它,我必须做 rabbitTemplate.convertAndSend(routingKey,"Message",postProcessor); - 想知道是否有办法注入它,而我们不必在这里提供它。另外我们将如何在 SimpleMessageListenerContainer 上做到这一点?
  • 是的;看我的回答。

标签: spring spring-boot rabbitmq spring-amqp


【解决方案1】:

MessagePostProcessor 是一种拦截器。

有两种方法可以调用其中一种 - 使用将 MPP 作为参数的重载 convertAndSend() 方法之一,或者使用 setBeforePublishPostProcessors() 将一个或多个添加到 RabbitTemplate

您还可以使用setAfterReceivePostProcessors() 拦截收到的消息,在收到的消息从receive() 方法返回之前调用它。

侦听器容器还支持通过其setAfterReceivePostProcessors() 方法在接收之后和交付给侦听器之前的 MPP。

【讨论】:

  • 谢谢,试试看。
【解决方案2】:

如果您想在 application.properties 文件中继续使用 spring boot 属性(来自 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);
  }
}

【讨论】:

  • 更简单的解决方案:只需自动装配创建 SimpleRabbitListenerContainerFactory 的框架(注意故事的 Direct 部分)并调用方法:setAfterReceivePostProcessors
猜你喜欢
  • 2014-03-30
  • 2018-08-09
  • 1970-01-01
  • 2014-10-06
  • 1970-01-01
  • 2014-12-31
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多