热可观测数据的RxJava错误处理

热可观测数据的RxJava错误处理,java,rx-java,reactive-programming,rx-java2,Java,Rx Java,Reactive Programming,Rx Java2,我对RxJava非常陌生,对模式等有一些疑问。 我正在使用下面的代码创建一个可观察对象: public Observable<Volume> getVolumeObservable(Epic epic) { return Observable.create(event -> { try { listeners.add(streamingAPI.subscribeForChartCandles(epi

我对RxJava非常陌生,对模式等有一些疑问。 我正在使用下面的代码创建一个可观察对象:

    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);
            }
        });
    }
公共可观测getVolumeObservable(Epic){
返回可观察。创建(事件->{
试一试{
add(streamingAPI.subscribebeforchartclunds(epic.getName(),MINUTE,newhandyTableListenerAdapter()){
@凌驾
public void onUpdate(int i,字符串s,UpdateInfo UpdateInfo){
if(updateInfo.getNewValue(CONS_END).equals(一)){
onNext(新卷(Integer.parseInt(updateInfo.getNewValue(上次交易卷)));
}
}
}));
}捕获(例外e){
记录误差(“可观测体积误差”,e);
}
});
}
一切正常,但我对错误处理有一些疑问。 如果我理解正确,这将被视为“热可观察”,即无论是否有订阅,事件都会发生(onUpdate是远程服务器使用的回调,我无法控制)

我选择不在这里调用onError,因为我不希望在出现单个异常时,可观察对象停止发出事件。是否有更好的模式可供使用。我想到了retry(),但我不确定它对于热可观察对象是否有意义

另外,在创建订阅时,但在调用第一个onNext之前,如何表示可观察对象?它只是一个可观察的。空的()

1)你的可观察不是热的。区别因素是多个订阅者是否共享同一订阅<代码>可观察。create()为每个订阅者调用subscribe函数,即它是冷的

不过很容易让它变热。只需添加
share()
操作符。它将与第一个用户订阅,并与最后一个用户取消订阅。不要忘记使用以下内容实现取消订阅功能:

event.setCancellable(() -> listeners.remove(...));
2) 错误可以是可恢复的,也可以是不可恢复的

如果你认为一个错误是自恢复的(从你这边不需要任何动作),你不应该调用<代码> OnEngult,因为这会杀死你的可观察的(不会再有任何事件被发射)。您可以通过发送带有错误详细信息的特殊

消息通知订户

如果一个错误是致命的,例如,您无法添加侦听器,因此可能没有其他消息,您不应该默默地忽略这一点。发出一个错误,因为你的可观察对象无论如何都不起作用

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


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

您认为错误来自哪里?从
listeners.add()
或从
onUpdate()
?你能举一个你想通知订阅者的错误情况的例子吗?我想你有点误解了热/冷的可观察性。这不是热点,每个订阅者都有自己的侦听器来发出事件。即使您没有在dispose中注销您的侦听器。由于observable.create机制,observable在dispose后不会发出事件。它可能同时是listeners.add()和onUpdate()。不幸的是,我使用的API的指定非常糟糕。谢谢,我现在意识到我的生产者必须在Observable.create()之外创建,才能被认为是热门的