0

I have multiple web applications deployed in Tomcat and service jar shared in TOMCAT_HOME/lib/ext. All of the application are using Spring, and in the service jar I have beans, annotated with Spring 3.1 Caching annotations . I am using Ehcache provider. And I want to have one single CacheManager used by all the web applications. If I define spring cache configurations at web application level, caching works, but separate cacheManager is created for every app/context. 'Shared' Cache Manager is causing problems, because if one the those applications gets undeployed, this shared cacheManager is shut down. So I want a single CacheManager , configured in my service jar, and used for all the calls to methods made from beans from the web apps. My current try is to define following confuguration in service.jar's applicationContext.xml:

<context:annotation-config/>
<context:component-scan base-package="com.mycompany.app" />
<context:component-scan base-package="com.mycompany.portal.service" />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cacheManager-ref="ehCacheManager"/>

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

<cache:annotation-driven cache-manager="cacheManager"/>

I have defined parent application context via beanRefContext.xml:

<bean id="service.parent.context" class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>applicationContext.xml</value>
        </list>
    </constructor-arg>
</bean>

And I am using this context as a parent context for all of my web apps with following contextParam in web app's web.xml:

<context-param>
    <param-name>parentContextKey</param-name>
    <param-value>service.parent.context</param-value>
</context-param>

The result is that this parentContext is loaded, but caching doesn't work at all How can I solve this? Am I on the right way with the defining of the parentContext in the service.jar?

Stephane Nicoll
  • 31,977
  • 9
  • 97
  • 89

1 Answers1

0

I don't think so. It looks like you are trying to have a single cache for multiple applications by "hacking" the root classloader.

If you need to share your cache across several applications, use a cache manager that supports that use case (i.e. that provides you a service you can reach from each application).

Stephane Nicoll
  • 31,977
  • 9
  • 97
  • 89