Java-Помощь В Создании MBean
Я пытаюсь заставить класс реализовать интерфейс MBean, чтобы я мог опрашивать свойства во время выполнения. Класс я пытаюсь допросить следующим образом
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)
Я думаю, потенциально это потому, что он возвращает карту? Пожалуйста, кто-нибудь помочь?
спасибо
7 ответов
только что столкнувшись с этим исключением и посмотрел на текущие ответы, а также https://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and я подумал, что это может помочь подчеркнуть и прояснить следующее, уже выясненное:
исключение NotCompliantMBeanException вызвано, среди прочего, несоблюдением этого соглашения "ConcreteClassName" реализует "ConcreteClassNameMBean"
I разрешил это, обновив исходное имя моего интерфейса mbean от "OrignalNameMBean" до "OriginalNameMXBean", позволяя регистрировать mbean без соблюдения соглашения
другим решением было бы следовать конвенции.
у меня была та же проблема ("не реализует DynamicMBean и не следует стандартным соглашениям MBean"), и эта статья помогла мне решить проблему (см. раздел Использование StandardMBean: https://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and).
Я должен создать
StandardMBean mbean = new StandardMBean(mBeanImpl, MBeanInterface.class);
затем зарегистрируйте mbean:
mbServer.registerMBean(mbean, mBeanName);
это работает.
когда я регистрирую mBeanImpl с помощью mbServer, я получил вышеуказанное исключение.
реализующий класс mbean может объявить столько методов, сколько ему нравится, которые не определены в интерфейсе mbeans... Нет требования, что класс реализации can / must только реализовать методы интерфейса.
во многих случаях эта проблема вызвана тем, что MBean интерфейс и класс реализации не находятся в одном пакете!
вы можете изменить имя интерфейса с 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");
}
если не endsWith "MXBean", он вернет false, а затем вызовет throw IllegalArgumentException
версия jdk: 1.8.0_25
класс "JMX", строка 376
просто измените имя класса реализации с 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
}
Я согласен, TJ троллинг для репутации.......
во всех примерах, которые я видел для реализаций MBean, я никогда не видел, чтобы класс определял метод, который не был определен в inteface. Е. Г., ProfileCache имеет способ updateCache, но ProfileCacheInterfaceMBean не. Попробуйте удалить метод updateCache из ProfileCache и посмотреть, будет ли он работать.
Я столкнулся с той же проблемой, как "исключение в потоке" main " javax.управление.NotCompliantMBeanException', в моем случае я сохранил классы интерфейса и реализации MBean в пакете differnet. Чтобы решить эту проблему, я переместил интерфейс MBean и класс реализации в один пакет.