Reputation: 5122
I have a logic that I have to run after fetching some data from other services. How do I handle failure of one or all of them?
I wish to log an error and not throw exceptions
// Step 1
Observable<Provider> providerObservable =
providerService
.getProvider(data)
.toObservable()
.onErrorResumeNext(e -> Observable.error(e.getCause()));
// Step 2
Single<Profile> profileObservable =
profileService
.getProfile(data)
.onErrorResumeNext(e -> Single.error(e.getCause()));
Observable<ExtendedProfile> extendedProfileObservable =
profileObservable
.flatMap(this::getExtendedProfile)
.toObservable()
.onErrorResumeNext(e -> Observable.error(e.getCause()));
// Combine
Observable.combineLatest(providerObservable, extendedProfileObservable, this::handleProviderAndProfile)
.doOnError(throwable -> logError(throwable))
.onErrorResumeNext(throwable -> Observable.empty())
.subscribe();
This gets me stuck. Nothing is written to log.
Upvotes: 0
Views: 754
Reputation: 3723
Observable.combineLatest(
providerObservable,
extendedProfileObservable,
handleProviderAndProfile,
(providerObservable, extendedProfileObservable, handleProviderAndProfile) -> operationFunction(providerObservable, extendedProfileObservable, handleProviderAndProfile)
)
.doOnError(throwable -> logError(throwable))
.onErrorResumeNext(throwable -> Observable.empty())
.subscribe();
You can try something like above. providerObservable
, extendedProfileObservable
and handleProviderAndProfile
are input for combineLatest
and (providerObservable, extendedProfileObservable, handleProviderAndProfile) -> operationFunction(providerObservable, extendedProfileObservable, handleProviderAndProfile)
is providing result to lambda. This should be the operation performed on all three inputs.
Upvotes: 3