当前位置: 首页 > 知识库问答 >
问题:

继续调用rest API,直到服务器完成任务

易京
2023-03-14

我正在从一个Spring Boot应用程序(在Java11中)同步调用一个REST API来下载一个文件。

这就是REST API的样子:

@GetMapping("/download/{userId}/{fileName}")
public String download(final int userId, final String fileName) {
        if(requested file is available) {
             return {file location URL}
        } else {
             Begin generating a new file (takes 5 seconds to more than 5 minutes)
             return "file generation in progress" 
        } 
    }
  • 首先调用“/download”->API返回“文件生成正在进行”状态
  • 所以,5秒后再调用它->API再次返回“文件生成正在进行”状态
  • 因此,在5秒后再次调用它->API再次返回“文件生成正在进行”状态(但此时假定文件已生成)
  • 因此,5秒后再调用一次->API返回文件位置URL
  • 停止调用API并执行下一步操作

我有什么办法可以做到这一点吗?我尝试查看completablefuture&@schedule,但我对这两个选项都很陌生,找不到任何方法在代码中实现它们。任何帮助都将不胜感激!

共有1个答案

微生翼
2023-03-14

您可以利用Java Failsafe库。参考[基于结果(而不是异常)重试方法]中的答案。我已修改了答案中的代码以匹配您的场景。

private String downloadFileWithRetry() {
    final RetryPolicy<String> retryPolicy = new RetryPolicy<String>()
        .withMaxAttempts(-1)
        .handleResultIf("file generation in progress"::equalsIgnoreCase);

    return Failsafe
        .with(retryPolicy)
        .onSuccess(response -> System.out.println("Generated file Url is ".concat(response.getResult())))
        .get(this::downloadFile);
}

private String downloadFile() {
    return "file generation in progress";
}
 类似资料:
  • 问题内容: 如何让我的代码等待,直到DispatchQueue中的任务完成?是否需要任何CompletionHandler或其他东西? 我正在使用Xcode 8.2并在Swift 3中编写。 问题答案: 使用s可以实现这一点。您可以在群组和通话达到平衡时得到通知: 或者您可以等待: 注意 :阻止当前队列(在您的情况下可能是主队列),因此您必须在另一个队列上(如上面的示例代码中)以避免 死锁 。

  • 问题内容: 怎么可能 等到动作完成后再继续循环,我不能得到$ this var,因为它具有最后一个值,对不起我的英语,谢谢!!! 问题答案: 选项1:切换到处理程序中数组中的下一个元素。 选项2:同步发出Ajax请求: 全球: 或直接在请求中: });

  • 我已经创建了3个任务。Task3取决于Task1和Task2的结果。在调试代码时,它会正确执行,但在运行应用程序时,Task3会在Task1和Task2完成之前执行。 示例代码: 提前谢谢。

  • 我正在尝试使用C#'s async/await/continuewith。我的目标是必须有两个并行运行的任务,尽管哪个任务是按顺序执行一系列操作。为了做到这一点,我计划有一个清单 为了总结,这里有一个示例来说明我期望发生的事情: 预期输出为 但是,输出是 有没有一种方法可以让调用的任务等待提供的函数完成后才被视为完成?即。.等待将等待两个任务都完成,一个是原始任务,另一个是ContinueAnd返

  • 我正在开始执行器服务,我想知道当任务完成时如何调用函数。我见过这个函数http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html#isDone-- 但我不确定如何将其连接到我的代码中调用函数<code>endoftheroad() 这是我的代码

  • 问题内容: 詹金斯中有什么方法可以阻止给定任务执行所有下游任务?我有一系列功能测试阶段,每个阶段都需要在部署后针对服务器运行。服务器应该 不会 被运行测试时更新。但是,。 所以我有工作: 我需要阻止直到完成。 我怎样才能做到这一点? 问题答案: 看一下项目A的高级项目选项“在构建下游项目时阻止构建”选项。我相信这将阻止A的多个实例运行,直到所有下游项目(即B和C)都已完成。