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

时间:2018-07-31 18:34:49

标签: java rx-java

我想继续尝试建立TCP连接,并在成功建立连接后进行操作。

假设这是我的界面:

public interface ConnectionFactory {

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

}

我想用这种方式:

ConnectionFactory factory = new ConnectionFactoryImpl();

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

rxSocket.subscribe(...);

我的问题是-ConnectionFactory.create(String,int)的实现将如何?不寻找有效的代码,但是指针会有所帮助。在rxJava 1.x中是否存在可重试的轮询机制?

它必须继续尝试每隔10秒进行一次连接(例如),直到成功,然后再调用subscriber.onNext(Socket)。可能会抑制IOException /其他任何连接异常。

1 个答案:

答案 0 :(得分:0)

您可以如下实现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();
    }
}

要每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 -> {

    });

请注意,Observable.interval()默认在Schedulers.computation()上运行,这意味着rxSocket是异步执行的。