无法在JCS中注册JMX管理bean

时间:2017-09-06 10:55:44

标签: jmx jcs

tomcat服务器中的几个webapps实例化a JCS 2.1 CompositeCacheManager个实例到CompositeCacheManager#getUnconfiguredInstance()。此方法注册了一个JMX bean(JCSAdminBean),并且当bean已经注册时,由于InstanceAlreadyExistsException异常而引发警告:

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

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

1 个答案:

答案 0 :(得分: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;
    }
}