2015-04-27 34 views
6

Observers için yeni bir tür ve hala bunları çözmeye çalışıyorum.Gözlemlenebilirler doOnError doğru konum

observableKafka.getRealTimeEvents() 
     .filter(this::isTrackedAccount) 
     .filter(e -> LedgerMapper.isDepositOrClosedTrade((Transaction) e.getPayload())) 
     .map(ledgerMapper::mapLedgerTransaction) 
     .map(offerCache::addTransaction) 
     .filter(offer -> offer != null) // Offer may have been removed from cache since last check 
     .filter(Offer::isReady) 
     .doOnError(throwable -> { 
       LOG.info("Exception thrown on realtime events"); 
      }) 
     .forEach(awardChecker::awardFailOrIgnore); 

getRealTimeEvents() bir Observable<Event> verir: Ben aşağıdaki kod parçası var.

.doOnError'in pozisyonu var mı? Ayrıca, bu kod parçasına birden fazla çağrı eklemenin etkisi nedir? Yapabileceğimi fark ettim ve hepsi de uyarıldı, ama amacının ne olabileceğinden emin değilim.

cevap

13

Evet, öyle. doOnError, belirli bir noktada akış boyunca bir hata geçtiğinde hareket eder, böylece doOnError (ler) den önceki operatör (ler) atarsanız, eyleminiz çağrılır. Bununla birlikte, doOnError'u daha ileride yerleştirirseniz, aşağı akış operatörleri zincirde ne olduğuna bağlı olarak çağrılabilir veya olmayabilir.

Verilen

Observer<Object> ignore = new Observer<Object>() { 
    @Override public void onCompleted() { 
    } 
    @Override public void onError(Throwable e) { 
    } 
    @Override public void onNext(Object t) { 
    } 
}; 

Örneğin, aşağıdaki kod, her zaman doOnError arayacak:

Observable.<Object>error(new Exception()).doOnError(e -> log(e)).subscribe(ignore); 

Ancak bu kod olmaz:

Observable.just(1).doOnError(e -> log(e)) 
.flatMap(v -> Observable.<Integer>error(new Exception())).subscribe(ignore); 

Çoğu operatör geri sıçrama olacak alt akıştan kaynaklanan istisnalar.

Observable.<Object>error(new RuntimeException()) 
.doOnError(e -> log(e)) 
.onErrorResumeNext(Observable.<Object>error(new IllegalStateException())) 
.doOnError(e -> log(e)).subscribe(ignore); 

aksi takdirde, zincirin birden fazla yerde aynı durum oturum istiyorum: Eğer onErrorResumeNext veya onExceptionResumeNext aracılığıyla bir istisna dönüşümü eğer

ekleme multipe doOnError geçerli olduğunu.

+0

'onErrorResumeNext()' de açıklama eklediğiniz için teşekkürler. Çok kullanışlı olacak. – Tavo

2

doOn??? yöntemler gerçekten değil işleme çekirdek işletme değeri diyelim olduğunu yan etkiler için vardır. Günlüğe kaydetme bunun için mükemmel bir kullanımdır. Bu, bazen bir hata ile daha anlamlı bir şey yapmak istersiniz, yeniden denemek veya bir kullanıcıya bir mesaj görüntülemek gibi, vb ... Bu durumlarda, "rx" yolu, bir subscribe çağrısı hata işlemek için olurdu .

doOnError (ve diğer doOn yöntemleri) (tabii ki, onun onError yöntem civarında) yeni bir özgün Observable sarar ve buna davranışı ekler. Bu yüzden bunu birçok kez arayabilirsiniz. Ayrıca zincirin herhangi bir yerinde diyoruz edememek biri yararı yeniden deneme zincirinde aşağı var çünkü ...

örneğin aksi akışı ( Subscriber) tüketiciye gizli olacak hataları erişebilmenizdir
+0

Üzgünüm Simon, çoklu 'doOnError' yararı hakkında açıklama aldığımdan emin değilim. Bunu biraz daha detaylandırır mısınız? – Tavo

+0

Güzel cevap! Teşekkürler –