Selaron
Selaron

Reputation: 6184

How to configure a clustered JCache using Ehcache 3

When creating a clustered Cache following the Ehcache documentation, I get a PersistentCacheManager implementing org.ehcache.CacheManager but not javax.cache.CacheManager which is what I need in my Spring 6 application.

On Ehcache JSR107-Documentation I see no explicit hint regarding clustering.

How do I get a javax.cache.CacheManager supporting clustering Capabilities?

This is the example code for configuring clustered cacheManagers linked above:

CacheManagerBuilder<PersistentCacheManager> clusteredCacheManagerBuilder =
    CacheManagerBuilder.newCacheManagerBuilder() 
        .with(ClusteringServiceConfigurationBuilder.cluster(URI.create("terracotta://localhost/my-application")) 
            .autoCreateOnReconnect(c -> c)); 
PersistentCacheManager cacheManager = clusteredCacheManagerBuilder.build(true); 

Upvotes: 0

Views: 356

Answers (1)

Selaron
Selaron

Reputation: 6184

Yes it is not explicitly mentioned how to configure a clustered JCache CacheManager on JSR107 documentation, but you can find how to integrate Ehcache-Configuration with JCache Configuration there.

This is my working solution:

import javax.cache.CacheManager;
import javax.cache.Caching;
import javax.cache.spi.CachingProvider;
import org.ehcache.clustered.client.config.ClusteringServiceConfiguration;
import org.ehcache.clustered.client.config.builders.ClusteringServiceConfigurationBuilder;
import org.ehcache.config.CacheConfiguration;
import org.ehcache.core.config.DefaultConfiguration;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.jsr107.EhcacheCachingProvider;

// ...

CachingProvider cachingProvider = Caching.getCachingProvider();
EhcacheCachingProvider ehcacheProvider = (EhcacheCachingProvider) cachingProvider;

ClusteringServiceConfigurationBuilder clusteringServiceConfigurationBuilder = ClusteringServiceConfigurationBuilder
        .cluster(URI.create("terracotta://localhost/my-application"))
        .autoCreateOnReconnect(server -> server.defaultServerResource("offheap-1"));

ClusteringServiceConfiguration clusteringServiceConfiguration = clusteringServiceConfigurationBuilder.build();

DefaultConfiguration defaultConfiguration = new DefaultConfiguration(ehcacheProvider.getDefaultClassLoader(),
        clusteringServiceConfiguration);

cacheManager = ehcacheProvider.getCacheManager(cachingProvider.getDefaultURI(), defaultConfiguration);

Upvotes: 0

Related Questions