如何使用执行器服务进行轮询,直到结果到达
我有一个场景,我必须轮询远程服务器检查任务是否已完成。一旦它完成了,我就进行不同的调用来检索结果。
我最初认为我应该使用一个 with 进行轮询:SingleThreadScheduledExecutor
scheduleWithFixedDelay
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
ScheduledFuture future = executor.scheduleWithFixedDelay(() -> poll(jobId), 0, 10, TimeUnit.SECONDS);
public void poll(String jobId) {
boolean jobDone = remoteServer.isJobDone(jobId);
if (jobDone) {
retrieveJobResult(jobId);
}
}
但是,由于我只能提供一个不能返回任何东西的东西,我不明白什么时候会完成,如果有的话。打电话到底是什么意思?我等什么结果?Runnable
scheduleWithFixedDelay
future
future.get()
第一次检测到远程任务已完成时,我想执行不同的远程调用并将其结果设置为 .我想我可以使用CompletableFuture来实现这一点,我会转发到我的方法,这将反过来将其转发到我的方法,最终完成它:future
poll
retrieveTask
CompletableFuture<Object> result = new CompletableFuture<Object>();
ScheduledFuture future = executor.scheduleWithFixedDelay(() -> poll(jobId, result), 0, 10, TimeUnit.SECONDS);
public void poll(String jobId, CompletableFuture<Object> result) {
boolean jobDone = remoteServer.isJobDone(jobId);
if (jobDone) {
retrieveJobResult(jobId, result);
}
}
public void retrieveJobResult(String jobId, CompletableFuture<Object> result) {
Object remoteResult = remoteServer.getJobResult(jobId);
result.complete(remoteResult);
}
但这有很多问题。首先,似乎甚至不适合这种用途。相反,我应该做我想,但是当我被取消/完成时,我将如何正确关闭并取消它返回?感觉轮询应该以某种完全不同的方式实现。CompletableFuture
CompletableFuture.supplyAsync(() -> poll(jobId))
executor
future
CompletableFuture