0

一个tomcat 服务器中的几个 webapps CompositeCacheManager通过CompositeCacheManager#getUnconfiguredInstance(). 这个方法注册了一个 JMX bean ( JCSAdminBean),当 bean 已经注册时,它会因为 InstanceAlreadyExistsException 异常而引发警告:

2017-09-06 11:34:08,296 警告 CompositeCacheManager:无法注册 JMX bean。
javax.management.InstanceAlreadyExistsException: org.apache.commons.jcs:type=JCSAdminBean
        在 com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437)
        在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898)
        在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966)
        在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900)
        在 com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324)
        在 com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
        在 org.apache.commons.jcs.engine.control.CompositeCacheManager.initialize(CompositeCacheManager.java:271)
        在 org.apache.commons.jcs.engine.control.CompositeCacheManager.getUnconfiguredInstance(CompositeCacheManager.java:218)

我怎样才能摆脱这些警告?我需要在几个 webapps 中进行缓存,但我不一定需要这个管理 bean。

4

1 回答 1

0

我也遇到了这个问题,我在谷歌上找不到任何东西。因此,经过一番破解后,我发现每个缓存只能调用一次 JCS.getInstance()。即它需要在静态变量中设置。

遵循 Joshua Bloch 的单例最佳实践,并确保可以从多个类访问缓存,我​​们为此目的使用枚举。JCS.getInstance 在类的整个生命周期中只会被调用一次。

public enum Cache
{
    INSTANCE;

    CacheAccess<String, Map<String, STVLang>> stvLangCache;

    Cache()
    {
        stvLangCache = JCS.getInstance("stvlang");
    }

    public CacheAccess<String, Map<String, STVLang>> getLangCache()
    {
        return stvLangCache;
    }
}
于 2017-11-01T00:25:46.617 回答