0

在应用程序启动时,我尝试创建这样的缓存:

我用来创建缓存的代码如下:

 final Configuration entityConfiguration = myCacheManager.getCacheConfiguration( "entity" );
 Objects.requireNonNull( entityConfiguration );
 myCacheManager.createCache( "XXXX", entityConfiguration );

这会导致以下异常:

org.infinispan.commons.CacheConfigurationException: ISPN000373: Attempted to start a cache using configuration template 'XXXX'
    at org.infinispan.manager.DefaultCacheManager.wireAndStartCache(DefaultCacheManager.java:616)
    at org.infinispan.manager.DefaultCacheManager.createCache(DefaultCacheManager.java:589)
    at org.infinispan.manager.DefaultCacheManager.internalGetCache(DefaultCacheManager.java:475)
    at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:461)
    at org.infinispan.manager.DefaultCacheManager.getCache(DefaultCacheManager.java:447)
    at org.infinispan.manager.DefaultCacheManager.createCache(DefaultCacheManager.java:413)

我理解这个例外意味着我不能有一个与缓存模板同名的缓存。

我查看了org.infinispan.manager.DefaultCacheManager(版本 9.2.5.Final)并找到了这个实现:

    @Override
    public <K, V> Cache<K, V> createCache(String name, Configuration configuration) {
      defineConfiguration(name, configuration);
      return getCache(name);
    }

这定义了一个带有传入名称的配置。在这种情况下"XXXX",然后继续尝试创建一个具有完全相同名称的缓存。

在调用getCache(name)it 时调用wireAndStartCachewhich 检查配置是否与缓存名称相同。总是这样,因为前面的代码传递了完全相同的字符串。我不明白这种方法怎么可能奏效。

如何避免此错误并创建缓存?

4

1 回答 1

1

我上面发布的代码的问题是getCacheConfiguration( "entity" );返回一个模板。因此,您可以通过使用构建器有效地克隆它但不设置模板标志来使其工作。

final Configuration entityTemplate = myCacheManager.getCacheConfiguration( "entity" );
Objects.requireNonNull( entityTemplate  );
final ConfigurationBuilder builder = new ConfigurationBuilder();
builder.read( entityTemplate );
builder.template( false );
myCacheManager.createCache( "XXXX", builder.build() );
于 2020-07-16T01:40:56.340 回答