如何创建一个Observable,它将在完成后为Observable流提供支持?

时间:2015-01-03 13:06:21

标签: java rx-java

我正在使用Jetty WebSocket Client从客户端建立WebSocket连接。我正在尝试创建一个以Observable形式提供事件流的类。

我设法通过编写一个POJO @WebSocket类来实现这一点,该类将所有内容发布到SerializedSubject<SocketEvent, SocketEvent> eventSubject = new SerializedSubject<>(PublishSubject.create());并且一切正常。

每次连接中断时如何重新连接?

我尝试从Observable.intervalflatMap开始 - 每个连接返回Observable的Observable<ObservableSocket.SocketEvent> connect(String url)

Observable<Long> reconnectObservable = Observable.interval(1000, TimeUnit.MILLISECONDS);
Observable<ObservableSocket.SocketEvent> composed = reconnectObservable.flatMap(aLong -> {
    try {
        System.out.println("Connect");
        return connect(url);
    } catch (Exception e) {
        System.out.println("Exception: " + e);
        return Observable.just(new ObservableSocket.SocketCloseEvent(999, "Exception: " + e));
    }
});

问题是,它每1秒创建一个另一个连接。如何使 flatMap 等待内部Observable完成?

1 个答案:

答案 0 :(得分:1)

Observable.range(0, Integer.MAX_VALUE).concatMap(tick -> { ... });

concatMap维护一个SerialSubscription,并且一次只能订阅一个发出的observable,等待每个obindable终止。范围提供无限信号(在这种情况下,无穷大结束于大约20亿:P),并且concatMap将根据创建的每个内部可观察量一次连接一个。