Erstellen MBean Java
Ich versuche, eine Klasse die Implementierung einer MBean-Schnittstelle, so kann ich befragen, die Eigenschaften zur Laufzeit. Die Klasse, die ich bin versucht zu befragen, ist wie folgt
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;
}
}
Die Schnittstelle sieht wie folgt aus
import com.vimba.profile.Profile;
public interface ProfileCacheInterfaceMBean {
ConcurrentMap<String, Profile> getCache();
}
Und ich starten Sie den MBean wie diese
cacheImpl = new ProfileCache(factory.createCacheFromDB());
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ObjectName profileCache = new ObjectName("org.javalobby.tnt.jmx:type=ProfileCacheInterfaceMBean");
mbs.registerMBean(cacheImpl, profileCache);
Aber ich bekomme immer wieder die unten Ausnahme und ich bin nicht sicher, was ich ändern muss
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)
Ich denke, potenziell es ist, weil es gibt eine Karte?
- Vielen Dank für so einen hilfreichen Kommentar, wenn ich verstanden habe, was gemeint war, hätte ich nicht hier gepostet. Kein Zweifel, dein Sarkasmus helfen sollte, bekommen Sie ein paar mehr Punkte - gute Arbeit
- Das war eine echte Frage. Eh, der Teil der Ausnahme, verstehst du nicht? Um zu beginnen, die mit "nicht implementiert" --> Gibt an, dass Ihre Klasse muss das interface implementieren.
- Dies ist die Quelle meiner Verwirrung, als das tutorial, ich folgte nicht dieses interface implementieren - vielleicht sollte ich einfach gehen und rtfm
- Die Umbenennung der Verwaltete Bean-Klasse name zu Ende "YourClasssNameMXBean" für mich gearbeitet.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass nur auf diese Ausnahme und sah mir die aktuellen Antworten sowie https://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and ich dachte, es könnte helfen, zu betonen und zu klären, die folgenden bereits aufgeklärt zu:
Den NotCompliantMBeanException verursacht wird, unter anderem, durch die Nichtbeachtung dieses übereinkommens 'ConcreteClassName' implementiert 'ConcreteClassNameMBean'
Ich dieses Problem gelöst, indem die Aktualisierung der ursprüngliche name von meinem mbean-Schnittstelle aus 'OrignalNameMBean' zu 'OriginalNameMXBean" erlaubt die mbean registriert werden, ohne mit der Konvention
Andere Lösung wäre, Folgen der Konvention.
Ich hatte das gleiche Problem ("nicht implementiert DynamicMBean, und weder folgt die Standard-MBean-übereinkommen") und dieser Artikel hat mir geholfen, das problem zu beheben (siehe Verwenden StandardMBean Abschnitt: https://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and).
Habe ich explizit konstruieren
dann registrieren Sie die mbean:
Es funktioniert.
Ich bei der Registrierung die mBeanImpl mit der mbServer, ich habe den oben genannten Ausnahme.
Die Umsetzung der mbean-Klasse deklarieren können, so viele Methoden wie es mag, die nicht definiert sind in mbeans-Schnittstelle... Es gibt keine Anforderung, dass die implementierende Klasse kann/muss nur Implementierung der interface-Methoden.
In vielen Fällen ist dieses problem verursacht wird, weil die mbean-interface und-implementation-Klasse sind nicht in der gleichen Verpackung!
Können Sie ändern Sie den interface-Namen aus SomethingMBean zu SomethingMXBean,wie HelloMBean zu HelloMXBean,von jdk source code sah ich dieses:
wenn nicht endsWith "MXBean"wird false zurückgegeben,dann verursachen throw IllegalArgumentException
jdk-version:1.8.0_25
Klasse "JMX",Linie 376
Ändern Sie einfach Ihre Implementierung der Klasse name aus ProfileCache zu ProfileCacheInterface. Jetzt sollte es funktionieren. Darüber hinaus kommt Ihre Implementierung der Klasse kann eine beliebige Anzahl von eigenen Methoden und die Methoden braucht nicht erwähnt zu werden, in der MBean-Schnittstelle.
JMX-standard-mbean Namenskonvention ist wie folgt
Ich vor dem gleichen problem, wie " Exception in thread "main" javax.management.NotCompliantMBeanException', in meinem Fall hielt ich MBean-Schnittstelle und der Implementierung von Klassen in verschiedenen Paket. Um das Problem zu beheben, ich zog beide MBean-Schnittstelle und die Implementierungsklasse zu gleichen Paket.
In allen Beispielen, die ich erlebt habe, MBean-Implementierungen, ich habe nie gesehen, dass eine Klasse eine Methode definieren, die war nicht definiert in der Schnittstelle. E. g., ProfileCache hat Methode updateCache, aber ProfileCacheInterfaceMBean nicht. Entfernen Sie den updateCache Methode von ProfileCache und sehen, ob es funktioniert.
Nur ändern, interface-suffix aus 'MBean' zu 'MXBean'.
Dies funktioniert für mich.