@@ Cacheble和@Scheduled在Spring Boot应用程序中同时启动

问题描述 投票:1回答:1

前言:我正在工作的产品(一堆Spring Boot应用程序)中的要求是使用JWT令牌来提高安全性,该令牌是从内部服务器获取的,并用于通过REST调用在服务之间进行通信。

问题: JWT令牌TTL精确到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
    }
}

调度部分无法正常运行。问题是,当特定userId的某些JWT票证进入缓存jwtToken时,如何启动调度程序的计时器。我完全愿意接受上述JWTUtility类的重构/重写逻辑。

java spring-boot caching jwt scheduling
1个回答
1
投票
正如@ThomasKå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")

© www.soinside.com 2019 - 2024. All rights reserved.