我正在使用 Java Spring 开发一个应用程序,其中包含单击按钮的流程。 该流程包含两个服务调用。根据这些服务调用,决定是继续还是结束流程。
此流程中涉及的服务是第三方 API。如果出现任何网络问题或这些 API 关闭,此流程将不会继续。
这里的要求是,如果存在上述任何问题且没有响应结果,则应尝试服务调用 3 次,而不要重复之前的服务调用(如果它们已响应)。
我想知道spring或其他框架是否有任何功能可以用来实现上述流程。
提前致谢!!!!!!!
最佳答案
只需查看 Spring Retry库,它是 Spring 项目伞的一部分(该库是 Spring Batch 的前一部分,您可以在那里查找它,具体取决于您的 Spring 版本的过时程度)
您可以使用@Retryable
注解及其maxAttempts
来实现您的需求
假设您拥有所需的依赖项( spring-retry 、 aspectjrt 、 aspectjweaver )并使用带有基于注释的配置的现代 Spring 版本,您需要在概念上实现 3 个步骤:
<强>1。启用重试支持
将@EnableRetry
添加到Spring应用程序的@Configuration
标记的类之一,如here所述
<强>2。创建服务调用者
这里我们期望在出现网络问题时抛出 IOException(出于示例目的而进行了简化)。更进一步,您还可以通过指定 backoff timeout 来研究重试之间的暂停。
@Service
public class ServiceCaller {
@Retryable(value = IOException.class, maxAttempts = 3)
public Result callFirstService() throws IOException {
return actualCallLogicToSomeService(...);
}
@Retryable(value= IOException.class, maxAttempts = 3)
public Result callSecondService() throws IOException {
return actualCallLogicToSomeAnotherService(...);
}
<强>3。从服务调用者类外部执行线束调用
这对于在声明类之外执行对 @Retryable
标记的方法的实际调用链以使底层的aspectj代理正常工作非常重要:
@Autowired
private ServiceCaller caller;
public Result doChainOfCalls() throws IOException {
caller.callFirstService(); //in case of network issue fails after 3 attempts with IOException
caller.callSecondService(); //after above line passed successfully also attempts 3 times according to @Retryable
...
}
关于Java 重新尝试执行服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47052358/