13. März 2007

JMX mit Tomcat 4.x und JDK 1.4

Stichworte:

JMX, MX4J, J2K, JDK1.4

Problem:

Zur Serverüberwachung des Tomcat soll JMX unter JDK 1.4 verwendet werden.

Ursache:

JDK 1.4 unterstützt von Haus aus JMX noch nicht.

Lösung:

Es gibt ein JMX-Toolkit: MX4J unter http://mx4j.sourceforge.net/ (dort allerdings nur in Version 3, die keine RMI-Adaptor zur Verfügung stellt).

Mit MC4J gibt es einen grafischen Client (http://mc4j.org). In diesem sind noch die alten MX4J-Libs mit dem richtigen Adaptor vorhanden.

Die mx4j-tools-1.1.1.jar muss server\lib kopiert werden.



In der Datei conf\jk2.properties muss folgendes eingetragen werden:

mx.enabled=true

#RMI enablen

mx.jrmpPort=1099

mx.jrmpHost=localhost

#Optional auch den HttpAdaptor anschalten

mx.httpPort=9999

mx.httpHost=localhost


Einen Connect über einen Java-Client geht so:

import java.util.Hashtable;

import javax.naming.Context;

import mx4j.connector.rmi.jrmp.JRMPConnector;

public class JMXTest {

public JMXTest() {

}

static public void main(String[] sarr) {

try {

String jndiName = "jrmp";

JRMPConnector connector = new JRMPConnector();

Hashtable environment = new Hashtable();

environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");

environment.put(Context.PROVIDER_URL, "rmi://localhost:9000");

connector.connect(jndiName, environment);

mx4j.connector.RemoteMBeanServer server = connector.getRemoteMBeanServer();

Integer count = server.getMBeanCount();

System.out.println("MBeans: "+count.intValue());

}

catch (Exception e) {

e.printStackTrace();

}

}

}


Eigen MBean erstellen. Es sollte die mx4j-jmx.jar (befindet sich in der Standard-Distribution in server\lib) in common\lib kopiert werden, damit alle WebApps Zugriff auf die selbe JMX-Implementierung haben.

Zunächst ein Interface erstellen, dieses muss im Tomcat immer die Namensgebung

xxxxMBean

haben.

public interface SystemInfoMBean
{
public long getMaxMemory();

}

Die Implementierung der MBean sieht wie folgt aus:

public class SystemInfo implements SystemInfoMBean {


public SystemInfo() {
MBeanServer server = getServer();

ObjectName name = null;
try {
name = new ObjectName("Application:Name=SystemInfoBean,Type=System");
server.registerMBean(this, name);
} catch (Exception e) {
e.printStackTrace();
}

}


private MBeanServer getServer() {
MBeanServer mbserver = null;

ArrayList mbservers = MBeanServerFactory.findMBeanServer(null);

if (mbservers.size() > 0) {
mbserver = (MBeanServer) mbservers.get(0);
}

if (mbserver != null) {
System.out.println("Found our MBean server");
} else {
mbserver = MBeanServerFactory.createMBeanServer();
}

return mbserver;
}



public long getMaxMemory() {
return Runtime.getRuntime().maxMemory()/1024;
}
}

Keine Kommentare: