RxJava:阻塞直到重试

时间:2014-07-05 11:37:22

标签: reactive-programming rx-java

我正在尝试学习反应式编程,作为第一个“真正的”应用程序,我已经选择了RxJavaRxNetty的简单IRC客户端。

如果第一个服务器出现故障,我目前仍在重试其他服务器。所以,我有一个Observable<Server>,它由网络服务器组成。它可以使用.repeat()进行设置,因此可以无限期地重复使用服务器。现在,我如何将其设置为阻塞,以便一次只使用一个,只有RxClient::connect失败或连接超时才会进入下一个?

虽然其他解决方案是使用域,每次我连接并使用.retry()时将其重定向到不同的服务器,我有兴趣以反应方式解决问题。

连接到所有服务器(没有.repeat())工作正常,但这不是我想要的:

servers
    .map(x -> RxNetty.createTcpClient(
        x.getAddress(),
        x.getPort(),
        PipelineConfigurators.stringMessageConfigurator()))
    .flatMap(RxClient::connect)
    .onErrorFlatMap(x -> Observable.empty())
    .subscribe(this::handleConnection);

1 个答案:

答案 0 :(得分:2)

如何使用concatMap代替flatMap。因此,只有在RxClient::connect完成或错误时才会使用下一个服务器:

servers
    .map(x -> RxNetty.createTcpClient(
        x.getAddress(),
        x.getPort(),
        PipelineConfigurators.stringMessageConfigurator()))
    .concatMap(RxClient::connect)
    .onErrorFlatMap(x -> Observable.empty())
    .subscribe(this::handleConnection);