# JBoss über service:jmx:rmi... verbinden?



## Sapperlot (9. Mai 2006)

Hallo,
ich möchte auf meinen JBoss Server über die JConsole auf die MBeans zugreifen, bzw. genereller gesagt:
Ich möchte JBoss über service:jmx:rmi  oder ähnlich erreichen. Ähnlich der Syntax.
service:jmx:rmi://localhost/jndi/rmi://localhost:1090/jmxconnector

ich kann in der JConsole eine LocalConnection mit dem JBoss aufbauen, und kann auch aus meiner Java Application über

InitialContext ic = new InitialContext();
RMIAdaptor server = (RMIAdaptor) ic.lookup("jmx/invoker/RMIAdaptor");
....
auf Jboss zugreifen.
Ich möchte jedoch auf folgende Weise verbinden.

final String jmxServiceURL = "service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi";
      System.out.println("Connecting to server...");
      MBeanServerConnection jmxServerConnection = JMXConnectorFactory.connect(
      new JMXServiceURL(jmxServiceURL), null).getMBeanServerConnection();


das funktoniert jedoch nicht.
Kann mir jemand weiterhelfen?
Muss diese Art der RMI-Verbindung erst im JBoss aktiviert werden? Wenn ja wie?
Stimmt vielleicht meine service:jmx:rmi Syntax nicht?

Gruß, bastian


----------



## Thomas Darimont (9. Mai 2006)

Hallo!

Um auf den JBoss AS ueber die JMX Console zuzugreifen must du die hier:
http://wiki.jboss.org/wiki/Wiki.jsp?page=UseJDK5JConsole
beschriebenen Schritte durchfuehren.
Anschliessend kannst du die JMXServiceURL wie in dem Beispiel:
http://www.tutorials.de/forum/j2ee/243858-mbeanserver-invoke-funktioniert-nicht.html#post1269902
angeben.

Gruss Tom


----------



## Sapperlot (9. Mai 2006)

Och neeee. Ich war wieder so nah dran an der Lösung...
Scheint zu funktionieren...
Danke
Um jetzt aber noch einen Lerneffekt zu haben:

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.port=12345"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"

Die ersten beiden Zeilen leuchten mir ein, die dritte habe ich immer weggelassen, weil ich nie wusste für was die da steht.
Kannst Du mir erklären was diese Zeile bewirkt, bzw. warum es nicht funktoiniert, wenn man diese weg lässt?

Weiter hat mich auch verwirrt, dass in vielen Tutorials nach dieser dritten Zeile auch noch ein Klassenname stand. Jetzt im Nachhinein nehme ich an, dass es sich hierbei aber um die main-Klasse der Anwendung die ausgeführt werden sollte handelte und das Beispiel das ich gesehen habe der Aufruf der Klasse per Command-Line war.
java -D.... -Dcom.sun.management.jmxremote.ssl=false myClass

Danke nochmal auf jeden Fall.

Gruß, Bastian


----------



## Thomas Darimont (9. Mai 2006)

Hallo!



> JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote.ssl=false"


Mit dieser Zeile sagst du dem JMX Subsystem dass es zur Erzeugung der RMI Verbindung eine ganz normale SocketFactory und keine SSLSocketFactory benutzen soll. Wuerdest du dieses Flag nicht mitgeben koenntest du dich nur Verbinden, wenn du die SSL Umgebung (Trust Store + entsprechende SSL Zertifikate) Konfiguriert haettest (genau das Problem hatte ich gestern...). In Produktiv Umgebungen sollte man natuerlich SSL einsetzen...

Gruss Tom


----------



## Sapperlot (10. Mai 2006)

Funktioniert die ganze Sache denn auch mit dem WebSphere Application Server (V5.1)?

Gruß, Bastian


----------



## Thomas Darimont (10. Mai 2006)

Hallo!

Der Websphere AS bietet eine Administrationsschnittstelle zum Zugriff auf den Server (AdminClient):
http://www-128.ibm.com/developerworks/websphere/techjournal/0302_cundiff/cundiff.html
http://www-128.ibm.com/developerworks/websphere/techjournal/0402_qiao/0402_qiao.html
Mit diesem kannst du auch auf den Internen MBeanServer des Websphere zugreiffen.
Wie die entsprechende JMX Service URL ausschaut, und welche Websphere spezifischen Sessings du setzten musst kann ich dir im Moment mangels websphere leider nicht sagen... vielleicht lade ich mir heute Abend mal die Evaluation Version...

Gruss Tom


----------



## Sapperlot (10. Mai 2006)

Hallo,
Danke, aber leider hilft mir das nicht weiter.
Mir geht es tatsächlich nur um die JMX Service URL und die Konfigurationen am WeSphere...
Falls ich was herausfinde, werde ich es posten.

Gruß, bastian


----------



## Thomas Darimont (10. Mai 2006)

Hallo!

Ich koennte mir vorstellen, dass der AdminClient intern auch die JMX API zum Verbinden mit dem MBeanServer in Websphere verwendet... eventuell einfach mal durch debuggen. Was du natuerlich auf keinen Fall machen darfst ist dekompilieren...

Btw.: hier noch ein weiterer Artikel zur Administration des Websphere ueber JMX:
http://www-128.ibm.com/developerworks/websphere/techjournal/0604_joines/0604_joines.html

Gruss Tom


----------



## Sapperlot (10. Mai 2006)

Der hier ist auch sehr schön.
Nen Beispiel wie man jetzt aber mit er JConsole schlussendlich die Verbindung herstellt ist leider auch nicht drin : (

http://www-128.ibm.com/developerworks/java/library/j-mxbeans/

gruß, Bastian


----------



## Thomas Darimont (10. Mai 2006)

Hallo!

Also zumindest komme ich an den (kleinen/kostenlosen (*)/geronimo basierten) *WebSphere Application Server Community Edition, Version 1.0.1.1* *2006-04-10* heran:

```
/**
 * 
 */
package de.tutorials;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

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

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

    /**
     * @param args
     */
    public static void main(String[] args) throws Exception {
        Map env = new HashMap();
        String[] credentials = new String[] { "system", "manager" }; //default
        env.put("jmx.remote.credentials", credentials);

        MBeanServerConnection connection = JMXConnectorFactory
                .connect(
                        new JMXServiceURL(
                                "service:jmx:rmi:///jndi/rmi://localhost:1099/JMXConnector"),
                        env)
                .getMBeanServerConnection();

        System.out.println(Arrays.toString(connection.getDomains()));
    }
}
```

Ausgabe:

```
[openejb, geronimo.boot, geronimo, geronimo.server, geronimo.config, geronimo.maven, geronimo.remoting, ]
```

Ich schau mir die Evaluation von Websphere (5.1/6.0) heute Abend mal an...

(*)http://www-128.ibm.com/developerworks/downloads/ws/wasce/?S_TACT=105AGX10&S_CMP=WESDL

Gruss Tom


----------



## Sapperlot (10. Mai 2006)

Hallo,
Kann ich bestätigen.
das Testprogramm funktioniert mit dem CommunityEdition Server auch bei mir.
Komischer Weise will die JConsole mit dem Server nicht so richtig.
Gruß, Bastian


----------



## Thomas Darimont (10. Mai 2006)

Hallo!

Die JConsole gibt bei mit folgende Fehler aus:


> C:\Documents and Settings\Tom>jconsole
> Error when synchronizing with MBeanServer : javax.management.InstanceNotFoundException: JMImplementation:type=MBeanServerDelegate


Wird wohl ein Sun spezifisches MBean sein...
//Edit Jap:
 * This <CODE>ObjectName</CODE> is:
  * <BR>
  * <CODE>JMImplementation:type=MBeanServerDelegate</CODE>.
  *
  * @since 1.5
  */ 
com.sun.jmx.mbeanserver.JmxMBeanServer implements SunJmxMBeanServer ...

Das wirds wohl vermutlich in IBMs JRE nicht geben... also wird die JConsole nur zur Ueberwachung von Sun JVMs. Hatte aber bis jetzt nirgends gelesen, dass jemand versucht haette mit der JConsoel nicht Sun JVMs zu monitoren...

//Edit2 ... quark...
Diese Community Edition verwendet mx4j als JMX-Bibliothek. Innerhalb von mx4j wird in mx4j.server.MX4JMBeanServer  im Ctor folgendes gemacht:

```
try
        {
            delegateName = new ObjectName("JMImplementation", "type", "MBeanServerDelegate");
        }
        catch(MalformedObjectNameException ignored) { }
```
Das JMImplementation  MBean scheint Standard zu sein...

Gruss Tom


----------



## Sapperlot (10. Mai 2006)

Der MBeanInspector hingegen funktoniert tadellos.
http://www.alphaworks.ibm.com/tech/mbeaninspector

Vielleicht find ich anhand diesem ja noch ein paar Hinweise, wie ich die Verbindung in meiner Anwendung herstellen könnte.
Der DefaultPort scheint jedenfalls 2809 zu sein, für rmi.

Gruß, Bastian


----------



## Sapperlot (12. Mai 2006)

Hallo,
Ich habe mir aus folgenden zwei Projekten jetzt zumindest einmal eine privisorische Lösung gebaut:
http://www.alphaworks.ibm.com/tech/mbeaninspector
und
http://publib.boulder.ibm.com/infoc...ere.exp.doc/info/exp/ae/rjmx_adminclient.html

Hierbei habe ich meine Testklasse in der Datei mbeaninspector.bat einfach durch die Startklasse des MBeaninspektors ersetzt.

Zur Erstellung meiner Klasse muss ich die Java Version des Websphere verwenden und diverse Klassen im Classpath verwenden, die das Beispiel benötigt.

Ziemlich umständlich und unkomfortabel.

gruß, Bastian


----------

