2012-03-23 89 views
4

我想將屬性佔位符放置在ehcache.xml文件(如$ {})中,以便可以在運行時從外部屬性文件(.properties)替換這些值。 是這樣的:Externarlize ehcache.xml以使用來自外部屬性文件的屬性

ehcache.xml中(類路徑):

<defaultCache 
maxElementsInMemory="20000" 
eternal="false" 
timeToIdleSeconds="${default_TTI}" 
timeToLiveSeconds="86400" 
overflowToDisk="true" 
... /> 

ehcache.properties(戰爭/類路徑的外部):

... 
default_TTI=21600 
... 

目的是能夠更改緩存配置而不需要重新編譯創建應用程序。 Spring的PropertyPlaceHolder只適用於Spring bean定義的ehcache,我不想要(需要將ehcache.xml保存爲一個文件)

這裏也有類似的帖子,但沒有讓我想到解決方案。我一直在尋找一個星期!使用Spring 2.5.6,3.2.6休眠和2.4.6的Ehcache

任何幫助或想法

IM是大大Appriciated!

非常感謝, Tripti。

回答

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(); 
} 
+0

非常感謝您的回覆! – Tripti 2012-03-26 15:39:38

+1

抱歉太早輸入!我也嘗試過這樣做,但問題是如何將此CacheManager掛接到休眠狀態?我在我的hibernate上下文文件中有以下代碼:' true net.sf.ehcache.hibernate.SingletonEhCacheProvider'So hibernate開始使用默認的ehcache.xml(在jar中可用)並使用它創建Caches,而不是使用我創建的CacheManger。有什麼辦法可以告訴hibernate使用我的CacheManager而不是創建新的?謝謝,Tripti。 – Tripti 2012-03-26 15:47:05

2

作爲workaroud解決方案,您可以設置屬性值系統範圍(System.setProperty(...) )。 EhCahe在解析配置文件時使用這些屬性來解析佔位符。

1

我終於找到了解決方案!感謝braveterry指引我朝那個方向發展。與hibernate配置一起選擇

Inputstream = new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath()); 
cacheManager = CacheManager.create(stream); 

: 我用這個在上下文啓動

<prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop> 

這產生從上下文類路徑外ehcache.xml中文件一個單的CacheManager。我之前也是這樣做的,但在使用類路徑中的默認ehcache.xml之前,意外地創建了另一個CacheManager。

謝謝, Tripti。

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.project_name定義系統。物業,爲什麼?