Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @Slf4j
- @Service
- @RequiredArgsConstructor
- public class FivePostApiTokenService {
- private final static Duration TOKEN_UPDATE_THRESHOLD = Duration.ofMinutes(2);
- private final FivePostAuthApiClient fivePostAuthApiClient;
- private final ObjectMapper objectMapper;
- private TokenHolder tokenHolder = new TokenHolder();
- private Lock tokenUpdateLock = new ReentrantLock();
- public Mono<String> getToken() {
- return Mono.defer(() -> {
- //double check (first check)
- if (needRequestNewToken()) {
- return updateToken()
- .subscribeOn(Schedulers.boundedElastic())
- .then(Mono.fromCallable(() -> tokenHolder.raw));
- } else {
- return Mono.just(tokenHolder.raw);
- }
- });
- }
- private boolean needRequestNewToken() {
- return tokenHolder.isNotInitialized() || tokenExpired();
- }
- private boolean tokenExpired() {
- return tokenHolder
- .expiresAt
- .minus(TOKEN_UPDATE_THRESHOLD)
- .isBefore(Instant.now());
- }
- private Mono<Void> updateToken() {
- return Mono.defer(() -> {
- tokenUpdateLock.lock();
- try {
- //double check (second check)
- if (needRequestNewToken()) {
- //noinspection BlockingMethodInNonBlockingContext
- fivePostAuthApiClient.requestToken()
- .doOnSuccess(tokenHolder::update)
- .then()
- .block();
- }
- return Mono.empty();
- } finally {
- tokenUpdateLock.unlock();
- }
- });
- }
- private class TokenHolder {
- private volatile String raw = "";
- private volatile Instant expiresAt = Instant.MIN;
- boolean isNotInitialized() {
- return raw.isBlank();
- }
- void update(FivePostCredentials tokenResponse) {
- FivePostJwtToken tokenBody = JwtTokenParser.getBody(tokenResponse.getJwt(), FivePostJwtToken.class, objectMapper);
- if (tokenBody != null) {
- expiresAt = tokenBody.getExpiresAt();
- raw = tokenResponse.getJwt();
- } else {
- log.error("Token update failed");
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement