我可以在Apache Ignite中使用JCache API进行分布式缓存吗?

时间:2016-01-26 15:31:15

标签: caching datagrid ignite jcache jsr107

我想使用JCache API(JSR107,javax.cache)使用Apache Ignite配置分布式缓存。这可能吗?

我找到的示例要么使用JCache API创建本地缓存,要么使用Apache Ignite API创建分布式缓存(或数据网格)。

2 个答案:

答案 0 :(得分:3)

JCache允许在创建缓存时提供特定于提供程序的配置。即,你可以这样做:

// Get or create a cache manager.
CacheManager cacheMgr = Caching.getCachingProvider().getCacheManager();

// This is an Ignite configuration object (org.apache.ignite.configuration.CacheConfiguration).
CacheConfiguration<Integer, String> cfg = new CacheConfiguration<>();

// Specify cache mode and/or any other Ignite-specific configuration properties.
cfg.setCacheMode(CacheMode.PARTITIONED);

// Create a cache based on configuration create above.
Cache<Integer, String> cache = cacheMgr.createCache("a", cfg);

另请注意,分区模式实际上是Ignite中的默认模式,因此您无需明确指定它。

UPD。此外,CachingProvider.getCacheManager(..)方法接受特定于提供者的URI,如果Ignite应指向XML配置文件。可以在那里提供发现,通信和其他参数。

答案 1 :(得分:1)

请注意,在通过CacheManager配置创建网格方面,JCache规范未指定适用于各个缓存提供程序的所有配置。创建CacheManager的要求是标准的,但并不是与管理器本身配置方式相关的所有内容。

以下代码将演示如何在SpringBoot中使用Apache Ignite创建网格

@Bean
@SuppressWarnings("unchecked")
public org.apache.ignite.cache.spring.SpringCacheManager cacheManager() {
    IgniteConfiguration igniteConfiguration = new IgniteConfiguration();
    igniteConfiguration.setGridName("petclinic-ignite-grid");
    //igniteConfiguration.setClassLoader(dynamicClassLoaderWrapper());

    igniteConfiguration.setCacheConfiguration(this.createDefaultCache("petclinic"),
            this.createDefaultCache("org.hibernate.cache.spi.UpdateTimestampsCache"),
            this.createDefaultCache("org.hibernate.cache.internal.StandardQueryCache"));

    SpringCacheManager springCacheManager = new SpringCacheManager();
    springCacheManager.setConfiguration(igniteConfiguration);
    springCacheManager.setDynamicCacheConfiguration(this.createDefaultCache(null));
    return springCacheManager;
}

private org.apache.ignite.configuration.CacheConfiguration createDefaultCache(String name) {

    org.apache.ignite.configuration.CacheConfiguration cacheConfiguration = new org.apache.ignite.configuration.CacheConfiguration();
    cacheConfiguration.setName(name);
    cacheConfiguration.setCacheMode(CacheMode.PARTITIONED);
    cacheConfiguration.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
    cacheConfiguration.setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC);
    cacheConfiguration.setStatisticsEnabled(true);
    cacheConfiguration.setEvictSynchronized(true);
    return cacheConfiguration;
 }
}

如果我们要创建此服务的另一个实例并将其注册到与igniteConfiguration.setGridName(“petclinic-ignite-grid”)相同的网格,则将创建IMDG。请注意,具有此版本的分区嵌入式分布式缓存的2个服务实例应该能够通过所需的PORTS相互通信。有关详细信息,请参阅Apache Ignite - Data Grid

希望这有帮助。