我想使用 JCache API (JSR107, javax.cache) 使用 Apache Ignite 配置分布式缓存。这可能吗?
我发现的示例要么使用 JCache API 创建本地缓存,要么使用 Apache Ignite API 创建分布式缓存(或数据网格)。
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 配置文件。在那里可以提供发现、通信和其他参数。
请注意,在通过 CacheManager 配置创建 Grid 方面,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 个服务实例应该能够通过所需的端口相互通信。有关更多详细信息,请参阅Apache Ignite - 数据网格。
希望这可以帮助。