5

JMSトピックを介してEhCacheを配布したいと思います。これは、EhCacheのサイトでここに文書化されています

私が使用しているもの:

  • ehcache-1.6.0-beta3
  • ehcache-jmsreplication-0.3
  • 春-2.5
  • スプリングモジュール-0.9

私のSpring構成は次のようになります。

<bean id="cacheManager"
      class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
</bean>  
<bean id="cacheProvider"
      class="org.springmodules.cache.provider.ehcache.EhCacheFacade">
  <property name="cacheManager" ref="cacheManager" />
</bean>    
<ehcache:proxy id="pocDaoCache" refId="pocDao">
    <ehcache:caching methodName="fetch" cacheName="pocCache" />
</ehcache:proxy>

そして、JMS以前の設定では、私のehcache.xmlは次のようになります。

 <diskStore path="c:/projects/cache/demo" />

  <defaultCache maxElementsInMemory="50" eternal="false"
  timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />


 <cache name="pocCache"
        maxElementsInMemory="10000"
        maxElementsOnDisk="1000"
        eternal="false"
        overflowToDisk="true"
        diskSpoolBufferSizeMB="20"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        memoryStoreEvictionPolicy="LFU"
        / >

そして、これはうまくいきます。そこで、トピック情報を追加します。

 <cacheManagerPeerProviderFactory
             class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
             properties="initialContextFactoryName=JmsInitialContextFactory,
      userName=myuser,password=mypass,
                 providerURL=tcp://jmsdev1-jndi,tcp://jmsdev2-jndi
                 topicConnectionFactoryBindingName=TCF-00,
                 topicBindingName=MyTopiceName"
             propertySeparator=","
             />

また、アプリケーションコンテキストを取得すると、NullPointerが取得されます。スタックトレースは次のとおりです。

   org.springframework.beans.factory.BeanCreationException:  
org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'cacheManager' defined in class path resource [cache-context.xml]: 
Invocation of init method failed; nested exception is java.lang.NullPointerException
         at org.springframework.beans.factory.support.AbstractAutowireCapableBean
 Factory.initializeBean(AbstractAutowireCapableBeanFactory.java:1336)
         at org.springframework.beans.factory.support.AbstractAutowireCapableBean
 Factory.doCreateBean(AbstractAutowireCapableBeanFactory.java:471)
         at org.springframework.beans.factory.support.AbstractAutowireCapableBean
 Factory$1.run(AbstractAutowireCapableBeanFactory.java:409)
         at java.security.AccessController.doPrivileged(Native Method)
         at org.springframework.beans.factory.support.AbstractAutowireCapableBean
 Factory.createBean(AbstractAutowireCapableBeanFactory.java:380)
         at org.springframework.beans.factory.support.AbstractBeanFactory$1.getOb
 ject(AbstractBeanFactory.java:264)
         at org.springframework.beans.factory.support.DefaultSingletonBeanRegistr
 y.getSingleton(DefaultSingletonBeanRegistry.java:217)
  [snip]

誰かからのアイデアはありますか?

4

2 に答える 2

9

本当の問題は、Ehcache のドキュメントが正しくなく、実際の実装方法に近くさえないことです。jmsreplication モジュールのコードをログに記録して調べることで、機能させることができました。

 <cacheManagerPeerProviderFactory
        class="net.sf.ehcache.distribution.jms.JMSCacheManagerPeerProviderFactory"
        properties="initialContextFactoryName=com.InitialContextFactory;

    userName=uname;password=passwd;
            replicationTopicConnectionFactoryBindingName=TCF;
            replicationTopicBindingName=CACHE;
    providerURL=tcp://server1:7222,tcp://server2:7222;
    getQueueConnectionFactoryBindingName=QCF;
    getQueueBindingName=CACHE_LOAD
    "
    propertySeparator=";"
    />

私がつまずいたもう 1 つのことは単純なことでした。気が付いたら、独自のキー ジェネレーターを実装して、Ehcache が各 JVM で同じキーを持つオブジェクトを確実に保存するようにする必要がありました。あなたがそれについて考えるとき、それは完全に理にかなっています。

はい、ローダー キュー情報を cacheManagerPeerProviderFactory に入れる必要があります。これは、プロセスの実行後にプロセスを開始すると、新しいプロセスが既存のプロセスからキャッシュをプリロードできるためです。

ローダー リクエスター (cacheLoaderFactory) をまったく同じ設定で構成します。

   <cacheLoaderFactory
        class="net.sf.ehcache.distribution.jms.JMSCacheLoaderFactory"
   properties="initialContextFactoryName=com.InitialContextFactory;

    userName=uname;password=passwd;
            replicationTopicConnectionFactoryBindingName=TCF;
            replicationTopicBindingName=CACHE;
    providerURL=tcp://server1:7222,tcp://server2:7222;
    getQueueConnectionFactoryBindingName=QCF;
    getQueueBindingName=CACHE_LOAD
    "
    propertySeparator=";"
    />
于 2009-03-24T20:48:32.143 に答える
0

キー生成の問題に関しては、実際には既知の問題です - MOD-255。まもなく、 Spring Modules Forkにパッチを適用する予定です。

于 2009-08-07T15:39:54.290 に答える