Создание MBean в Java

Я пытаюсь реализовать класс MBean Interface, чтобы я мог опрашивать свойства во время выполнения. Класс, который я пытаюсь допросить, выглядит следующим образом

public class ProfileCache implements ProfileCacheInterfaceMBean{

    private Logger logger = Logger.getLogger(ProfileCache.class);
    private ConcurrentMap<String, Profile> cache;


    public ProfileCache(ConcurrentMap<String, Profile> cache){
        this.cache = cache;     
    }

    /**
     * Update the cache entry for a given user id
     * @param userid the user id to update for 
     * @param profile the new profile to store
     * @return true if the cache update
     */
    public boolean updateCache(String userid, Profile profile) {
        if (cache == null || cache.size() == 0) {
            throw new RuntimeException("Unable to update the cache");
        }
        if (cache.containsKey(userid)) {
            if (profile != null) {
                cache.put(userid, profile);
                logger.info("Updated the cache for user: "
                            + userid + "  profile: " + profile);
                return true;
            }
        }
        return false;
    }

    @Override
    public ConcurrentMap<String, Profile> getCache() {
        if(cache == null){
            cache = new ConcurrentHashMap<String, Profile>();
        }
        return cache;
    }


}

Интерфейс выглядит так

import com.vimba.profile.Profile;

public interface ProfileCacheInterfaceMBean {

    ConcurrentMap<String, Profile> getCache();

}

И я запускаю MBean так

        cacheImpl = new ProfileCache(factory.createCacheFromDB());
        MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
        ObjectName profileCache = new ObjectName("org.javalobby.tnt.jmx:type=ProfileCacheInterfaceMBean");  
        mbs.registerMBean(cacheImpl, profileCache);

Однако я продолжаю получать исключение ниже, и я не уверен, что мне нужно изменить

javax.management.NotCompliantMBeanException: MBean class com.vimba.cache.ProfileCache does not implement DynamicMBean, and neither follows the Standard MBean conventions (javax.management.NotCompliantMBeanException: Class com.vimba.cache.ProfileCache is not a JMX compliant Standard MBean) nor the MXBean conventions (javax.management.NotCompliantMBeanException: com.vimba.cache.ProfileCache: Class com.vimba.cache.ProfileCache is not a JMX compliant MXBean)

Я думаю, что потенциально это потому, что он возвращает карту?


person Biscuit128    schedule 14.08.2014    source источник
comment
Спасибо за такой полезный комментарий, если бы я понял, что имелось в виду, я бы не написал здесь. Без сомнения, ваш сарказм должен помочь вам получить еще несколько баллов — хорошая работа.   -  person Biscuit128    schedule 14.08.2014
comment
Это был искренний вопрос. В любом случае, какую часть исключения вы не понимаете? Для начала с не реализует --› Указывает, что ваш класс должен реализовать интерфейс.   -  person TJ-    schedule 14.08.2014
comment
Это источник моего замешательства, так как учебник, которому я следовал, не реализовывал этот интерфейс - может быть, я должен просто пойти и rtfm   -  person Biscuit128    schedule 14.08.2014
comment
Мне помогло переименование имени класса Managed Bean в YourClasssNameMXBean.   -  person Rajesh Balan    schedule 17.01.2018


Ответы (8)


Только что столкнувшись с этим исключением и просмотрев текущие ответы, а также https://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and Я подумал, что это может помочь подчеркнуть и прояснить следующее, что уже разъяснено:

  1. NotCompliantMBeanException вызвано, среди прочего, несоблюдением этого соглашения. «ConcreteClassName» реализует «ConcreteClassNameMBean».

  2. Я решил эту проблему, изменив исходное имя моего интерфейса mbean с «OriginalNameMBean» на «OriginalNameMXBean», что позволило зарегистрировать mbean без соблюдения соглашения.

  3. Другим решением было бы следовать соглашению.

person Bjorn Sayers    schedule 08.05.2015
comment
Ссылка больше не действительна - person Sameer; 21.06.2018
comment
Но решение все еще в силе :) - person Davut Gürbüz; 22.10.2018

Класс реализации mbean может объявить любое количество методов, которые не определены в интерфейсе mbeans... Нет требования, чтобы класс реализации мог/должен реализовывать только методы интерфейса.

Во многих случаях эта проблема вызвана тем, что интерфейс mbean и класс реализации находятся в разных пакетах!

person Kim Zeevaarders    schedule 13.05.2017
comment
Это действительно было так, спасибо! Перемещение интерфейса в тот же пакет, что и реализация, устранило ошибку для меня. - person JayPatel; 07.07.2021

Вы можете изменить имя интерфейса с SomethingMBean на SomethingMXBean, например HelloMBean на HelloMXBean, из исходного кода jdk, который я видел:

public static boolean isMXBeanInterface(Class<?> interfaceClass) {
    if (!interfaceClass.isInterface())
        return false;
    if (!Modifier.isPublic(interfaceClass.getModifiers()) &&
        !Introspector.ALLOW_NONPUBLIC_MBEAN) {
        return false;
    }
    MXBean a = interfaceClass.getAnnotation(MXBean.class);
    if (a != null)
        return a.value();
    return interfaceClass.getName().endsWith("MXBean");
}

если не заканчивается с «MXBean», он вернет false, а затем вызовет исключение IllegalArgumentException

JDK версия: 1.8.0_25

класс "JMX", строка 376

person flahsy    schedule 10.07.2017

Просто измените имя класса реализации с ProfileCache на ProfileCacheInterface. Теперь это должно работать. Кроме того, ваш класс реализации может иметь любое количество собственных методов, и эти методы не нужно упоминать в интерфейсе MBean.

Стандартное соглашение об именах mbean в JMX выглядит следующим образом:

    public interface SomeBeanNameMBean{
    ...
    }

    public class SomeBeanName implements SomeBeanNameMBean{
    ...
    //implements all the methods of SomeBeanNameMBean
    ...
    //implement other class's own methods if needed
    }
person deenfirdoush    schedule 26.01.2015

Я столкнулся с той же проблемой, что и «Исключение в потоке «основной» javax.management.NotCompliantMBeanException», в моем случае я сохранил интерфейс MBean и классы реализации в пакете Differentnet. Чтобы решить эту проблему, я переместил интерфейс MBean и класс реализации в один и тот же пакет.

person Hari Krishna    schedule 24.07.2018

Просто измените суффикс интерфейса с «MBean» на «MXBean». Это работает для меня.

person 趁现在赶快回家    schedule 24.06.2019

Во всех примерах, которые я видел для реализаций MBean, я никогда не видел, чтобы класс определял метод, который не был определен в интерфейсе. Например, в ProfileCache есть метод updateCache, а в ProfileCacheInterfaceMBean — нет. Попробуйте удалить метод updateCache из ProfileCache и посмотрите, будет ли он работать.

person jdb1015    schedule 14.08.2014
comment
у обоих есть метод getCache? - person Biscuit128; 14.08.2014
comment
Просто попробуйте закомментировать метод updateCache в ProfileCache и посмотрите, будет ли по-прежнему выдаваться это исключение. - person jdb1015; 14.08.2014
comment
хотя какая разница?! - person Biscuit128; 14.08.2014
comment
Поскольку кажется, что реализация MBean требует, чтобы были реализованы только методы интерфейса; никакие дополнительные методы не должны быть реализованы в ProfileCache. На данный момент, если вы опубликуете еще один комментарий, прежде чем пытаться прокомментировать updateCache, ВЫ троллите для rep. - person jdb1015; 14.08.2014
comment
ответ ниже правильный. Не проблема добавить дополнительные методы в реализацию MBean. - person Martin Asenov; 19.12.2017

person    schedule
comment
лучший ответ для меня - person Saad Benbouzid; 21.09.2016