У меня есть сценарий использования, в котором мне нужно вернуть завершаемое будущее на основе опроса статуса из службы отдыха: у меня есть:
Class Dummy implements Function<DummyObject, CompletionStage<MyMainStatus>> {
private static final int POLL_INTERVAL = 15;
private final ScheduledExecutorService service;
private final StateFullComponent component;
public Dummy(ScheduledExecutorService service, StateFullComponent component){
this.service = requireNonNull(service);
this.component = requireNonNull(component);
}
@Override
public CompletionStage<MyMainStatus> apply(DummyObject dummy) {
CompletableFuture<MyMainStatus> cf1 = new CompletableFuture<>();
CompletableFuture<MyIntermediateStatus> cf2 = new CompletableFuture<>();
final ScheduledFuture<?> checkFuture = service.scheduleAtFixedRate(() -> {
StatusObject so = someRestServiceCall(dummy);
if(so.status.ALL_OK){
cf2.complete(MyIntermediateStatus.OK);
} else if(so.status.SOME_FAIL){
Set<RetryJobs> jobs = findRetryJobs(dummy);
component.add(jobs);
if(so.status.SOME_FAIL_SOME_PASS) {
//this block basically monitors the retry jobs
CompletionStage<MyIntermediateStage> cf3 =
someMethodWhichReturnsStage(component.get(jobs));
cf3.thenCompose(interStatus -> {
if(interStatus.equals(MyIntermediateStatus.OK))
cf2.complete(MyIntermediateStatus.OK);
else
cf2.complete(MyIntermediateStatus.FAIL);
return cf2;
}
}
, 0, POLL_INTERVAL, TimeUnit.Seconds);
return cf2.thenCompose((result) -> {
checkFuture.cancel(true);
if(result.equals(MyIntermediateStatus.OK))
cf1.complete(MyMainStatus.OK);
else
cf1.complete(MyMainStatus.NOT_OK);
return cf1;
}
Хорошо, теперь приступаю к проблеме, что происходитПервичные опросы проходят все хорошо, и я также могу планировать повторные попытки.Проблема возникает, когда в игру вступает блок SOME_PASS_SOME_FAIL, даже когда повторные партии еще не завершены, похоже, что будущий CF2 завершен, так как опрос останавливается и в принципе ничего не происходит.я понимаю, что я ничего не делаю с cf3, это может быть причиной?какие-либо предложения по улучшению выше?я делаю .get () на будущее я возвращаюсь из вышеупомянутого класса