Java重新尝试执行服务调用

时间:2017-11-01 10:05:47

标签: java spring spring-mvc

我正在使用Java开发一个应用程序Spring,其中包含单击按钮的流程。 该流包含两个服务调用。在这些服务呼叫的基础上,决定是继续前进还是结束流程。

此流程涉及的服务是第三方API。如果存在任何网络问题或者这些API已关闭,则此流程将无法继续。

此处的要求是,如果上述任何问题都没有响应结果,则应尝试3次服务呼叫,如果他们已经响应,则不会重复之前的服务呼叫。

我想知道春天或任何其他框架中是否有任何可用于实现上述流程的功能。

提前致谢!!!!!!!

1 个答案:

答案 0 :(得分:1)

只需查看Spring Retry库,它是Spring项目的一部分(此库是Spring Batch的前一部分,您可以在那里查找它,具体取决于您的Spring版本过时了是)

您可以使用@Retryable注释及其maxAttempts来实现您的要求

假设您已经需要依赖项(spring-retryaspectjrtaspectjweaver)并使用具有基于注释的配置的现代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。从Service Caller类外部执行线束调用

这对于执行@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
   ...
}