我想继续尝试建立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 /其他任何连接异常。
答案 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
是异步执行的。