Как использовать перехватчик с Spring AMQP

#spring #spring-boot #rabbitmq #spring-amqp

#spring #весенняя загрузка #rabbitmq #spring-amqp

Вопрос:

Есть ли способ перехватывать сообщения после вызова template.convertAndSend, прежде чем сообщение будет доставлено в RabbitMQ.

Также есть какой-либо способ перехватить сообщение до того, как оно достигнет обработчика?

Я могу обработать сообщение с помощью PostProcessor для publisher, но предпочитаю использовать interceptor.

 public class TestPostProcessor implements MessagePostProcessor {

    @Autowired
    Tracer defaultTracer;

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

Есть предложения?

Комментарии:

1. >I can handle the message using PostProcessor for publisher, but prefer to use interceptor. Можете ли вы объяснить, что вы имеете в виду под этим? MPP является разновидностью перехватчика. Контейнер-прослушиватель также поддерживает MPPS после получения и перед доставкой слушателю: setAfterReceivePostProcessors() .

2. Чтобы использовать его, мне пришлось выполнить RabbitTemplate.convertAndSend(routingKey, «Message», PostProcessor); — было интересно, есть ли способ внедрить это, без того, чтобы нам приходилось предоставлять это здесь. Также, как бы мы это сделали на SimpleMessageListenerContainer?

3. Да; смотрите мой ответ.

Ответ №1:

MessagePostProcessor это форма interceptor.

Есть два способа вызвать один из них — использовать один из перегруженных convertAndSend() методов, которые принимают MPP в качестве аргумента, или добавить один или несколько к RabbitTemplate using setBeforePublishPostProcessors() .

Вы также можете перехватывать полученные сообщения, используя setAfterReceivePostProcessors() который вызывается перед возвратом полученного сообщения из receive() метода.

Контейнер-прослушиватель также поддерживает MPPS после получения и перед доставкой слушателю с помощью своего setAfterReceivePostProcessors() метода.

Комментарии:

1. Спасибо, обязательно попробую.

Ответ №2:

Если вы хотите продолжать использовать свойства загрузки spring (из org.springframework.boot.autoconfigure.amqp.RabbitProperties) в вашем файле application.properties, вы можете предоставить свой собственный 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);
  }
}
  

Комментарии:

1. Еще более простое решение: просто автоматически подключите фреймворк, созданный SimpleRabbitListenerContainerFactory (обратите внимание на прямую часть истории) и вызовите метод: setAfterReceivePostProcessors