Observable.timer rxjava无法用于指数回退

时间:2018-12-14 14:46:38

标签: java observable rx-java rx-java2 exponential-backoff

如果网络中断或给定服务中断,我试图通过Observable.timer设置指数补偿。当有错误时,我有一个retryWhen。

我有两个问题,无论设置了什么时间,我都无法使计时器工作,它总是立即运行。据我所知,它应该运行延迟,然后发送完整的延迟,但是当我查看日志时,看不到延迟。

第二个原因是因为我想在返回时获取重试的值,所以我使用了订阅来获取它,但是当返回Observable错误时,在执行计算时会引发异常。对于第二个问题,我计划检查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 :(得分:0)

您有一行孤立的代码:

      Observable.timer(10, TimeUnit.SECONDS);

这行代码唯一要做的就是创建一个可观察的对象。结果将被丢弃,因为它什么也没做。

如果您需要退后,请执行以下操作:

return x.delay(10, TimeUnit.SECONDS);
flatMap()运算符内

。删除x.subscriber();返回之前,应先进行任何记录。