热可观察的RxJava错误处理

时间:2017-04-11 07:40:37

标签: java rx-java reactive-programming rx-java2

我对RxJava很陌生并对模式等有一些疑问 我正在使用以下代码创建一个observable:

    public Observable<Volume> getVolumeObservable(Epic epic) {
        return Observable.create(event -> {
            try {
                listeners.add(streamingAPI.subscribeForChartCandles(epic.getName(), MINUTE, new HandyTableListenerAdapter() {
                    @Override
                    public void onUpdate(int i, String s, UpdateInfo updateInfo) {
                        if (updateInfo.getNewValue(CONS_END).equals(ONE)) {
                            event.onNext(new Volume(Integer.parseInt(updateInfo.getNewValue(LAST_TRADED_VOLUME))));
                        }
                    }
                }));
            } catch (Exception e) {
                LOG.error("Error from volume observable", e);
            }
        });
    }

一切都按预期工作,但我对错误处理有一些疑问。 如果我理解正确,这将被视为一个热点可观察的事件,即无论是否有订阅都会发生事件(onUpdate是我无法控制的远程服务器使用的回调)。

我选择不在这里调用onError,因为我不希望observable在单个异常的情况下停止发出事件。是否有更好的模式可供使用?想到了.retry(),但我不确定它是否适合热观察?

此外,在创建订阅时,但在调用第一个onNext之前,如何表示observable?它只是一个Observable.empty()

1 个答案:

答案 0 :(得分:2)

1)您的observable不是 hot 。区别因素是多个订户是否共享相同的订阅。 Observable.create()为每个订阅者调用订阅函数,即 cold

虽然很容易让它。只需添加share()运算符即可。它将订阅第一个订阅者并取消订阅最后一个订阅者。不要忘记使用以下内容实现取消订阅功能:

event.setCancellable(() -> listeners.remove(...));

2)错误可能可恢复无法恢复

如果您认为错误是可自行恢复的(您不需要采取任何操作),则不应调用onError,因为这会终止您的可观察性(不会发出其他事件)。您可以通过发送包含错误详细信息的特殊Volume消息来通知您的订阅者。

如果错误是致命的,例如你没有添加监听器,所以没有其他消息,你不应该默默地忽略它。发出onError因为您的观察结果无论如何都不起作用。

如果错误需要您的操作,通常是重试,或者在超时时重试,您可以添加一个retryXxx()运算符。在create()之后执行此操作,但在 share()之前执行

3)Observable是一个subscribe()方法的对象。它的具体表示取决于您创建它的方法。例如,请参阅create()的源代码。