如何从 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()
中)。
这将强制服务层捕获该异常。
我正在使用 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()
中)。
这将强制服务层捕获该异常。