RxJava + GRPC从错误中恢复并重试请求

时间:2018-05-24 01:31:11

标签: android rx-java grpc grpc-java

我尝试使用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 重试 。 做这样的事情最优雅的方式是什么?

1 个答案:

答案 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