【发布时间】:2019-04-16 03:52:47
【问题描述】:
我有一个 RPC 模式的消费者(RabbitListner),我想知道是否可以抛出可以被发布者处理的异常。
为了更清楚我的解释,案例如下:
- 发布者以 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; }}
-
将 bean 定义到配置文件中:
@配置 公共类 RabbitConfig 扩展 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 是我之前定义的 bean:
@Override @RabbitListener(queues = "${rabbit.queue}" , errorHandler = "rabbitErrorHandler" , returnExceptions = "true") public ReturnObject receiveMessage(Message message) { -
对于 RabbitTemplate 我设置了这个属性:
rabbitTemplate.setMessageConverter(new RemoteInvocationAwareMessageConverterAdapter());
当消息受到消费者威胁,但它发送了错误时,我获得了一个 RemoteInvocationResult,其中包含 e.getCause().getCause() 中的原始异常。
【问题讨论】:
标签: exception rabbitmq spring-amqp