CompletableFuture не решается, несмотря на блокировку - PullRequest
0 голосов
/ 26 мая 2018

У меня есть сценарий использования, в котором мне нужно вернуть завершаемое будущее на основе опроса статуса из службы отдыха: у меня есть:

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 () на будущее я возвращаюсь из вышеупомянутого класса

...