【问题标题】:Infinispan - create custom cache storeInfinispan - 创建自定义缓存存储
【发布时间】:2015-07-16 11:37:53
【问题描述】:

由于 Infinispan 不再维护官方的 cassandra 缓存存储,我正在尝试自己制作一个(适用于 Infinispan 7.1.1)。

我不确定我应该实现什么,因为我在文档中没有找到有关创建自定义缓存存储的任何内容。

这些是我拥有的类(灵感来自最新版本的 infinispan-cachestore-mongodb - 自 Infinispan 6.0.0 起也已弃用:D):

public class CassandraCache<K, V> {

    private Cluster cluster;
    private Session session;
    ...
}

public class CassandraEntry<K, V>

public class CassandraStore<K, V> implements AdvancedLoadWriteStore<K, V> {
    private InitializationContext context;
    private CassandraCache<K, V> cache;
    private CassandraStoreConfiguration configuration;

    @Override
    public void init(InitializationContext ctx) {
        context = ctx;
        configuration = ctx.getConfiguration();
        try {
            cache = new CassandraCache<K, V>(configuration);
        } catch (Exception e) {
            throw new PersistenceException(e);
        }
    }
    ...
}

public class CassandraStoreConfiguration extends AbstractStoreConfiguration {

  private String hosts;
  private String keyspace;
...
}

public class CassandraStoreConfigurationBuilder extends AbstractStoreConfigurationBuilder<CassandraStoreConfiguration, CassandraStoreConfigurationBuilder> {

  private String hosts;
  private String keyspace;
...
}

我正在尝试这样设置(在 scala 中):

object Infinispan {

  val m: EmbeddedCacheManager = new DefaultCacheManager(globalConfig, cacheConfig)  

  def globalConfig = {
    new GlobalConfigurationBuilder()
      .transport()
    .defaultTransport()
      .build()
  }

  def cacheConfig = {
    new ConfigurationBuilder()
    .persistence().addStore(classOf[CassandraStoreConfigurationBuilder])
      .fetchPersistentState(true)
      .preload(true)
      .shared(true)
      .hosts("localhost:9160")
      .keyspace("mykeyspace")
    .transaction()
      .transactionMode(TransactionMode.TRANSACTIONAL)
      .transactionManagerLookup(new GenericTransactionManagerLookup)
      .autoCommit(false).transactionProtocol(TransactionProtocol.DEFAULT)
      .lockingMode(LockingMode.PESSIMISTIC)
    .build()
  }

}

但我得到一个例外:

 java.lang.ClassCastException: org.infinispan.persistence.cassandra.configuration.CassandraStoreConfiguration cannot be cast to org.infinispan.configuration.cache.CustomStoreConfiguration

所以我改变了 CassandraStoreConfiguration 来扩展 CustomStoreConfiguration 和 CassandraStoreConfigurationBuilder 来扩展 CustomStoreConfigurationBuilder

现在我得到了这个异常:

 java.lang.ClassCastException: org.infinispan.configuration.cache.CustomStoreConfiguration cannot be cast to org.infinispan.persistence.cassandra.configuration.CassandraStoreConfiguration

为什么它会尝试将 CustomStoreConfiguration 强制转换为 CassandraStoreConfiguration?

是否有在某处创建自定义缓存存储的体面指南?

【问题讨论】:

标签: cassandra infinispan


【解决方案1】:

我坚信我们全新的 Infinispan 自定义缓存存储原型可以真正帮助您完成工作。

请查看:https://github.com/infinispan/infinispan-cachestore-archetype

README 文件包含如何使用它的必要信息。

【讨论】:

  • 我实现了外部存储,我得到了完全相同的错误消息。这让我觉得也许我配置错了。您能给我一个示例,如何配置使用您的原型创建的自定义缓存存储?我这样做是这样的: new ConfigurationBuilder() .persistence().addStore(classOf[CustomStoreConfigurationBuilder])
【解决方案2】:

我只是遗漏了几个注释:

@BuiltBy(CassandraStoreConfigurationBuilder.class)
@ConfigurationFor(CassandraStore.class)
public class CassandraStoreConfiguration extends AbstractStoreConfiguration

@ConfiguredBy(CassandraStoreConfiguration.class)
public class CassandraStore<K, V> implements AdvancedLoadWriteStore<K, V>

添加这些后,一切都开始正常工作了。

【讨论】:

  • 感谢您的信息!我已经发送了一个拉取请求并对此进行了修复。
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 2014-05-09
  • 2021-10-23
  • 2017-01-13
  • 2015-04-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
相关资源
最近更新 更多