Externarlize ehcache.xml для использования свойств из файла внешних свойств - PullRequest
5 голосов
/ 24 марта 2012

Я хочу поместить заполнители свойств в файл ehcache.xml (например, $ {}), чтобы значения могли быть заменены из файла внешних свойств (.properties) во время выполнения.Что-то вроде:

ehcache.xml (в classpath):

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

ehcache.properties (за пределами war / classpath):

...
default_TTI=21600
...

Цель состоит в том, чтобы иметь возможность изменять конфигурацию кэша без необходимости перестраивать приложение.PropertyPlaceHolder в Spring будет работать только с определением bean-компонента Spring для ehcache, который мне не нужен (нужно сохранить ehcache.xml в виде файла)

Здесь есть похожие посты, но ничто не привело меня к решению.Я искал неделю сейчас !!

Я использую Spring 2.5.6, Hibernate 3.2.6 и Ehcache 2.4.6

Любая помощь или идея очень ценится !!

Большое спасибо, Трипти.

Ответы [ 4 ]

2 голосов
/ 28 марта 2012

В качестве обходного решения вы можете установить значения свойств в области системы (System.setProperty (...)).EhCahe использует эти свойства для разрешения заполнителей во время синтаксического анализа своего файла конфигурации.

1 голос
/ 18 января 2014

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 в classpath , в ehcache.xml имеет такой код:

<diskStore path="${java.io.tmpdir}/${system.project_name}/cache" />

, но когда я развертываю свой проект, я обнаружил, что он не может использовать определение system.project_name в system.properties, почему

1 голос
/ 29 марта 2012

Я наконец-то получил решение! Спасибо Braveterry за то, что указал мне в этом направлении. Я использовал это при запуске контекста:

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>

Это создает одноэлементный CacheManager из файла ehcache.xml вне контекстного пути к классам. Я делал то же самое ранее, но случайно создавал еще один CacheManager до этого, используя файл ehcache.xml по умолчанию в classpath.

Спасибо, Tripti.

0 голосов
/ 26 марта 2012

Если вы просто хотите прочитать конфигурацию с диска при запуске, вы можете сделать следующее в EHCache 2.5:

InputStream fis = 
    new FileInputStream(new File("src/config/ehcache.xml").getAbsolutePath());
try 
{
  CacheManager manager = new CacheManager(fis);
} 
finally 
{
  fis.close();
}
...