1

I'm using spring cache and hazelcast, I'm just trying to save the responses to my controller:

@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());
}

There is the problem, In my 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;
    }

From:

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

Problem: the resolveCaches in CustomCacheResolver must return Cache collection, but my cache created in hazelcast is ICache.

Any idea? I need to use that cache with its confifguration, ttl, etc. Thanks in advance.!

Java 11. Spring boot spring cache. hazelcast.

pczeus
  • 7,709
  • 4
  • 36
  • 51
Rrue
  • 31
  • 4
  • 1
    From what I see `HazelcastCacheManager#getCache(String name)` returns `Cache` (not `ICache`). So it should be fine. Could you clarify the issue? https://github.com/hazelcast/hazelcast/blob/master/hazelcast-spring/src/main/java/com/hazelcast/spring/cache/HazelcastCacheManager.java#L71 – Rafał Leszko May 18 '20 at 07:11
  • yes, my bad! the solution was using import com.hazelcast.spring.cache.HazelcastCacheManager; and creating a bean of type CacheManager concurrentMapCacheManager. Thanks! a lot! – Rrue May 20 '20 at 06:35

1 Answers1

0

The solution is using: import com.hazelcast.spring.cache.HazelcastCacheManager

Something like this:

  @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);
      }
    };
  }

And creating your CustomCacheResolver.class extends CacheResolver, that will be enough.

Rrue
  • 31
  • 4