PlatformMBeanServer Client

adi4web

Grünschnabel
Hallo Zusammen.

Ich bin noch nicht so gewannt mit Java.

Das Problem:
Ich will eine MBean - Schnittstelle programmieren. Dabei soll quasi ein MBean - Server und Client geben, die Codemässig getrennt sind.

Zuerst habe ich beim Server mit createMBeanServer(), createRegistry() und newJMXConnectorServer() instanziert. Beim Client habe ich auch zugriff, wenn ich die URL genau kenne.

Hier die erste Frage: Gibt es eine Möglichkeit über ein Alias den Zugriff zu machen?
Oder anders: gibt es eine Möglichkeit, alle registrierte MBean-Server abzufragen?

Ich habe mir auch überlegt, ob ich das mit getPlatformMBeanServer() zusammen mit passendem Interface umsetzen will.
Die JConsole hat den Server auch gleich erkannt und die Methoden können aufgerufen werden.

Leider habe ich im Forum und Google nichts verwendbares gefunden, wie ich das in Java umsetzen kann.
Es könnte mir auch helfen, wenn es vom JConsole o.ä. die Quellcode gäbe.

Vielen Dank schon mal für die Hilfe :)
 
Hallo,

wenn du alle deine MBeans mit einem entsprechendem Namespace-Prefix (de.tutorials:...) ausstattest, dann kannst du darüber abfragen.

Beispiel... alle default MBeans im java.lang: Namespace
Java:
/**
 * 
 */
package de.tutorials;

import java.lang.management.ManagementFactory;
import java.util.Set;

import javax.management.ObjectInstance;
import javax.management.ObjectName;

/**
 * @author Thomas.Darimont
 * 
 */
public class MBeanListingExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Set<ObjectInstance> mbeanInstances = ManagementFactory
                .getPlatformMBeanServer().queryMBeans(
                        new ObjectName("java.lang:*"), null);

        System.out.println(mbeanInstances);
    }

}

Ausgabe:
Code:
[com.sun.management.OperatingSystem[java.lang:type=OperatingSystem], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Perm Gen], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Tenured Gen], sun.management.CompilationImpl[java.lang:type=Compilation], sun.management.MemoryImpl[java.lang:type=Memory], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Survivor Space], sun.management.RuntimeImpl[java.lang:type=Runtime], sun.management.GarbageCollectorImpl[java.lang:type=GarbageCollector,name=Copy], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Eden Space], sun.management.GarbageCollectorImpl[java.lang:type=GarbageCollector,name=MarkSweepCompact], sun.management.ThreadImpl[java.lang:type=Threading], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Perm Gen [shared-ro]], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Perm Gen [shared-rw]], sun.management.ClassLoadingImpl[java.lang:type=ClassLoading], sun.management.MemoryManagerImpl[java.lang:type=MemoryManager,name=CodeCacheManager], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Code Cache]]

Wie du an den Server MBeanserver kommst findest du hier:
http://www.tutorials.de/forum/j2ee/227940-jmx-mit-rmi-adaptor-mx4j.html

Gruß Tom
 
Hallo Tom

Vielen Dank für die Rasche Antwort.
Wenn ich dein Beispiel mit queryMBeans() ausführe, erhalte ich die Ausgabe, aber leider ohne dass ich meine MBeans sehe bzw wenn ich mit ObjectName("de.tutorials:*") versuche, ist die Liste leer. Es scheint, wie wenn es am "falschen" Server hängt :confused:

Was ich suche, ist wie ich an die Information komme, damit ich zB dann "service:jmx:rmi:///jndi/rmi://localhost:9999/simpleApplication" zusammensetzen kann. Ich hoffe, ich habe das nicht zu kompliziert formuliert...

Mein Experiment habe ich an http://www.tutorials.de/forum/j2ee/227940-jmx-mit-rmi-adaptor-mx4j.html angelehnt und wie beschrieben funktioniert das.

Und die 2. Frage war: wie muss ich den Client programmieren, wenn ich getPlatformMBeanServer() statt createMBeanServer() verwenden will?
Zuerst dachte ich, etwas mit PlatformMXBeanProxy. Habe aber nichts gescheides gefunden.
 
Zurück