添加JMS信息会破坏EhCache

Mik*_*oss 4 java spring ehcache

我想通过JMS主题分发我的EhCache.这在EhCache的网站上有记载

我正在使用:

  • 的Ehcache-1.6.0-β3
  • 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>
Run Code Online (Sandbox Code Playgroud)

而且,在pre-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"
        / >
Run Code Online (Sandbox Code Playgroud)

这很好用.所以我添加了我的主题信息:

 <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=","
             />
Run Code Online (Sandbox Code Playgroud)

当我得到一个应用程序上下文时,我得到一个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]
Run Code Online (Sandbox Code Playgroud)

任何人的想法?

Mik*_*oss 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=";"
    />
Run Code Online (Sandbox Code Playgroud)

绊倒我的另一件事很简单,一旦我意识到 - 你必须实现自己的密钥生成器,以确保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=";"
    />
Run Code Online (Sandbox Code Playgroud)