Добавление информации JMS нарушает EhCache - PullRequest
4 голосов
/ 20 марта 2009

Я хочу распространять свой EhCache через тему JMS. Это задокументировано здесь на сайте 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>

И, до конфигурации 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]

Есть идеи у кого-нибудь?

Ответы [ 2 ]

9 голосов
/ 24 марта 2009

Реальная проблема заключается в том, что документация 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=";"
    />
0 голосов
/ 07 августа 2009

Что касается проблемы генерации ключей, то на самом деле это известная проблема - MOD-255 . Мы собираемся исправить это в Spring Modules Fork в ближайшее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...