Mik*_*oss 4 java spring ehcache
我想通过JMS主题分发我的EhCache.这在EhCache的网站上有记载
我正在使用:
我的Spring配置如下所示:
Run Code Online (Sandbox Code Playgroud)<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>
而且,在pre-JMS配置之前,我的ehcache.xml看起来像这样:
Run Code Online (Sandbox Code Playgroud)<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="," />
当我得到一个应用程序上下文时,我得到一个NullPointer.这是堆栈跟踪:
Run Code Online (Sandbox Code Playgroud)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]
任何人的想法?
真正的问题是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)
| 归档时间: |
|
| 查看次数: |
2794 次 |
| 最近记录: |