簡體   English   中英

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM