gpt4 book ai didi

spring-amqp - Spring AMQP 错误处理程序和返回异常问题

转载 作者:行者123 更新时间:2023-12-04 12:25:38 29 4
gpt4 key购买 nike

我不确定我对 errorHandler 和 returnExceptions 的理解是否正确。

但这是我的目标:我从 App_A 发送了一条消息,使用 @RabbitListener 在 App_B 中接收消息。

根据文档
https://docs.spring.io/spring-amqp/docs/2.1.3.BUILD-SNAPSHOT/reference/html/_reference.html#annotation-error-handling

我假设如果 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),是否有任何特定的配置来捕获异常?

我的工作区环境:

Spring Boot 2.1.0

docker 上的 rabbitMQ 服务器 3.7.8

最佳答案

1) 不,您不需要错误处理程序,除非您想增强异常。

2)如果方法返回void;发件人最终会等待一个永远不会到达的回复超时,以防可能抛出异常;这可能不是很好地利用资源。最好总是发送回复,以释放发布方。

3) 只是 RemoteInvocationAwareMessageConverterAdapter .

下面是一个例子:

@SpringBootApplication
public class So53846303Application {

public static void main(String[] args) {
SpringApplication.run(So53846303Application.class, args);
}

@RabbitListener(queues = "foo", returnExceptions = "true")
public String listen(String in) {
throw new RuntimeException("foo");
}

@Bean
public ApplicationRunner runner(RabbitTemplate template) {
template.setMessageConverter(new RemoteInvocationAwareMessageConverterAdapter());
return args -> {
try {
template.convertSendAndReceive("foo", "bar");
}
catch (Exception e) {
e.printStackTrace();
}
};
}

}


org.springframework.amqp.AmqpRemoteException: java.lang.RuntimeException: foo
at org.springframework.amqp.support.converter.RemoteInvocationAwareMessageConverterAdapter.fromMessage(RemoteInvocationAwareMessageConverterAdapter.java:74)
at org.springframework.amqp.rabbit.core.RabbitTemplate.convertSendAndReceive(RabbitTemplate.java:1500)
at org.springframework.amqp.rabbit.core.RabbitTemplate.convertSendAndReceive(RabbitTemplate.java:1433)
at org.springframework.amqp.rabbit.core.RabbitTemplate.convertSendAndReceive(RabbitTemplate.java:1425)
at com.example.So53846303Application.lambda$0(So53846303Application.java:28)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:804)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:794)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:324)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
at com.example.So53846303Application.main(So53846303Application.java:15)
Caused by: java.lang.RuntimeException: foo
at com.example.So53846303Application.listen(So53846303Application.java:20)

如您所见,有一个本地 org.springframework.amqp.AmqpRemoteException原因是远程服务器上抛出的实际异常。

关于spring-amqp - Spring AMQP 错误处理程序和返回异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53846303/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com