2015-05-06 112 views
0

由於Infinispan不再維護官方cassandra緩存存儲,因此我正在嘗試自己製作一個(用於Infinispan 7.1.1)。Infinispan - 創建自定義緩存存儲

我不知道我應該實現什麼,因爲我沒有在有關創建自定義緩存存儲的文檔中找到任何內容。

這是我所(由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; 
... 
} 

我試圖將其設置像這樣(在斯卡拉):

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?

有沒有一個體面的指南來創建一個自定義緩存存儲的地方?

+0

根據我的愚見,你最好把[現有的卡桑德拉商店](https://github.com/infinispan/infinispan-cachestore-cassandra)並使其更新。在Infinispan主倉庫中有大量的緩存存儲實現(https://github.com/infinispan/infinispan/tree/master/persistence)來指導你,這些保證是最新的。 –

回答

3

我只是缺少了幾個註解:

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

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

一旦將它們加入,一切都開始工作了就好了。

+0

謝謝你的信息!我已經發送了拉取請求並提供了相應的解決方法。 – tsykora

4

我堅信我們全新的Infinispan自定義緩存存儲原型可以真正幫助您完成您的工作。

請檢查出來:https://github.com/infinispan/infinispan-cachestore-archetype

自述文件中包含必要的信息,如何使用它。

+0

我實現了外部存儲,我得到了完全相同的錯誤信息。這使我想到,也許我配置錯了。你能給我一個例子,說明如何配置一個用你的原型創建的自定義緩存存儲?我是這樣做的:new ConfigurationBuilder() .persistence()。addStore(classOf [CustomStoreConfigurationBuilder]) – siltalau