2016-08-29 7 views
0

ApacheのIgniteをキャッシュシステムとしても計算用にも導入しています。以下の設定クラスを使ってspringアプリケーションを設定しました。Springを使用したApache Igniteのmongo設定

@Override 
@Cacheable("cache1") 
public List<Channel> getAllChannels(){ 
    List<Channel> list = new ArrayList<Channel>(); 
    Channel c1 = new Channel("1",1); 
    Channel c2 = new Channel("2",2); 
    Channel c3 = new Channel("3",3); 
    Channel c4 = new Channel("4",4); 
    list.add(c1); 
    list.add(c2); 
    list.add(c3); 
    list.add(c4); 
    return list; 
} 

のようにそれを使用して

@Configuration 
@EnableCaching 
public class IgniteConfig { 

    @Value("${ignite.config.path}") 
    private String ignitePath; 

    @Bean(name="cacheManager") 
    public SpringCacheManager cacheManager(){ 
     SpringCacheManager springCacheManager = new SpringCacheManager(); 
     springCacheManager.setConfigurationPath(ignitePath); 
     return springCacheManager; 
    } 
} 

今私はライトスルーとリードスルー機能を追加したいです。私はmongoに点火を接続するためのドキュメントを見つけることができませんでした。

アイデアはdbと直接話すのではなく、ライトビハインド機能を使って着火させることです。 -----------------------

としては、私は

public class ChannelCacheStore extends CacheStoreAdapter<Long, Channel> implements Serializable { 

    @Override 
    public Channel load(Long key) throws CacheLoaderException { 
     return getChannelDao().findOne(Channel.mongoChannelCode, key); 
    } 

    @Override 
    public void write(Cache.Entry<? extends Long, ? extends Channel> entry) throws CacheWriterException { 
     getChannelDao().save(entry.getValue()); 
    } 

    @Override 
    public void delete(Object key) throws CacheWriterException { 
     throw new UnsupportedOperationException("Delete not supported"); 
    } 

    private ChannelDao getChannelDao(){ 
     return SpringContextUtil.getApplicationContext().getBean(ChannelDao.class); 
    } 
} 

を実施し、キャッシュ構成にこのCacheStoreの追加提案

EDIT以下のように:

<property name="cacheConfiguration"> 
     <list> 
      <bean class="org.apache.ignite.configuration.CacheConfiguration"> 
       <property name="name" value="channelCache"/> 
       <property name="cacheMode" value="PARTITIONED"/> 
       <property name="atomicityMode" value="ATOMIC"/> 
       <property name="backups" value="1"/> 
       <property name="readThrough" value="true"/> 
       <!-- Sets flag indicating whether write to database is enabled. --> 
       <property name="writeThrough" value="true"/> 
       <!-- Enable database batching. --> 
       <!-- Sets flag indicating whether write-behind is enabled. --> 
       <property name="writeBehindEnabled" value="true"/> 
       <property name="cacheStoreFactory"> 
        <bean class="javax.cache.configuration.FactoryBuilder$SingletonFactory"> 
         <constructor-arg> 
          <bean class="in.per.amt.ignite.cache.ChannelCacheStore"></bean> 
         </constructor-arg> 
        </bean> 
       </property> 
      </bean> 
     </list> 
    </property> 

しかし、今になっクラスキャスト例外

java.lang.ClassCastException: org.springframework.cache.interceptor.SimpleKey cannot be cast to java.lang.Long 
    at in.per.amt.ignite.cache.ChannelCacheStore.load(ChannelCacheStore.java:19) 

答えて

0

だから、あなたが共有しているものとはコードの下の行で、

@Cacheable("cache1") 
public List<Channel> getAllChannels(){ 

@キャッシュ可能な注釈は、パラメータを受け付けていないメソッドで使用されています。 Springキャッシュは、パラメータ(基本データ型の場合)をキャッシュのキー(値としての応答obj)として使用します。私はこれがキャッシュを無効にすると信じています。

+0

私はそれが完全にあなたが使用するキャッシュキーに依存すると思います –

関連する問題