当前位置: 首页 > 知识库问答 >
问题:

RxJava无限重试与新的可观察性

丌官丰羽
2023-03-14

我正在为vertx使用RX-Ifified API,这个问题必须做一个潜在的无限重试直到成功循环,我想实现,但有困难。我是RXJava新手。

以下是我想做的:

    null
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject );
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
     .retry()
vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
     .retryWhen( error -> {
        return _vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
      })

所以我想我可以使用RXJava的retryWhen()运算符,它允许我在根observable发出错误时发出第二个observable。我认为,第二个可观察的代码可能与上面在步骤1中生成初始观察者的代码相同。

但是,retryWhen()运算符(请参阅文档)不允许这第二个可观察到的对象发出错误,而不以错误结束订阅。

所以,我很难找到如何在这个链的第一部分设置一个潜在的无限重试循环。

vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject )
     // imagine that retryWhen() accomplishes an infinite retry
     .retryWhen( error -> {
        return _vertx.eventBus().<JsonObject>sendObservable( ... )
      })
     .flatMap( response -> {
        // inspect response, if it has usable data,
        // return that data as an observable
        return Observable.from(response.data());

        // if the response has no usable data,
        // wait for some time, then start the whole process
        // all over again
        return Observable.timer(timeToWait).<WHAT GOES HERE?>;
     })

我创建的任何可观察到的东西似乎都需要链中的所有元素来达到这一点,这似乎是一种可能应该避免的递归。

在这一点上,任何帮助或建议都是非常欢迎的。

共有1个答案

龙俊德
2023-03-14

非常感谢RxJava Google小组的Ben Christensen指出defer()操作符,它将在每次订阅时生成一个新的可观察的。然后,可以用标准的retry()操作符组合它来获得有限重试。

因此,我的问题中第一个问题的最简单解决方案如下所示:

Observable.defer( () -> vertx.eventBus().<JsonObject>sendObservable( "theAddress", aJsonObject ) )
.retry()

...如果需要指数退避,可以在给defer()运算符的工厂方法中使用适当的参数添加observable.timer()。

我还在研究第二个问题。

 类似资料:
  • 我正在尝试开发我的第一个RxJava例子 我有一个带有文本框和三个按钮的主要活动。第一个按钮初始化单独类中的整数。第二个按钮订阅一个可观察量,该可观察量假定正在观察整数。第三个按钮将整数的值减小 1。 这是我的密码 和班级 当我尝试使用 订阅时,它只是给了我 的值(即 6),然后它给了我完成! 然后我尝试使用,认为我需要使用,只是而不是,但后来我得到了一个返回的空的,然后再次完成! 有人能帮助我从

  • 在android 6.0.1 Samsung s6 Edge+上的测试 当device screen脱机并从debug中拔出时,可观察到的只是停止发射项目。如果设备打开,则开始发射对象。另一个问题是,在停止接收项目之前,我会按照相同项目的顺序随机地得到2/3个重复调用 ____________________________edit_________________________________

  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

  • 我正在从事一个涉及Hystrix的项目,我决定使用RxJava。现在,忘记Hystrix的其余部分,因为我相信主要问题是我完全搞砸了正确编写可观察代码。 需要:我需要一种方法来返回一个代表多个可观察对象的可观察对象,每个可观察对象都运行一个用户任务。我希望该可观察对象能够返回任务的所有结果,甚至错误。 问题:可观测流会因错误而消亡。如果我有三个任务,而第二个任务引发了一个异常,那么即使第三个任务成

  • 我在创建一个将返回对象列表的可观察对象时遇到了麻烦。我有一个ID列表,想对我的数据库提出一个请求。在这种情况下,我使用的是Firebase。当得到一个结果时,我希望将这些对象中的每一个编译成一个列表,然后返回该列表。我需要在返回之前等待所有的对象都返回。我在我的视图模型反序列化器类中这样做。这是我的代码。 有几种方法可以从firebase数据库中返回数据,我可以返回Documentsnapshot