我正在构建一个调用多个第三方RESTful Api的业务流程服务层。其中一个Api需要我以一定的间隔多次调用它,直到我得到一个"完成" for" status"。
语言:Java IDE:STS 应用程序框架:Spring
要求: 每隔30秒打电话 如果组合间隔达到或超过5分钟,则失败。
JSON:
当我需要再次打电话时
{
"id": 1234,
"status":"pending
}
当我知道它已经完成时
{
"id":1234,
"status": "finished"
}
是否有一个包或某种方式我可以实现这一点而不使用while循环和Thead.sleep()
答案 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管理的。