У меня есть сценарий, когда я должен опросить удаленный сервер, проверяя, завершена ли задание. После этого я делаю другой вызов для получения результата.Как использовать ExecutorService для опроса до получения результата
Первоначально я полагал, что я должен использовать 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()
? Какого результата я жду?
В первый раз, когда я обнаружил, что удаленная задача выполнена, я хочу выполнить другой удаленный вызов и установить его результат как значение future
. Я полагал, что я мог бы использовать CompletableFuture для этого, что я хотел бы направить на мой 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
отменен/завершен? Похоже, что опрос должен реализовываться совершенно по-другому.
Вы также можете представить, что (вызываемые объекты возвращаемых результаты): https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable. html – Thilo
@Thilo Только для одноразовых задач, а не с расписаниемWithFixedDelay или \t scheduleAtFixedRate, поэтому опрос отключен – kaqqao
@Thilo Я не думаю, что 'scheduleWithFixedDelay' когда-нибудь получит' Callable'. – HuStmpHrrr