首页 > 解决方案 > 如果在类中添加手动 CacheManager,Hazelcast 缓存不起作用

问题描述

Hazelcast 配置在 spring boot 中(嵌入式 hazelcast 一个)

@Bean
CacheManager hazelcastCacheManager() {
    return new HazelcastCacheManager(Hazelcast.newHazelcastInstance());
}

@Bean
public Config hazelCastConfig() {

    Config cacheConfig = new Config().setInstanceName("cache-instance");

    MapConfig userCache = new MapConfig().setName("users")
            .setMaxSizeConfig(new MaxSizeConfig(500, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
            .setTimeToLiveSeconds(12);
    cacheConfig.addMapConfig(userCache);

}

当我在服务层使用 @Cacheable 时,它​​工作正常(它在 12 秒后从缓存中删除密钥)

@Cacheable(key = "#name", value = "users")

但是,一旦我将 CacheManager 添加到同一个服务类。这个缓存值永远不会被删除(超过一个)。我的最终要求是使用缓存管理器来获取缓存并检查该值是否存在。(在第二次尝试后阻止用户并在 12 秒后允许。因此,缓存会将其存储 12 秒,我可以检查是否不在缓存中,继续,否则通知等待)

import org.springframework.cache.CacheManager;

@Autowired
private CacheManager cacheManager;

@Override
public void doCachingOperation() throws InterruptedException {

    Cache userCache = cacheManager.getCache("users");
    System.out.println(CalendarUtils.getCurrentDate());
    userCache.put("Satish", 1);
    System.out.println(Integer.valueOf(userCache.get("Satish").get().toString()));

    Thread.sleep(2000);
    System.out.println("2 sec passed");
    System.out.println(Integer.valueOf(userCache.get("Satish").get().toString()));

    Thread.sleep(14000);
    System.out.println("16 sec passed");
    System.out.println(CalendarUtils.getCurrentDate());
    System.out.println(Integer.valueOf(userCache.get("Satish").get().toString()));

}

现在,这个值在 16 秒后仍然可用,而它应该在 12 秒后用键“Satish”删除。

标签: spring-boothazelcast

解决方案


而不是在没有任何配置的情况下创建新实例, Hazelcast.newHazelcastInstance()您应该自动连接HazelcastInstance,让 spring boot 使用hazelCastConfig()bean 创建实例。


@Autowired
private HazelcastInstance hazelcastInstance;

@Bean
CacheManager hazelcastCacheManager() {
    return new HazelcastCacheManager(hazelcastInstance);
}

@Bean
public Config hazelCastConfig() {

    Config cacheConfig = new Config().setInstanceName("cache-instance");

    MapConfig userCache = new MapConfig().setName("users")
            .setMaxSizeConfig(new MaxSizeConfig(500, MaxSizeConfig.MaxSizePolicy.FREE_HEAP_SIZE))
            .setTimeToLiveSeconds(12);
    cacheConfig.addMapConfig(userCache);

}

推荐阅读