@Cacheble и @Scheduled запускаются одновременно в приложении загрузки Spring - PullRequest
0 голосов
/ 25 мая 2020

Предисловие: Требование к продукту (куча весенних загрузочных приложений), над которым я работаю, состоит в том, чтобы использовать токены JWT для обеспечения безопасности, полученные с внутреннего сервера, и использовать их для связи между службами через Вызовы REST.

Проблема: Время жизни токена JWT составляет точно 2 часа, поэтому я попытался поместить его в кеш, чтобы для заданного userId я не получил новый токен JWT с сервера до истечения срока его действия. Эта часть работает, проблема заключалась в том, чтобы удалить кеш, когда истечет TTL.

Код выглядит следующим образом.

import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.scheduling.annotation.Scheduled;

public class JWTUtility {

    // Some Fake JWT Ticket
    private static final String FAKE_JWT_TICKET = "";

    @Cacheable(value = "jwtToken", key = "#userId", condition = "#userId != null")
    public String getToken(boolean securityEnabled, String userId) {
        if (!securityEnabled) {
            return FAKE_JWT_TICKET;
        } else {
            // Proper logic to fetch and return the JWT token from Server
            // Assume this works
        }
    }

    // JWT Ticket TTL is 2 Hrs, scheduling cache evict at 1:50 Hrs
    @Scheduled(fixedRate = 6600000)
    @CacheEvict(value = "jwtToken", allEntries = true)
    public void evictJWTTicketValues() {
        //Intentionally left blank
    }
}

Часть планирования не работает, как я ожидал. Вопрос в том, как запустить таймер планировщика, когда какой-то билет JWT для определенного userId попадает в кэш jwtToken. Я открыт для рефакторинга / переписывания logi c для вышеуказанного класса JWTUtility полностью.

1 Ответ

0 голосов
/ 25 мая 2020

Как указал @Thomas Kåsene - если вы можете использовать другого поставщика кеша, вы можете установить политику выселения при настройке кеша. Ниже приведен пример настройки Caffeine Cache :

@Bean
  public CaffeineCache jwtTokenCache() {
    return new CaffeineCache(
        "jwtTokenCache",
        Caffeine.newBuilder().expireAfterWrite(120, TimeUnit.MINUTES).recordStats().build());
  }

Вам необходимо объявить аннотировать свой метод как -

@Cacheable(cacheNames = "jwtTokenCache", value = "jwtToken", key = "#userId", condition = "#userId != null")
...