Как отключить ehcache с помощью внешнего свойства весной - PullRequest
2 голосов
/ 03 сентября 2011

Мне нужна быстрая помощь от вас, чтобы исправить небольшую проблему.

В одном из моих проектов (с использованием Spring в качестве основного контейнера) я использую ehcache для кэширования данных. Я использую Spring ehcache annotations project (http://code.google.com/p/ehcache-spring-annotations/) для того же.

Я хочу иметь гибкость, чтобы включать и отключать ehcache на основе внешнего свойства. Я прочитал документацию по ehcache и обнаружил, что он внутренне считывает системное свойство net.sf.ehcache.disabled, и если он установлен в значение true, кеш будет отключен, и они рекомендуют передавать это как -Dnet.sf.ehcache.disabled=true в командной строке

Я хотел управлять им через внешний файл свойств пружины.

Затем я подумал об установке этого системного свойства в файле контекста моего весеннего приложения, используя MethodInvokingFactoryBean на основе внешнего свойства.

Вот код

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="java.lang.System"/>
            <property name="targetMethod" value="getProperties"/>
        </bean>
    </property>
    <property name="targetMethod" value="putAll"/>
    <property name="arguments">
        <util:properties>
            <prop key="net.sf.ehcache.disabled">"${ehcache.disabled}"</prop>
        </util:properties>
    </property>
</bean>

Очевидно, что ehcache.disabled контролируется через мой внешний файл свойств.

Сантехника работает отлично, но я думаю, что порядок не на месте. К тому времени, когда контекст приложения устанавливает системное свойство, кеш инициализируется, и когда кеш инициализировался, свойства net.sf.ehcache.disabled не было, следовательно, кеш не отключается. Когда я запускаю приложение в режиме отладки и пытаюсь получить System.getProperty("net.sf.ehcache.disabled") после того, как контекст приложения инициализирован, это дает мне правильное значение. (Я пробовал и правда и ложь).

Еще одна вещь, о которой я хочу упомянуть, я использую Spring Wrapper для инициализации моего кэша.

<ehcache:annotation-driven self-populating-cache-scope="method"/>

<ehcache:config cache-manager="cacheManager">
    <ehcache:evict-expired-elements interval="20"/>
</ehcache:config>

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
      p:configLocation="classpath:ehcache.xml"/>

Я считаю, что отключить кеш не может быть так сложно.

Что мне не хватает? Есть ли простой способ сделать это весной, кроме командной строки?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2011

Самый простой способ (до Spring 3.1) - добавить идентификатор bean-компонента в объявление MethodInvokingFactoryBean, а затем добавить отношение зависимости.

2 голосов
/ 04 сентября 2011

Начиная с Spring 3.1, можно использовать профили bean-компонентов, которые могут считывать свойство из внешнего свойства.Вы можете поместить объявленный bean-компонент в элемент bean-компонента:

<beans profile="cache-enabled"> 
  <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="classpath:ehcache.xml"/> 
</beans>

, а затем активировать его, используя внешнее свойство, как указано в этом сообщении в блоге.

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