Observable.timer rxjava не работает для экспоненциального отката - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь настроить экспоненциальное отключение через Observable.timer, если сеть не работает или если данная служба не работает.У меня повторная попытка при появлении ошибок.

У меня две проблемы, я не могу заставить работать таймер, независимо от установленного времени, он всегда запускается немедленно.Из того, что я знаю в документах, он должен запустить задержку, а затем отправить завершение, но когда я просматриваю журналы, я не вижу задержки.

Во-вторых, потому что я хотел получить значение повторной попытки, когдаэто возвращено, я использовал подписку, чтобы получить это, однако, когда возвращается наблюдаемая ошибка, это выдает исключение, когда я делаю вычисления.Что касается второго вопроса, я планирую проверить тип Observable и действовать в зависимости от его типа.

Если бы я мог получить представление о том, что я делаю неправильно, это было бы здорово

return Observable.zip(
    locationObservable,
    oAdapterService.getIssuerInformation(sponsorCode),
    oAdapterService.getOfferInformation(sponsorCode, activity.getOfferCode()),
    (LocationInfo a, IssuerInfo b, OfferInfo c) -> {
      OAdapterUtil.setLocationInfo(activity, a);
      OAdapterUtil.setIssuerInfo(activity, b);
      OAdapterUtil.setOfferInfo(activity, c);
      return activity;
    })
    .retryWhen(errors -> errors.zipWith(Observable.range(1, maxRetries), (error, retries) -> {
          if (retries++ < maxRetries) {
            log.debug("Issues with Service call for transaction ID {} with initiator ID {}, retry count {}"
                ,activity.getTransactionId(),activity.getInitiatorId() ,retries);
            return Observable.just(retries);
          }
          log.error("Tried to call Service {} time(s) for for transaction ID {} with initiator ID {}, error is {} "
              ,maxRetries,activity.getTransactionId(),activity.getInitiatorId(),error);
          return Observable.error(error);
        }
    ).flatMap(x -> {

          log.debug("X value in flat map is  {}",x.toString());
          x.subscribe(currentValue -> {
            log.debug("X value in subscribe is with subscribe {}",currentValue.toString());
            double retryCount =  Double.parseDouble(currentValue.toString()) + 2.0  ;
            log.debug("retry count {}",retryCount);
             long exponentialBackOff =(long)Math.pow(2.0, retryCount);
            log.debug("exp back off {}",exponentialBackOff);
        // Observable.timer(exponentialBackOff, TimeUnit.SECONDS);
          });

          Observable.timer(10, TimeUnit.SECONDS);

          return x;
        // Observable.timer(backoffPeriod, TimeUnit.MILLISECONDS);
        }
    ));

1 Ответ

0 голосов
/ 14 декабря 2018

У вас есть потерянная строка кода:

      Observable.timer(10, TimeUnit.SECONDS);

Единственное, что делает эта строка кода, - это создание наблюдаемой.Результат отбрасывается, потому что с ним ничего не делается.

Если вам нужно отступить, то выполните:

return x.delay(10, TimeUnit.SECONDS);

внутри оператора flatMap().Удалить x.subscriber();любая регистрация должна быть сделана до возвращения.

...