2015-05-28 4 views
0

Я пытаюсь настроить уведомления слушателя конфигурируемый 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, и я сделал свой прослушиватель уведомлений сериализуемым. Не сделал трюк.

Так что я надеюсь, что кто-то может помочь мне здесь.

ответ

0

Кажется, что это работает в конце концов.
По какой-то неизвестной причине отладчик просто не останавливается на методе handleNotification, и я был введен в заблуждение из-за того, что мой регистратор не распечатывал сообщение «Уведомление получено» (изменено на System.out.println, и оно появилось на консоли. .)

Смежные вопросы