我尝试使用RxJava和GRPC从错误中恢复。这是我的观察结果:
Observable<Object> observable = Observable.fromCallable(() -> {
try {
Grpc.MyRequest request = Grpc.MyRequest.newBuilder()
.setToken(mToken)
.build();
Grpc.MyResponse reply = mStub.mytest(request);
return reply;
} catch (Exception e) {
///
}
}).cache();
这是订阅:
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnError(throwable -> {
})
.subscribe((result) -> {
MyResponse res = ((MyResponse) result);
if (res.getCode()!=0) {
//Check error code and try to refresh token and repeat this request after.
}
},throwable -> {
throwable.printStackTrace();
});
因此,当我从GRPC服务中收到错误时,根据错误代码,我想通过执行另一个请求尝试从中恢复,然后重复原始请求。我不确定如何使用RxJava 重试 。 做这样的事情最优雅的方式是什么?
答案 0 :(得分:0)
观察者链中的错误恢复确实需要一点点跳舞,并不是优雅的。但是,它可以包含在观察者链中。
boolean isRecoverable( Throwable t ) {
// this test can be as sophisticated as you want
if ( t instanceof StatusRuntimeException ) {
return true;
}
return false;
}
...
.retryWhen( throwableObservable ->
throwableObservable.flatMap( t -> isRecoverable( t )
? Observable.just("")
: Observable.error( t ) )
...
此方法允许您决定要对错误执行的操作。您可以添加just()
的延迟,以便您不会立即重试。您可以返回获取新API令牌的just()
,而不是Observable
。