【发布时间】:2017-04-11 07:40:36
【问题描述】:
我是 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()
【问题讨论】:
-
您认为错误来自哪里?来自
listeners.add()还是来自onUpdate()?您能否举例说明您希望通知订阅者的错误情况。 -
我猜你有点误解 hot/cold Observable 。这并不热,每个订阅者都有自己的监听器来发出事件。甚至您也没有在 dispose 中取消注册您的听众。由于 Observable.create 机制,可观察对象在您处置后不会发出事件。
-
可以是 listeners.add() 和 onUpdate()。不幸的是,我使用的 API 指定得很差。
-
谢谢,我现在意识到我的生产者必须在 Observable.create() 之外创建才能被认为是热的
标签: java rx-java reactive-programming rx-java2