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;
}
}