【问题标题】:Observable.timer rxjava not working for exponential back offObservable.timer rxjava 不适用于指数回退
【发布时间】:2018-12-14 14:46:38
【问题描述】:

如果网络关闭或给定服务关闭,我正在尝试通过 Observable.timer 设置指数回退。当出现错误时,我有一个 retryWhen。

我有两个问题,我无法让计时器工作,无论时间设置如何,它总是立即运行。根据我在文档中的了解,它应该运行延迟然后发送一个完整的,但是当我查看日志时,我没有看到任何延迟。

其次是因为我想在返回时获取重试的值,所以我使用 subscribe 来获取它,但是当返回 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);
        }
    ));

【问题讨论】:

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


    【解决方案1】:

    你有一个孤立的代码行:

          Observable.timer(10, TimeUnit.SECONDS);
    

    这行代码唯一要做的就是创建一个 observable。结果被丢弃,因为没有对其进行任何处理。

    如果你需要后退,那么做:

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

    flatMap() 运算符的内部。删除x.subscriber();任何日志记录都应该在返回之前完成。

    【讨论】:

    • 我会尝试,但是在通过return Observable.just(retries) 返回重试计数的情况下,我如何在flatMap() 中访问该值,以便我可以增加延迟或根据重试次数后退并访问return Observable.error(error) 的值(如果是错误)?我读到了我需要使用subscribe()的值。
    • 您的 zipWith() 运算符发出错误或重试次数。 blog.danlew.net/2016/01/25/… 有一篇关于您的问题的非常好的文章
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    相关资源
    最近更新 更多