У меня есть потребитель (RabbitListner) в режиме RPC, и я хотел бы знать, возможно ли выдать исключение, которое может быть обработано издателем.
Чтобы прояснить мое объяснение, случай таков:следуйте:
- Издатель отправляет сообщение в режиме RPC
- Потребитель получает сообщение, проверяет действительность сообщения иесли сообщение не может быть учтено из-за отсутствующих параметров, то я бы хотел сгенерировать исключение .Исключением может быть конкретное бизнес-исключение или конкретное AmqpException, но я хочу, чтобы издатель мог обработать это исключение, если оно не прошло по тайм-ауту.
Я пытаюсь использовать AmqpRejectAndDontRequeueException , но мой издатель не получает исключение, а только пустой ответ.
Возможно ли это сделать, или, может быть, это плохая практика для реализации такого рода?
РЕДАКТИРОВАТЬ 1:
После ответа @GaryRussel вот решение моего вопроса:
Для RabbitListner я создаю обработчик ошибок:
@Configuration
public class RabbitErrorHandler implements RabbitListenerErrorHandler {
@Override public Object handleError(Message message, org.springframework.messaging.Message<?> message1, ListenerExecutionFailedException e) {
throw e;
}
}
Определить компонент в файл конфигурации:
@ Открытый класс конфигурации RabbitConfig extends RabbitConfiguration {
@Bean
public RabbitTemplate getRabbitTemplate() {
Message.addWhiteListPatterns(RabbitConstants.CLASSES_TO_SEND_OVER_RABBITMQ);
return new RabbitTemplate(this.connectionFactory());
}
/**
* Define the RabbitErrorHandle
* @return Initialize RabbitErrorHandle bean
*/
@Bean
public RabbitErrorHandler rabbitErrorHandler() {
return new RabbitErrorHandler();
}
}
Создайте @RabbitListner с параметрами, где rabbitErrorHandler - это компонент, который я определил ранее:
@Override
@RabbitListener(queues = "${rabbit.queue}"
, errorHandler = "rabbitErrorHandler"
, returnExceptions = "true")
public ReturnObject receiveMessage(Message message) {
ДляRabbitTemplaт. е. я устанавливаю этот атрибут:
rabbitTemplate.setMessageConverter(new RemoteInvocationAwareMessageConverterAdapter());
Когда сообщение рассылается потребителем, но отправляет ошибку, я получаю RemoteInvocationResult, который содержит исходное исключение в e.getCause ().getCause ().