代码之家  ›  专栏  ›  技术社区  ›  MikeHoss

添加JMS信息中断ehcache

  •  4
  • MikeHoss  · 技术社区  · 15 年前

    我想通过JMS主题分发我的ehcache。这里有记录 on EhCache's site

    我正在使用:

    • ehcache-1.6.0-试用版3
    • ehcache-jmsreplication-0.3版
    • 弹簧2.5
    • 弹簧-模块-0.9

    我的弹簧配置如下:

    <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=","
                 />
    

    当我得到一个应用程序上下文时,我得到一个空指针。下面是堆栈跟踪:

       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]
    

    有人的想法吗?

    2 回复  |  直到 15 年前
        1
  •  9
  •   MikeHoss    15 年前

    真正的问题是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=";"
        />
    

    另一件让我感到意外的事情很简单,当我意识到这一点时——您必须实现自己的密钥生成器,以确保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=";"
        />
    
        2
  •  0
  •   Antony Stubbs    15 年前

    关于密钥生成问题,这实际上是一个已知的问题- MOD-255 . 我们要把它修补到 Spring Modules Fork 很快。