MBeanServer.invoke funktioniert nicht

Sapperlot

Mitglied
Hallo,

Plattform: Java 5
Thema: JMX, MBeans


Ich habe eine Anwendung, die sich mit einem Bea Weblogic Server vonnected geschrieben, über einen JMXConnector.

Nun wollte ich testweise folgende Methode / Operation mit Parametern aufrufen.
Ich kann Methoden ohne Parameter aufrufen. Funktoiniert.
Wenn ich aber eine mit Parametern aufrufe, dann gibt es eine ReflectionException.


http://java.sun.com/j2se/1.5.0/docs...ment/ThreadMXBean.html#getThreadUserTime(long)
Ist die getThreadUserTime...

Ich versuche sie wie folgt zu invoken:

MBeanServer mbs = .... MBeanServerObjekt INstantieren...
ObjectName obj = ObjectName instantieren....

//Anlegen von Parametern und Signatur:
Long[] myLongParam = {new Long(10)}; //Ein Array mit einem Long Element...
String[] myStringSignature = {new String("long"); //Die MEthode erwartet ein long, daher wird dieses in die Signatur geschrieben.


// Jetzt rufe ich die invoke Methode auf...
mbs.invoke(obj, "getThreadUserTime", myLongParam, myStringSignature);

//Laut allen Tutorials die ich im Web gefunden hatte sollte es so funktionieren.
Dennoch gibt es eine ReflectionException, weil wohl entweder der Parameter oder die Signatur, oder beides falsch sind.

Sieht hier jemand was falsch sein könnte?
Wäre froh, wenn mir jemand weiter helfen könnte.
Danke,

Gruß, Basti
 
Hallo!

Schau mal hier:

Ich starte meinen dummy "AppServer":
Java:
/**
 * 
 */
package de.tutorials;

/**
 * @author Tom
 *
 */
public class JMXRemoteExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println("Full blown JMX based J2EE Application Server started...");
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
Mit den Optionen:
java -cp . -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=4711 -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false de.tutorials.JMXRemoteExample

Anschließend kann ich mit folgendem Client die gewünschte Methode aufrufen.
Java:
/**
 * 
 */
package de.tutorials;

import java.lang.management.ManagementFactory;

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

/**
 * @author Tom
 * 
 */
public class JMXRemoteConnectorExample {

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        try {
            MBeanServerConnection connection = JMXConnectorFactory
                    .connect(
                            new JMXServiceURL(
                                    "service:jmx:rmi:///jndi/rmi://localhost:4711/jmxrmi"))
                    .getMBeanServerConnection();
            Object result = connection.invoke(ObjectName
                    .getInstance(ManagementFactory.THREAD_MXBEAN_NAME),
                    "getThreadUserTime", new Object[] { 1L },
                    new String[] { Long.TYPE.toString() });
            System.out.println(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Zeig doch mal die genaue Fehlermeldung inklusive StackTrace...

Gruß Tom
 
:)
? Es lag tatsächlich nur an den Parametern, die ich übergeben hatte.
Ich habe Deinen Invoke-Aufruf 1:1 übernommen und schon funktiert es...

Alles andere hat bei mir gepasst.

Vielen Dank. Hat mich gestern echt viel Nerven gekostet...


//EDIT:
Ich merk gerade etwas
Gestern hatte ich es auch richtig gemacht.
DER FEHLER WAR FOLGER
Ich habe der Methode den long-Wert 0 übergeben Und jetzt wo ich das weiss, fällt mir die Stelle auch im StackTrace auf :p Ärgerlich....

Gruß, Bastian
 
Zuletzt bearbeitet:
@Tom

was müßte geändert werden, wenn ich einen selbstgeschriebenen MBean der auf einem Application Server registriert ist abfragen möchte?

Das ganze ist mir noch nicht richtig klar:

Code:
 Object result = connection.invoke(ObjectName.getInstance(ManagementFactory.THREAD_MXBEAN_NAME),
                    "getThreadUserTime", new Object[] { 1L },
                    new String[] { Long.TYPE.toString() });

wie müßte es aussehen wenn ich die Methode getThreadCount() aufrufen würde?


Gruß T
 
Zuletzt bearbeitet:
Hallo,

schau mal hier:
Java:
package de.tutorials;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

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

/**
 * @author Tom
 * 
 */
public class JMXRemoteConnectorExample {

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

            ObjectName threadMxObjectName = ObjectName
                    .getInstance(ManagementFactory.THREAD_MXBEAN_NAME);

            MBeanServerConnection connection = JMXConnectorFactory
                    .connect(
                            new JMXServiceURL(
                                    "service:jmx:rmi:///jndi/rmi://localhost:4711/jmxrmi"))
                    .getMBeanServerConnection();
            
            ThreadMXBean threadMxBean = MBeanServerInvocationHandler.newProxyInstance(connection, threadMxObjectName, ThreadMXBean.class,false);
            System.out.println(threadMxBean.getThreadUserTime(1L));
            System.out.println(threadMxBean.getThreadCount());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Gruß Tom
 

Neue Beiträge

Zurück