如何从 Spring AOP 声明重试方法中抛出异常?

How to throw exception from Spring AOP declarative retry methods?

我正在使用 Spring Retry.

在我的方法中实现一些重试处理

我的应用程序中有一个数据访问层 (DAL),我的应用程序中有一个服务层。

我的服务层调用 DAL 建立远程连接以检索信息。如果 DAL 失败,它将重试。但是,如果重试次数失败我想重新抛出异常。

在我目前的项目中,我有一些与此非常相似的东西:

@Configuration
@EnableRetry
public class Application {

    @Bean
    public Service service() {
        return new Service();
    }

}

@Service
class Service {

    @Autowired
    DataAccessLayer dal;

    public void doSomethingWithFoo() {
        Foo foo = dal.getFoo()
        // do something with Foo
    }

}

@Service
class DataAccessLayer {
    @Retryable(RemoteAccessException.class)
    public Foo getFoo() {
        // call remote HTTP service to get Foo
    }
    @Recover
    public Foo recover(RemoteAccessException e) {
       // log the error?
       // how to rethrow such that DataAccessLayer.getFoo() shows it throws an exception as well?
    }
}

我的应用程序有一个服务,该服务调用 DataAccessLayer getFoo。如果 getFoo 失败多次,DAL 将处理重试。如果在那之后失败了,我希望我的服务层对此做些什么。但是我不确定如何让人们知道。我正在使用 intelliJ,当我在 @Recover recover 方法中尝试 throw e; 时,我没有收到任何 DataAccessLayer.getFoo 引发任何异常的警告。我不确定是否会。但我希望 IDE 警告我,当重试失败时,将抛出一个新的异常,让服务层知道需要它。否则,如果它调用 dal.getFoo 它不知道要处理任何错误。这通常是如何处理的?我不应该使用 AOP 声明式风格而使用命令式吗?

您可以更改 getFoo()(和 recover())以添加 throws <some checked exception> 并将 RemoteAccessException 包裹在其中(在 recover() 中)。

这将强制服务层捕获该异常。