我有一个 Spring Boot 应用程序,其中有以下 Caffeine 实现来帮助我缓存一些令牌:
CacheConfig.java
@Configuration
@EnableCaching
@Profile("!test")
public class CacheConfig {
private static final Logger logger = LoggerFactory.getLogger(CacheConfig.class);
@Bean
public Caffeine<Object, Object> caffeineConfig() {
return Caffeine.newBuilder()
.maximumSize(15)
.expireAfterWrite(60, TimeUnit.SECONDS)
.initialCapacity(10);
}
@Bean
public CacheManager cacheManager(Caffeine caffeine) {
logger.info("Initializing Caffeine Cache");
CaffeineCacheManager caffeineCacheManager = new CaffeineCacheManager("TokenCache");
caffeineCacheManager.setCaffeine(caffeine);
return caffeineCacheManager;
}
MainApplication.java:
@SpringBootApplication
@EnableCaching
public class InstanceServiceApplication {
public static void main(String[] args) {
SpringApplication.run(InstanceServiceApplication.class, args).start();
}
}
我正在使用 @Cacheable 注释来尝试缓存令牌:
@Service
public class CloningInstanceService {
@Cacheable(value = "TokenCache", key="{#user}") // Specify the cache and key name
public String getSwiftStackTokenCache(String user) {
String swiftStackPwd = vaultUtil.getSecret(ApplicationContext.SWIFT_STACK_PWD);
String url = SWIFT_STACK_URI + "auth/v1.0";
HttpResponse<String> response =
Unirest.get(url).header("x-auth-user", user).header("x-auth-key", swiftStackPwd).asString();
Headers responseHeaders = response.getHeaders();
String authToken = responseHeaders.getFirst("X-Auth-Token");
logger.info("authTokenCache: {}", authToken);
return authToken;
}
}
我尝试将以下内容添加到 application.yaml 文件中:
spring:
cache:
type: caffeine
我还尝试在@Cacheable注释中使用key =“user”,但这没有帮助。 我在调用令牌后记录缓存,但里面什么也没有。我可以判断缓存不起作用的另一种方法是,我在后续调用中获得一个新令牌,而我应该获得相同的令牌。
CaffeineCache caffeineCache = (CaffeineCache) cacheManager.getCache("TokenCache");
Cache<Object, Object> nativeCache = caffeineCache.getNativeCache();
for (Map.Entry<Object, Object> entry : nativeCache.asMap().entrySet()) {
logger.info("key: " + entry.getKey());
logger.info("value: " + entry.getValue());
}
我可能做错了什么?我参考了多个网站来实现这一点,我正在做与网站中相同的事情。
问题是我从定义它的同一个类中调用 @Cacheable 函数。将缓存功能移至单独的文件中,使其正常工作:
@Service
public class CacheService {
@Cacheable(value = "TokenCache") // Specify the cache name
public String getSwiftStackTokenCache(String user) {
String swiftStackPwd = vaultUtil.getSecret(ApplicationContext.SWIFT_STACK_PWD);
String url = SWIFT_STACK_URI + "auth/v1.0";
HttpResponse<String> response =
Unirest.get(url).header("x-auth-user", user).header("x-auth-key", swiftStackPwd).asString();
Headers responseHeaders = response.getHeaders();
String authToken = responseHeaders.getFirst("X-Auth-Token");
logger.info("authTokenCache: {}", authToken);
return authToken;
}
}
然后从我的其他服务中调用上述函数:
String ssaToken = cacheService.getSsaToken(ssaWorkflowClientId);