【问题标题】:There is any possibility to use "cacheResolver" with hazelcast有可能将“cacheResolver”与 hazelcast 一起使用
【发布时间】:2020-09-02 10:37:48
【问题描述】:

我正在使用 spring 缓存和 hazelcast,我只是想将响应保存到我的控制器:

@Bean
@Override
public CacheManager cacheManager() {
    return new HazelcastCacheManager(hazelcastInstance);
}

//creating hazelcast cache config.
@Bean
public HazelcastClientCacheManager hazelcastClientCacheManager() {
    CachingProvider provider = 
    HazelcastClientCachingProvider.createCachingProvider(hazelcastInstance);
    HazelcastClientCacheManager cacheManager = (HazelcastClientCacheManager) provider.getCacheManager();
    cacheManager.getHazelcastInstance().getConfig().getSerializationConfig().getByteOrder();

    Duration oneHours = Duration.ONE_MINUTE;
    MutableConfiguration<Object, Object> configuration = new MutableConfiguration<>();
    configuration.setTypes(Object.class, Object.class)
        .setExpiryPolicyFactory(AccessedExpiryPolicy.factoryOf(oneHours))
        .setStatisticsEnabled(true);
    cacheManager.createCache("mycache", configuration);*

    return cacheManager;
}

//My CacheResolver 
@Bean
@Override
public CacheResolver cacheResolver() {
    return new CustomCacheResolver(cacheManager());
}

有问题,在我的 CacheResolver.class 中:

public class CustomCacheResolver implements CacheResolver {
    private final CacheManager cacheManager;

    @Override
    public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
        Collection<Cache> caches = new ArrayList<>();
        caches.add(cacheManager.getCache("mycache"));
        return caches;
    }

发件人:

@Cacheable(cacheResolver = "cacheResolver", key = "#uuid+", 
    unless="#result.size() == 0")
myMethod(String uuid){}

问题:CustomCacheResolver中的resolveCaches必须返回Cache集合,但是我在hazelcast中创建的缓存是ICache。

有什么想法吗?我需要使用该缓存及其配置、ttl 等。 提前致谢!

Java 11。 弹簧靴 弹簧缓存。 榛树。

【问题讨论】:

  • 从我看到的HazelcastCacheManager#getCache(String name) 返回Cache(不是ICache)。所以应该没问题。你能澄清一下这个问题吗? github.com/hazelcast/hazelcast/blob/master/hazelcast-spring/src/…
  • 是的,我的错!解决方案是使用 import com.hazelcast.spring.cache.HazelcastCacheManager;并创建一个 CacheManager concurrentMapCacheManager 类型的 bean。谢谢!很多!

标签: hazelcast spring-cache jcache


【解决方案1】:

解决方案是使用: 导入 com.hazelcast.spring.cache.HazelcastCacheManager

类似这样的:

  @Bean
  @Override
  public CacheManager cacheManager() {
    return new HazelcastCacheManager(hazelcastInstance);
  }

  @Bean
  @Override
  public CacheResolver cacheResolver() {
    return new CustomCacheResolver(concurrentMapCacheManager());
  }

  @Bean
  public CacheManager concurrentMapCacheManager() {
    return new ConcurrentMapCacheManager() {
      protected Cache createConcurrentMapCache(final String name) {
          return new ConcurrentMapCache(name,
              CacheBuilder.newBuilder().expireAfterWrite(ttl, TimeUnit.SECONDS).build().asMap(), false);
      }
    };
  }

创建您的 CustomCacheResolver.class 扩展 CacheResolver,这就足够了。

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 2017-01-01
    • 2016-10-23
    • 1970-01-01
    • 2012-12-30
    • 2023-03-03
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多