Java 重新尝试执行服务调用

标签 java spring spring-mvc

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

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

这里的要求是,如果存在上述任何问题且没有响应结果,则应尝试服务调用 3 次,而不要重复之前的服务调用(如果它们已响应)。

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

提前致谢!!!!!!!

最佳答案

只需查看 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
   ...
}

关于Java 重新尝试执行服务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47052358/

相关文章:

java - 如何使用 Spring MockMvc 放置多部分/表单数据?

spring-mvc - Spring MVC JDBC 数据源事务管理器 : Data committed even after readonly=true

java - 使用文本生成图像

Spring boot - Embedded Tomcat - Connector Customizer - 无法添加 parseBodyMethods 属性

java - Spring Transactional DAO,异常被吞掉

java - 使用 ExceptionResolver 捕获 Spring MVC DispatcherServlet 异常

java - Spring 任务

java - 为什么这个 Java 正则表达式不起作用?

java - 使用 JPA 将一个数据库列映射到两个单独的字段

java - socket.close()会中断数据传输吗?