我正在尝试学习反应式编程,作为第一个“真正的”应用程序,我已经选择了RxJava和RxNetty的简单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);
答案 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);