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

Nur Hinweis zum letzten Satz: Tomcat ist definitiv nicht innerhalb der gleichen JVM, läuft es in den gleichen PC, aber auf anderen JVM befinden. Und der Unterschied ist einfach: jmxc.getMBeanServerConnection() gibt die Instanz von JMX-server über eine remote-Verbindung (die Tomcat-JVM). ManagementFactory.getPlatformMBeanServer() gibt die JMX-server von der lokalen JVM.
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

Schreibe einen Kommentar