RxJava + GRPC восстанавливается после ошибок и повторных запросов - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь восстановить ошибки, используя 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 retrywhen .Какой самый элегантный способ сделать что-то подобное?

1 Ответ

0 голосов
/ 24 мая 2018

Устранение ошибок в цепочке наблюдателей требует небольшого танца и ни в коем случае не элегантно.Однако он может содержаться в цепочке наблюдателей.

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(), чтобы не повторить попытку сразу.Вместо just() вы можете вернуть Observable, который выбирает новый токен API.

...