Advertisement
Guest User

Untitled

a guest
Apr 1st, 2020
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 2.42 KB | None | 0 0
  1. @Slf4j
  2. @Service
  3. @RequiredArgsConstructor
  4. public class FivePostApiTokenService {
  5.     private final static Duration TOKEN_UPDATE_THRESHOLD = Duration.ofMinutes(2);
  6.  
  7.     private final FivePostAuthApiClient fivePostAuthApiClient;
  8.     private final ObjectMapper objectMapper;
  9.  
  10.     private TokenHolder tokenHolder = new TokenHolder();
  11.     private Lock tokenUpdateLock = new ReentrantLock();
  12.  
  13.     public Mono<String> getToken() {
  14.         return Mono.defer(() -> {
  15.             //double check (first check)
  16.             if (needRequestNewToken()) {
  17.                 return updateToken()
  18.                         .subscribeOn(Schedulers.boundedElastic())
  19.                         .then(Mono.fromCallable(() -> tokenHolder.raw));
  20.             } else {
  21.                 return Mono.just(tokenHolder.raw);
  22.             }
  23.         });
  24.     }
  25.  
  26.     private boolean needRequestNewToken() {
  27.         return tokenHolder.isNotInitialized() || tokenExpired();
  28.     }
  29.  
  30.     private boolean tokenExpired() {
  31.         return tokenHolder
  32.                 .expiresAt
  33.                 .minus(TOKEN_UPDATE_THRESHOLD)
  34.                 .isBefore(Instant.now());
  35.     }
  36.  
  37.     private Mono<Void> updateToken() {
  38.         return Mono.defer(() -> {
  39.             tokenUpdateLock.lock();
  40.  
  41.             try {
  42.                 //double check (second check)
  43.                 if (needRequestNewToken()) {
  44.  
  45.                     //noinspection BlockingMethodInNonBlockingContext
  46.                     fivePostAuthApiClient.requestToken()
  47.                             .doOnSuccess(tokenHolder::update)
  48.                             .then()
  49.                             .block();
  50.                 }
  51.  
  52.                 return Mono.empty();
  53.             } finally {
  54.                 tokenUpdateLock.unlock();
  55.             }
  56.         });
  57.     }
  58.  
  59.     private class TokenHolder {
  60.         private volatile String raw = "";
  61.         private volatile Instant expiresAt = Instant.MIN;
  62.  
  63.         boolean isNotInitialized() {
  64.             return raw.isBlank();
  65.         }
  66.  
  67.         void update(FivePostCredentials tokenResponse) {
  68.             FivePostJwtToken tokenBody = JwtTokenParser.getBody(tokenResponse.getJwt(), FivePostJwtToken.class, objectMapper);
  69.  
  70.             if (tokenBody != null) {
  71.                 expiresAt = tokenBody.getExpiresAt();
  72.                 raw = tokenResponse.getJwt();
  73.             } else {
  74.                 log.error("Token update failed");
  75.             }
  76.         }
  77.     }
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement