如何在rxJava中不断尝试直到成功

如何在rxJava中不断尝试直到成功,java,rx-java,Java,Rx Java,我想继续尝试建立TCP连接,并在成功时对该连接进行处理 假设这是我的界面: public interface ConnectionFactory { rx.Observable<Socket> createConnection(String host, int port); } 公共接口连接工厂{ 可观察的createConnection(字符串主机,int端口); } 我想这样使用它: ConnectionFactory factory = new Connecti

我想继续尝试建立TCP连接,并在成功时对该连接进行处理

假设这是我的界面:

public interface ConnectionFactory {

    rx.Observable<Socket> createConnection(String host, int port);

}
公共接口连接工厂{
可观察的createConnection(字符串主机,int端口);
}
我想这样使用它:

ConnectionFactory factory = new ConnectionFactoryImpl();

rx.Observable<Socket> rxSocket = factory.createConnection("abc.mycomp.com", 9999);

rxSocket.subscribe(...);
ConnectionFactory工厂=新的ConnectionFactoryImpl();
rx.Observable rxSocket=factory.createConnection(“abc.mycop.com”,9999);
rxSocket.subscribe(…);
我的问题是-ConnectionFactory.create(String,int)的实现是什么样子的?不寻找工作代码,但指针会有所帮助。RxJava1.x中是否有带有重试功能的轮询机制


它必须继续尝试每10秒连接一次,直到成功,然后再呼叫订户.onNext(Socket)。可以抑制IOException/任何其他连接异常。

您可以按如下方式实现ConnectionFactory:

class ConnectionFactoryImpl implements ConnectionFactory {

    @Override
    public rx.Observable<Socket> createConnection(String host, int port) {
        Single<Socket> single = Single.create(sub -> {
            try {
             Socket socket = null;
             //create your socket
             sub.onSuccess(socket); 
         } catch (Exception e) {
             sub.onError(e);
         }
         });
         return single.toObservable();
    }
}
类ConnectionFactoryImpl实现ConnectionFactory{
@凌驾
公共接收。可观察的createConnection(字符串主机,int端口){
单个=单个。创建(子->{
试一试{
套接字=空;
//创建您的套接字
sub.onSuccess(插座);
}捕获(例外e){
分包商(e);
}
});
返回single.toObservable();
}
}
要每10秒重试一次连接,可以执行以下操作:

ConnectionFactory factory = new ConnectionFactoryImpl();

rx.Observable<Socket> rxSocket = Observable.interval(10, TimeUnit.SECONDS)
    .flatMap(tick -> factory.createConnection("abc.mycomp.com", 9999)
                    .map(socket -> Optional.of(socket))
                    .onErrorReturn(throwable -> Optional.empty())
                    .filter(op -> op.isPresent())
                    .map(op -> op.get())
            )
    .take(1);

rxSocket
    .subscribe(socket -> {

    });
ConnectionFactory工厂=新的ConnectionFactoryImpl();
rx.可观测rxSocket=可观测间隔(10,时间单位:秒)
.flatMap(勾选->工厂.createConnection(“abc.mycop.com”,9999)
.map(套接字->可选的.of(套接字))
.onErrorReturn(可丢弃->可选.empty())
.filter(op->op.isPresent())
.map(op->op.get())
)
.采取(1)项措施;
rxSocket
.订阅(套接字->{
});

请注意,默认情况下,
Observable.interval()
在调度程序上运行。computation(),这意味着
rxSocket
异步执行

IMO,
ConnectionFactory
不应具有任何重试逻辑。正在使用工厂的客户端应具有重试权限。例如,客户机可以使用使用工厂的循环。如果工厂因为无法建立连接而引发异常,则捕获异常,然后休眠,然后继续下一次迭代。但是代码应该循环多少次呢?为什么在第一次尝试时不能建立连接?是的,我们可以给它起一个不同的名字。可能有很多原因导致无法建立连接,而这不在我们的控制范围内,例如,我们尝试连接的服务可能在该时间点关闭。