![](/img/trans.png)
[英]Error handling to call a supplementary observable (to fix the error) with RxJava
[英]RxJava error handling for hot observable
我是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);
}
});
}
一切都按預期工作,但是我對錯誤處理有一些疑問。 如果我理解正確,那么這將被視為“熱點觀察”,即無論是否有訂閱,事件都會發生(onUpdate是我無法控制的遠程服務器使用的回調)。
我選擇不在此處調用onError,因為我不希望可觀察對象在發生單個異常的情況下停止發出事件。 是否有更好的模式可以使用? .retry()浮現在腦海中,但是我不確定對於可觀察的熱點是否有意義?
另外,在創建訂閱時但在調用第一個onNext之前,可觀察對象如何表示? 它只是一個Observable.empty()
1)您的觀察對象不熱 。 區別因素是多個訂戶是否共享同一訂戶。 Observable.create()
為每個訂閱者調用訂閱函數,即為cold 。
容易使它變熱 。 只需添加share()
運算符。 它將與第一個訂閱者訂閱,最后一個訂閱者取消訂閱。 不要忘記通過以下方式實現退訂功能:
event.setCancellable(() -> listeners.remove(...));
2)錯誤可能是可恢復的,而不能恢復 。
如果您認為錯誤是可以自我恢復的(不需要采取任何措施),則不應調用onError
因為這會殺死可觀察的錯誤(不會再發出其他事件)。 您可以通過發出帶有錯誤詳細信息的特殊Volume
消息來通知您的訂戶。
如果錯誤是致命的,例如您未能添加偵聽器,則可能沒有其他消息,您不應默默地忽略它。 發出onError
因為您的可觀察項仍然無法正常工作。
如果錯誤需要您采取措施(通常是重試或超時重試),則可以添加retryXxx()
運算符之一。 在create()
但在 share()
之前執行此操作。
3)可以Observable
是帶有subscribe()
方法的對象。 如何精確表示取決於您使用它創建的方法。 例如,請參見create()
源代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.