Я пытаюсь настроить уведомления слушателя конфигурируемый JMX, которая позволяет пользователю выбрать MBean из списка вещателем MBeans, зарегистрированных на платформе MBeanServer (ManagementFactory.getPlatformMBeanServer())уведомления JMX слушателей в среде OSGi
mBeanObjectName = new ObjectName(mBeanParameter.stringValue());
notificationListener = new NotificationListener() {
@Override
public void handleNotification(Notification notification, Object handback) {
getLogger().info("Notification received: " + notification);
}
};
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.addNotificationListener(mBeanObjectName, notificationListener, null, null);
в качестве первого теста, я пытался слушать уведомления по сбору мусора ("java.lang: тип = GarbageCollector, имя = PS MarkSweep"). Когда я запускаю GC с помощью JConsole, метод обработки меток моего слушателя никогда не вызывается.
Я просматриваю код с помощью отладчика, и я не вижу ничего плохого в регистрации моего слушателя на этот компонент.
Итак, я зарегистрировал простой компонент HelloWorld (расширение NotificationBroadcasterSupport) со строковым атрибутом. Когда я слушаю этот компонент и изменяю атрибут строки с помощью JConsole, метод handleNotification вызывается как ожидаемый.
боб:
public class HelloWorld extends NotificationBroadcasterSupport implements HelloWorldMBean {
private String greeting = null;
public HelloWorld() {
this.greeting = "Hello World!";
}
public HelloWorld(String greeting) {
this.greeting = greeting;
}
@Override
public void setGreeting(String greeting) {
this.greeting = greeting;
Notification notification = new Notification("helloworld.test", this, -1, System.currentTimeMillis(), greeting);
sendNotification(notification);
}
@Override
public String getGreeting() {
return greeting;
}
}
Bean Регистрация:
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
server.registerMBean(new HelloWorld(), new ObjectName("Test:name=helloWorld"));
Важно отметить, что это работает в приложения на основе OSGi, поэтому я начинаю думать, что это вопрос Загрузчик классов.
Итак, следующим испытанием было устранение фактора OSGi. Удивительный сюрприз, теперь я получаю уведомления от GC MBean ..
Я искал способ включить загрузчик классов моего пакета в платформу MBeanServer, но, похоже, не существует способа сделать это. Я думал, что нашел что-то, когда я наткнулся на метод getClassLoaderRepository для bean-сервера, но общедоступный интерфейс (javax.management.loading.ClassLoaderRepository) не содержит никаких методов для добавления загрузчика классов. И репозиторий платформы MBeanServer представляет собой экземпляр com.sun.jmx.mbeanserver.SecureClassLoaderRepository, который тоже этого не позволяет.
Я также попытался установить threadcontext classloader, и я сделал свой прослушиватель уведомлений сериализуемым. Не сделал трюк.
Так что я надеюсь, что кто-то может помочь мне здесь.