每次API用无效的令牌错误(重新身份验证)响应时,我都试图重新验证令牌。我有一个小例子,它复制了我所面临的问题。基本上,第一个调用将抛出一个异常,这将触发重试,当它重试时,auth方法不会再次被完全调用(它不打印“”,而是打印“authing.”)。
public class Example {
AtomicInteger atom = new AtomicInteger(1);
public Example(){}
public void start(){
auth().andThen(call())
.retryWhen(throwableFlowable -> throwableFlowable.flatMap(throwable -> {
System.out.println("Retrying...\n");
return Flowable.timer(1, TimeUnit.SECONDS);
}))
.subscribe(integer -> System.out.println("Result: " + integer), e -> System.out.println("Error" + e.getMessage()));
}
public Completable auth(){
System.out.println("Entered Auth");
return Completable.create(emitter -> {
System.out.println("authing...");
emitter.onComplete();
});
}
public Single<String> call(){
return getId()
.flatMap(this::getNameById);
}
public Single<Integer> getId(){
return Single.create(emitter -> {
emitter.onSuccess(atom.getAndIncrement());
});
}
public Single<String> getNameById(int id){
return Single.create(emitter -> {
HashMap<Integer, String> hash = new HashMap<>();
hash.put(1, "s");
hash.put(2, "b");
if(id == 1){
emitter.onError(new Throwable());
}else{
emitter.onSuccess(hash.get(id));
}
});
}
}
同样,这是我的输出:
Entered Auth
authing...
Retrying...
authing...
Result: b
如何强制整个auth()方法在重试上运行?
发布于 2019-11-22 10:47:02
使用Completable.defer
,它将包装您的可完成的创建,并在重试时重做,而不只是重新订阅。
Completable.defer(() -> auth()).andThen(call())
.retryWhen(throwableFlowable -> throwableFlowable.flatMap(throwable -> {
System.out.println("Retrying...\n");
return Flowable.timer(1, TimeUnit.SECONDS);
}))
.subscribe(integer -> System.out.println("Result: " + integer), e -> System.out.println("Error" + e.getMessage()));
输出:
Entered Auth
authing...
Retrying...
Entered Auth
authing...
Result: b
https://stackoverflow.com/questions/58992043
复制相似问题