2011-03-29 26 views
6

Bir OSGi kapsayıcısında çalışan, Java 1.6 platform MBeans sunucusunu kullanıyorum.Yeni kaydedilen MB'leri algılama

Özellikle istatistik sayaçları ve olayları için MBeans'ı kullanma. Bunların uygulanması tek bir pakette, ancak diğer birçok grupta örneklendirildi. Her MBean, kendisini platform MBean sunucusuyla özdeşleştirir.

Sorun şu ki, JMX ile iliştirdiğimde ve MBeans için sorguladığımda, yalnızca şu anda kayıtlı olanları alıyorum ve bunlar örnekleninceye kadar kaydedilmeyecekler (ya da ilk önce statik sınıflar yoksa) erişim, ya da paket henüz başlamadı ya da sayaç ilk kullanıma kadar var olmayan bazı mantıkta derindir)

MBeans sunucusunda "kayıt" olaylarına abone olmanın bir yoluna ihtiyacım var. Ya da sunucuya yeni MBeans eklendiğinde başka bir yol belirleme yolu. Kaldırılan MB'lerin algılanması ek bir bonus olacaktır, ancak gerekli değildir.

Elimde olan tek çözüm temel olarak sunucuyu her 5 saniyede bir sorgulayan ve sonucu kaydedilmiş bir MBeans listesiyle karşılaştıran bir iş parçacığıdır ve bu oldukça çirkin.

cevap

12

Tüm uyumlu MBeanServers, MBean kayıtlarının ve kayıtlarının kaydını silme olaylarını dinleyicilere bildirecektir. Anahtar, MBeanServerDelegate üzerinde bir bildirim dinleyicisi kaydettirmektir. Örneğin

, bir javax.management.NotificationListener uygulanması:

public class MBeanEventListener implements NotificationListener { 
    public void handleNotification(Notification notification, Object handback) { 
     MBeanServerNotification mbs = (MBeanServerNotification) notification; 
     if(MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(mbs.getType())) { 
      log("MBean Registered [" + mbs.getMBeanName() + "]"); 
     } else if(MBeanServerNotification.UNREGISTRATION_NOTIFICATION.equals(mbs.getType())) { 
      log("MBean Unregistered [" + mbs.getMBeanName() + "]"); 
     } 
    }  
} 

, dinleyici kayıt MBeanServerDelegate karşı bildirim dinleyici ekleyin. Gerçekte bildirildiğiniz MBB'leri filtrelemek istiyorsanız, MBeanServerNotificationFilter'u kullanabilirsiniz. Bu örnekte, filtre tüm ObjectNames için etkinleştirilmiştir.

// Get a reference to the target MBeanServer 
    MBeanServerConnection server = ManagementFactory.getPlatformMBeanServer(); 
    MBeanServerNotificationFilter filter = new MBeanServerNotificationFilter(); 
    filter.enableAllObjectNames(); 
    server.addNotificationListener(MBeanServerDelegate.DELEGATE_NAME, new MBeanEventListener(), filter, null); 

Dinleyici uygulamanız, her MBean kaydedildiğinde veya kayıtsız olduğunda bir geri arama alır.

3

Bu, herhangi bir yerde bulunan tüm MBWI'leri görmek istediğiniz, ancak kodun hepsini bir kerede oluşturmadığından beri yapamayacağınız gibi görünüyor.

Tüm gerçek MB'lar için "görünüm" MBeans oluşturan bir kod üreteci kullanmanızı öneririm. Örneğin, MBeans'i bulmak için bir sınıf veya bir işaretçi arabirimi kullanın. Görünüm fasulye tüm başlangıçta oluşturulmalıdır.

Şimdi gerçek MBean geldiğinde, onun görüşüne bakmalı ve kendini bağlamalıdır.

Bu şekilde, tüm MBeans'ler her zaman görünür olacak, başlatma çok fazla acı çekmeyecektir (MBW'ler gerçekten çok ucuz görünecektir) ve MBW'ler size gerçek MB'lerin durumunu söyleyebilir.

[DÜZENLE] gerçekten sadece yeni MBean kaydedildiğinde bilmeniz gerekiyorsa , varolan MBeanServer uzatmak ve registerMBean(Object, ObjectName) geçersiz kılar. Yeni MBeanServer Sistem özelliğini javax.management.builder.initial ayarlayarak yükleyin.

Şimdi bu bilgileri açığa çıkaran bir MBean tanımlayın.

+0

Bunu yapmanın çok daha kolay bir yolu olduğunu umuyordum :( Belgelenmemiş bir API veya başka bir yerde bir yerde "yeni kayıtlar dinle" etkinliği gibi. – MarcB

+0

Bu, ana sorununuzu çözmüyor: Henüz kaydedilmemiş olan MB'leri görmek. –

+0

Eh, kayıtlı olmadıklarında onları görmek zorunda değilim (güzel olsa da). Kayıt olduklarında bunu öğrenmek yeterli olur. – MarcB