【发布时间】:2019-05-19 15:42:33
【问题描述】:
我不确定我对errorHandler和returnExceptions的理解是否正确。
但这是我的目标:我从 App_A 发送了一条消息,使用 @RabbitListener 在 App_B 中接收消息。
假设APP_B在消息处理过程中出现业务异常,通过@RabbitListener正确设置errorHandler和returnExceptions可以让异常返回给App_A。
我理解正确吗?
如果我是正确的,如何以正确的方式使用它?
使用我的代码,我在 APP_A 中一无所获。
这是我在 APP_B 中的代码
错误处理程序:
@Component(value = "errorHandler")
public class ErrorHandler implements RabbitListenerErrorHandler {
@Override
public Object handleError(Message arg0, org.springframework.messaging.Message<?> arg1,
ListenerExecutionFailedException arg2) throws ListenerExecutionFailedException {
throw new ListenerExecutionFailedException("msg", arg2, null);
}
}
兔子监听器:
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "MRO.updateBaseInfo.queue", durable = "true"),
exchange = @Exchange(name = "MRO_Exchange", type = ExchangeTypes.DIRECT, durable = "true"),
key = "baseInfoUpdate"
),
// errorHandler = "errorHandler",
returnExceptions = "true"
)
public void receiveLocationChangeMessage(String message){
BaseUpdateMessage newBaseInfo = JSON.parseObject(message, BaseUpdateMessage.class);
dao.upDateBaseInfo(newBaseInfo);
}
和APP_A中的代码
@Component
public class MessageSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public void editBaseInfo(BaseUpdateMessage message)throws Exception {
//and i am not sure set RemoteInvocationAwareMessageConverterAdapter in this way is right
rabbitTemplate.setMessageConverter(new RemoteInvocationAwareMessageConverterAdapter());
rabbitTemplate.convertAndSend("MRO_Exchange", "baseInfoUpdate", JSON.toJSONString(message));
}
}
我对三点很困惑:
1) 我必须同时使用errorHandler 和returnExceptions 吗?我认为errorHandler就像一个后处理器,可以让我自定义异常。如果我不需要自定义异常,我可以设置returnExceptions而不使用errorHandler吗?
2)@RabbitListener 注解的方法应该返回一些东西还是 void 就好了?
3)在发送方(我的情况是APP_A),是否有任何特定的配置来捕获异常?
我的工作环境:
春季启动 2.1.0
docker上的rabbitMQ服务器3.7.8
【问题讨论】:
标签: spring-amqp