Tomcat JMX - Verbindung zu server aber nicht finden, der MBean ich will
Bin ich zu schreiben versucht, ein client-Dienstprogramm, das Verbindung zu Tomcat mittels JMX und Blick auf den status der Verbindung datasource.
Ich habe die folgende VM-Argumente in $CATALINA_HOME/bin/setenv.bat und Neustart von Tomcat
set JAVA_OPTS=-Xms512M -Xmx1024M -XX:MaxPermSize=256M %JAVA_OPTS%
set CATALINA_OPTS=-Dcom.Sonne.management.jmxremote -Dcom.Sonne.management.jmxremote.port=9004 -Dcom.Sonne.management.jmxremote.authenticate=false -Dcom.Sonne.management.jmxremote.ssl=false %CATALINA_OPTS%
Ich bin nicht sehr vertraut mit dem JMX-so bin ich nur ein Spiel bekommen das Gefühl davon.
Das Dienstprogramm, die ich Schreibe, wird ausgeführt außerhalb von Tomcat. Ich schrieb den folgenden test, um zu versuchen, Zugriff auf datasource-Mbean-Objekt in Tomcat
aber aus irgendeinem Grund ist es nicht zu finden.
public class GuiMonitor {
public static void main(String[] args){
try{
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
final List<MBeanServer> servers = new LinkedList<MBeanServer>();
servers.add(ManagementFactory.getPlatformMBeanServer());
servers.addAll(MBeanServerFactory.findMBeanServer(null));
System.out.println("MbeanServers " + servers.size());
for(final MBeanServer server : servers){
System.out.println("Server : " + server.getClass().getName());
}
MBeanServer mbsc = ManagementFactory.getPlatformMBeanServer();
System.out.println(mbsc.queryMBeans(null, null));
ObjectName on = new ObjectName("Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name=\"jdbc/appdb\"");
System.out.println("ObjectName : " + on.toString());
System.out.println(mbsc.getAttribute(on, "Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name=\"jdbc/appdb\""));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ich habe eine JSP-Seite, die ich im internet gefunden das wenn ich den upload auf den webapps-Ordner und führen Sie es, es zeigt alle verfügbaren
MBeans in Tomcat. Das Objekt, string name, den ich oben verwendet kamen aus den Namen, die gemeldet wurde, sowohl auf der jsp-Seite, die ich benutzt und Jconsole, so dass es existiert.
Die Ausgabe des obigen Programms ist unten gezeigt
MbeanServers 2
Server : com.sun.jmx.mbeanserver.JmxMBeanServer
Server : com.sun.jmx.mbeanserver.JmxMBeanServer
[com.sun.management.OperatingSystem[java.lang:type=OperatingSystem], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Tenured Gen], sun.management.MemoryPoolImpl[java.lang:type=MemoryPool,name=Perm Gen], java.util.logging.Logging[java.util.logging:type=Logging], sun.management.CompilationImpl[java.lang:type=Compilation], javax.management.MBeanServerDelegate[JMImplementation:type=MBeanServerDelegate], 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.HotSpotDiagnostic[com.sun.management:type=HotSpotDiagnostic], 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]]
ObjectName : Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name="jdbc/appdb"
javax.management.InstanceNotFoundException: Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name="jdbc/appdb"
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getMBean(DefaultMBeanServerInterceptor.java:1094)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.getAttribute(DefaultMBeanServerInterceptor.java:662)
at com.sun.jmx.mbeanserver.JmxMBeanServer.getAttribute(JmxMBeanServer.java:638)
at com.bt.c21.c21mon.C21GuiMonitor.main(C21GuiMonitor.java:39)
Ein paar Fragen
- Ist die URL korrekt? Ich kenne die port-Nummer korrekt ist, aber ich bin nicht sicher, dass der service-name. Der service-name "jmxrmi:" ich bin mit der URL ist nur eine, die ich sah in einem der Beispiele, die ich schaue.
Habe ich das Gefühl, dass dies die Verbindung zu einem anderen MBeanServer. Ich vermute das, weil wenn man sich die Ausgabe des mbsc.queryMBeans(null, null), es gibt nichts tomcat-spezifisch. Welche service-Namen verwende ich für die Tomcat-Instanz?
-
Wenn die URL korrekt ist, dann ist der service-name immer jmxrmi? Und warum tut Sie es nicht finden, die "Catalina:type=" DataSource path=/appdb,host= "localhost" class=javax.sql.DataSource,name=\"jdbc/appdb\"" - Eintrag?
-
Ich habe gesehen, dass viele Beispiele dafür, wie dies zu tun, und die meisten verwenden eine andere Methode, um den MbeanServer. Ein paar Beispiele, die ich gesehen habe, sind
ManagementFactory.getPlatformMBeanServer()
MBeanServerFactory.findMBeanServer(null)
getMBeanServerConnection() -
Wie bereits erwähnt, ist das Dienstprogramm, die ich Schreibe, ist eine ganz normale java Anwendung, die ausgeführt wird, außerhalb des tomcat. Gibt es irgendeine andere Konfiguration, die ich verpasst habe? Ich schaue mir mehrere Beispiele und die Mehrheit sprechen über das erstellen von MBeans und es ist in der Regel Verweise auf die Zuhörer. Wie ich bin nicht die Schaffung einer neuen Mbeans aber nur das Lesen der Werte der bestehenden, muss ich konfigurieren eines Listeners?
Bearbeiten
Scheint es, dass getPlatformMbeanServer() ist nicht Rückkehr die richtige JVM-Instanz. Ich habe versucht, die folgenden
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
System.out.println("Query2 : " + conn.queryMBeans(null, null));
Und dieser hat wieder einige Tomcat-spezifische Werte. Aber ich bin noch nicht in der Lage zu Holen Sie sich die jdbc/appdb datasource.
krtek - ich werde nicht in der Lage sein zu verwenden der JMX-Konsole, wie ich Plane, es zu tun alle manuell mit der Absicht, die Automatisierung der it.
Edit 2
Ok, ich habe herausgefunden, was ich falsch machte. Anfangs war ich versucht, um die Werte abzurufen, wie
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName on = new ObjectName("Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name=\"jdbc/appdb\"");
mbsc.getAttribute(on, "Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name=\"jdbc/appdb\""));
Oben ist falsch, weil der zweite parameter für mbsc.getAttribute soll das Attribut in der Mbean nicht dem String name.
Dies gab mir die richtigen Attribut-Werte
MBeanServerConnection conn = jmxc.getMBeanServerConnection();
ObjectName on = new ObjectName("Catalina:type=DataSource,path=/appdb,host=localhost,class=javax.sql.DataSource,name=\"jdbc/appdb\"");
mbsc.getAttribute(on, "numIdle")
Und ich habe auch den MBeanServer und ich war mit von getPlatformMbeanServer() getMBeanserverConnection(). Ich muss zugeben, dass ich nicht ganz verstehen den Unterschied aus, denn da Tomcat läuft auf der gleichen JVM wie der eine kehrte von getPlatformMbeanServer(). Bedeutet es, dass getPlatformMbeanServer() wird erst dann wieder Sonne-spezifische Mbeans? und getMBeanserverConnection() sind?
Dank
Hallo Krtek - Von lokalen JVM meinst du die JVM, wo die Anwendung, die ich benutze, um die Verbindung zu Tomcat ausgeführt wird?
Ja, genau 🙂
InformationsquelleAutor ziggy | 2011-01-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Denn Sie sind die erste Instanz der JMX-server für die client-JVM, nicht die Tomcat.
Dies ist Recht:
Aber Sie sollte auch weiterhin mit so etwas wie:
Testen Sie Ihre query-string verwenden Sie ein tool wie Der JMX-Konsole.
ManagementFactory.getPlatformMBeanServer() gibt die JMX-server für die aktuelle JVM-Instanz, nicht auf der Fernbedienung ein.
Ich das Programm erneut ausführen wieder bei der Tomcat nicht läuft und ich bekomme die folgende Fehlermeldung "Connection refused to host: localhost;". Ich bekomme die gleiche Fehlermeldung wenn ich die port-Nummer ändern, um eine andere als die 9004. Durch die Art und Weise der tomcat-Instanz ist lokal, nicht remote)
- Ja, weil Sie tun, öffnen Sie eine Verbindung zum Tomcat-JVM und dann vergessen Sie es und Fragen Sie nach dem JMX-server des lokalen JVM. Sie haben zu verwenden, die Verbindung weiter. Das war mein Punkt.
InformationsquelleAutor krtek