0

我在 Tomcat 中部署了多个 Web 应用程序,并且在 TOMCAT_HOME/lib/ext 中共享了服务 jar。所有应用程序都使用 Spring,在服务 jar 中我有 bean,使用 Spring 3.1 Caching annotations 进行注释。我正在使用 Ehcache 提供程序。我希望所有 Web 应用程序都使用一个 CacheManager。如果我在 Web 应用程序级别定义 spring 缓存配置,缓存会起作用,但会为每个应用程序/上下文创建单独的 cacheManager。“共享”缓存管理器会导致问题,因为如果这些应用程序之一被取消部署,则此共享缓存管理器将关闭。所以我想要一个 CacheManager ,在我的服务 jar 中配置,并用于对来自 Web 应用程序的 bean 进行的所有方法的调用。我目前的尝试是在 service.jar 的 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"/>

我已经通过 beanRefContext.xml 定义了父应用程序上下文:

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

我使用这个上下文作为我所有的 web 应用程序的父上下文,在 web 应用程序的 web.xml 中具有以下 contextParam:

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

结果是这个parentContext被加载了,但是缓存根本不起作用我该如何解决这个问题?我在 service.jar 中定义 parentContext 的方式是否正确?

4

1 回答 1

0

我不这么认为。看起来您正试图通过“破解”根类加载器来为多个应用程序提供一个缓存。

如果您需要在多个应用程序之间共享缓存,请使用支持该用例的缓存管理器(即为您提供可以从每个应用程序访问的服务)。

于 2014-05-31T05:54:04.407 回答