Zentraler MBeanServer

kyroding

Grünschnabel
Hallo Leute ... Ich habe ein großes Problem.

Und zwar arbeite ich seit kurzem mit JMX. Problem daran ist das das es nicht möglich ist
einen zentralen MBeanserver zu erstellen an dem sich clients anmelden können und ihre eigenen MBeans(die ja quasi auf nem entfernten Rechner sind) zu registrieren. weil die funktion registerMBean nur auf der Serverseite vorhanden ist nicht aber auf der Client Seite.

Vielleicht denk ich nur falsch und jemand hat eine einfachere Lösung.

Gruß Kyro
 
Hallo,

schau mal hier:
Unser Server Bootstrapper:
Java:
/**
 * 
 */
package de.tutorials;

import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.util.concurrent.TimeUnit;

import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;

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

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {

        System.out.println("Starting RMI Registry...");
        LocateRegistry.createRegistry(9999);
        System.out.println("RMI Registry started!");

        MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();
        ObjectName tutorialsObjectName = new ObjectName("de.tutorials:*");

        JMXServiceURL serviceURL = new JMXServiceURL(
                "service:jmx:rmi:///jndi/rmi://localhost:9999/tutorialsJMXServer");
        JMXConnectorServer connectorServer = JMXConnectorServerFactory
                .newJMXConnectorServer(serviceURL, null, mbeanServer);
        connectorServer.start();

        while (true) {
            System.out
                    .println("Checking for mbeans in de.tutorials Namespace...");
            for (ObjectInstance objectInstance : mbeanServer.queryMBeans(
                    tutorialsObjectName, null)) {
                System.out.println(objectInstance.getObjectName());
            }
            System.out.println("############");
            TimeUnit.SECONDS.sleep(5L);
        }
    }
}

Unser Client:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 * 
 */
public class Client implements ClientMBean{

}

Unser ClientMBean-Interface:
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Thomas.Darimont
 *
 */
public interface ClientMBean {

}

Unser ClientBootstrapper:
Java:
/**
 * 
 */
package de.tutorials;

import java.util.UUID;
import java.util.concurrent.TimeUnit;

import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

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

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        String clientId = "Client_" + UUID.randomUUID();
        JMXServiceURL url = new JMXServiceURL(
                "service:jmx:rmi:///jndi/rmi://localhost:9999/tutorialsJMXServer");
        JMXConnector connector = JMXConnectorFactory.connect(url, null);
        MBeanServerConnection beanServerConnection = connector
                .getMBeanServerConnection();
        ObjectName clientObjectName = new ObjectName("de.tutorials:name="
                + clientId + ",type=Client");
        beanServerConnection.createMBean("de.tutorials.Client",
                clientObjectName);

        TimeUnit.SECONDS.sleep(10L);

        beanServerConnection.unregisterMBean(clientObjectName);
    }

}

Die Ausgabe auf dem Server mit ein paar Clients:
Code:
Starting RMI Registry...
RMI Registry started!
Checking for mbeans in de.tutorials Namespace...
############
Checking for mbeans in de.tutorials Namespace...
############
Checking for mbeans in de.tutorials Namespace...
de.tutorials:name=Client_8186117c-e68c-4141-969d-7ba7d0ebda74,type=Client
############
Checking for mbeans in de.tutorials Namespace...
de.tutorials:name=Client_8186117c-e68c-4141-969d-7ba7d0ebda74,type=Client
############
Checking for mbeans in de.tutorials Namespace...
############
Checking for mbeans in de.tutorials Namespace...
de.tutorials:name=Client_ffeb13c7-dbc0-4818-8fd8-8473839147b3,type=Client
############
Checking for mbeans in de.tutorials Namespace...
de.tutorials:name=Client_c34f5d08-2834-46a0-960f-dc39784bc48b,type=Client
de.tutorials:name=Client_b1e1d6f3-3206-47b0-8406-973f62278594,type=Client
de.tutorials:name=Client_75a9228a-6da0-4086-9fc1-86d6c00d392d,type=Client
de.tutorials:name=Client_ffeb13c7-dbc0-4818-8fd8-8473839147b3,type=Client
############
Checking for mbeans in de.tutorials Namespace...
de.tutorials:name=Client_3a62e11f-8c2e-4878-9f5b-bbf4e1146fd7,type=Client
de.tutorials:name=Client_c34f5d08-2834-46a0-960f-dc39784bc48b,type=Client
de.tutorials:name=Client_b1e1d6f3-3206-47b0-8406-973f62278594,type=Client
de.tutorials:name=Client_75a9228a-6da0-4086-9fc1-86d6c00d392d,type=Client
############
Checking for mbeans in de.tutorials Namespace...
de.tutorials:name=Client_3a62e11f-8c2e-4878-9f5b-bbf4e1146fd7,type=Client
############
Checking for mbeans in de.tutorials Namespace...
############

Siehe auch hier:
http://www.tutorials.de/forum/j2ee/227940-jmx-mit-rmi-adaptor-mx4j.html

Gruß Tom
 
Danke erstmal für die schnelle antwort.

Ich glaube ich habe noch einige Details vergessen.
Zum einen muss meine Application unter java 1.4 laufen... zu diesem Zweck habe ich mir die
JMX-Libarys runtergeladen und eingebunden ... Problem dabei ist das schon beim erstellen des Servers eine Modifikation vorgenommen werden muss:

die Zeile :

MBeanServer mbeanServer = ManagementFactory.getPlatformMBeanServer();

in:
MBeanServer mbeanServer = MBeanServerFactory.createMBeanServer();

(Management Faktory in libarys nicht vorhanden)

dann funktoniert der Server erstmal...
So in etwa wie im Beispiel hatt ich das schon mit dem Client probiert nur...
sie Sache ist nur die : man kann mit der Funktion createMBean nur mbeans kreieren welche der Server kennt (deswegen gibt man ja auch nur nen String als quasi pfad mit .// mbeans müssen im paket des Servers liegen)....

eigentlich müsste man die Funtion registermbean im Client aufrufen können... gerade diese ist aber nur dem Server vorbehalten.

vielleicht denk ich nur falsch aber das haben meine bisherigen Recherchen ergeben...

das einzige was ich jetzt noch denke ist das mit diesem getPlatformserver in deinem Beispiel andere Möglichkeiten offen sind (Beispiel registerMbean)...


Ich bekomme bei mir beim start des Client folgenden Fehler.

javax.management.ReflectionException: The MBean class could not be loaded by the default loader repository

legt man das mbeaninterface und die dazugehörige klasse in den server geht es...das ist aber so nicht gewollt

weil der Server soll zentral irgenwo stehen und die MBeans von verschiedenen vms(auf anderen rechnern) verwalten können.

so danke fürs lesen ;)
 
Zuletzt bearbeitet:
Zurück