我想将属性占位符放在ehcache.xml文件中(如$ {}),以便在运行时可以从外部属性文件(.properties)替换值。 类似的东西:
ehcache.xml(在类路径中):
<defaultCache maxElementsInMemory="20000" eternal="false" timeToIdleSeconds="${default_TTI}" timeToLiveSeconds="86400" overflowToDisk="true" ... />
ehcache.properties(在war / classpath之外):
... default_TTI=21600 ...
目的是能够在不需要重建应用程序的情况下更改缓存配置。 Spring的PropertyPlaceHolder只适用于我不想要的ehcache的Spring bean definiton(需要将ehcache.xml保存为文件)
这里有类似的帖子,但没有任何东西让我解决。我一直在寻找一个星期!!
我使用Spring 2.5.6,Hibernate 3.2.6和Ehcache 2.4.6
任何帮助或想法都非常适合!!
非常感谢, Tripti。
答案 0 :(得分:2)
作为workaroud解决方案,您可以将属性值设置为系统范围(System.setProperty(...))。 EhCahe在解析配置文件时使用这些属性来解析占位符。
答案 1 :(得分:1)
我终于得到了解决方案!感谢braveterry指出我朝这个方向。 我在上下文启动时使用了这个:
Inputstream = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
cacheManager = CacheManager.create(stream);
与hibernate配置结合:
<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop>
这将从上下文类路径之外的ehcache.xml文件创建单独的CacheManager。我之前做过同样的事情,但是在使用类路径中的默认ehcache.xml之前意外创建了另一个CacheManager。
谢谢, Tripti。
答案 2 :(得分:1)
svaor,我遵循你的意思,我定义了这样一个bean:
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetClass" value="java.lang.System" />
<property name="targetMethod" value="setProperty" />
<property name="arguments">
<list>
<value>system.project_name</value>
<value>${system.project_name}</value>
</list>
</property>
</bean>
system.project_name在system.properties文件中定义,该文件位于类路径
中我还在classpath中创建了一个ehcache.xml,在ehcache.xml中有这样的代码:
<diskStore path="${java.io.tmpdir}/${system.project_name}/cache" />
但是当我部署我的项目时,我发现它不能使用system.properties中的system.project_name定义,为什么?
答案 3 :(得分:0)
如果您只想在启动时read the config in from disk,可以在EHCache 2.5中执行以下操作:
InputStream fis =
new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try
{
CacheManager manager = new CacheManager(fis);
}
finally
{
fis.close();
}