有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

spring Java重新尝试执行服务调用

我正在用Java开发一个应用程序Spring,它只需点击一个按钮就包含一个流。 该流包含两个服务调用。根据这些服务呼叫,决定是继续还是结束流程

此流程中涉及的服务是第三方API。如果出现任何网络问题或这些API关闭,此流程将不会继续

这里的要求是,如果上述问题中有任何一个没有得到响应,则应尝试服务调用3次,如果之前的服务调用已经响应,则不重复

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

提前谢谢


共 (1) 个答案

  1. # 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。从服务调用类外部执行线束调用

    这对于在声明类之外执行对@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
       ...
    }