#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