迭代地调用RESTful API

时间:2018-02-21 14:22:41

标签: java spring

我正在构建一个调用多个第三方RESTful Api的业务流程服务层。其中一个Api需要我以一定的间隔多次调用它,直到我得到一个"完成" for" status"。

语言:Java IDE:STS 应用程序框架:Spring

要求: 每隔30秒打电话 如果组合间隔达到或超过5分钟,则失败。

JSON:

当我需要再次打电话时

{
   "id": 1234,
   "status":"pending
}

当我知道它已经完成时

{
   "id":1234,
   "status": "finished"
}

是否有一个包或某种方式我可以实现这一点而不使用while循环和Thead.sleep()

2 个答案:

答案 0 :(得分:3)

您可以使用ScheduledExecutorService.scheduleAtFixedRate(),其中一个任务以间隔30秒调用REST,第二个任务在5分钟后取消第一个任务。 Java 8上的示例:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(2);
ScheduledFuture<?> task = scheduledExecutorService.scheduleAtFixedRate(
    () -> System.out.println("some task"), 0, 30, TimeUnit.SECONDS);
scheduledExecutorService.scheduleAtFixedRate(() -> {
    System.out.println("shutdown");
    task.cancel(false);
}, 0, 5, TimeUnit.MINUTES);

当您收到finished消息时,您还可以通过task.cancel(false);

取消所有任务

答案 1 :(得分:2)

您可以尝试@Scheduled Spring注释。例如:

@Scheduled(fixedRate = 30000)
public void scheduleTaskWithFixedRate()
{
    logger.info("Executed");
}

实施场景的春天方式是:
1)将bean添加到Spring应用程序java config

@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler()
{
    return new ThreadPoolTaskScheduler();
}

2)在班上自动装配taskScheduler:

@Autowired ThreadPoolTaskScheduler taskScheduler

3)使用以下代码在您的班级中使用taskScheduler:

    ScheduledFuture<?> scheduledFuture = taskScheduler.scheduleAtFixedRate(() -> System.out.println("running"), 30*1000);

    taskScheduler.schedule(() -> {
        System.out.println("finish");
        scheduledFuture.cancel(false);
    }, new Date(System.currentTimeMillis() + 5*60*1000));

这个想法是每隔30秒安排任务执行,并使用另一个任务取消它,该任务将在5分钟内运行一次。这里的好处是这个taskScheduler是由Spring管理的。