У меня есть приложение, которое аутентифицируется с использованием OAuth2 и извлекает данные из службы RESTful с помощью Retrofit. Теперь у меня есть токен, поиск и обновление. Маркер обновляется как так (планировщики опущены):RxJava: Как обновить токен при одновременном отправке нескольких запросов?
// Each Retrofit call observable is "wrapper" using this method
protected <T> Observable<T> wrap(@NonNull final Observable<T> page) {
return authenticate()
.concatMap(token -> page)
.onErrorResumeNext(throwable -> {
Log.w(TAG, "wrap: ErrorResumeNext", throwable);
return refreshAccessToken()
.flatMap(accessToken -> page);
}));
}
// Retrieves the access token if necessary
Observable<AccessToken> authenticate() {
// Already have token
if(accessToken != null) return Observable.just(accessToken);
// No token yet, fetch it
return api.getAccessToken(...);
}
// Refreshes the token
Observable<AccessToken> refreshAccessToken() {
return api.refreshToken(...);
}
Это работает, но в некоторых случаях множественные запросы посылаются одновременно, и они оба вызов освежающего процесса - в основном мое приложение заканчивает освежающий маркер, как многий в то время как на данный момент были запросы.
Итак, вопрос в следующем: как я могу гарантировать, что, когда токен необходимо обновить, он выполняется только один раз, независимо от того, сколько текущих запросов требует обновления токена? Могу ли я каким-либо образом заставить другие запросы «ждать» до тех пор, пока первый запрос не будет успешно вызван и не получит новый токен?
Это похоже на трюк! У меня было это в какой-то момент, но тогда это не сработало. У меня, вероятно, было что-то еще неправильное, потому что теперь оно работает так, как предполагалось. – manabreak
Не могли бы вы написать пример кода для этой темы? –