package com.fanshadoop.rmi;
import javax.management.InstanceAlreadyExistsException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import com.fanshadoop.notification.HelloWorld;
import com.sun.jdmk.comm.HtmlAdaptorServer;
/**
* JMX RMI连接器使用
*/
public class JMXBookAgent {
private MBeanServer server = null;
/**
* 构建MBeanServer
*/
public JMXBookAgent(){
System.out.println("\n\tCREATE the MBeanServer.");
server = MBeanServerFactory.createMBeanServer("JMXBookAgent");
}
/**
* 1)注册MBean
* 2)注册HTMLAdapter
* 3)注册RMIConnection
* 注意:HTMLAdapter和RMIConnection都是MBean的实现
*/
public void start() throws MalformedObjectNameException, NullPointerException,
InstanceAlreadyExistsException, MBeanRegistrationException, NotCompliantMBeanException {
ObjectName mxName = new ObjectName("com.fansjmx:name=helloworld");
server.registerMBean(new HelloWorld(), mxName);
startHTMLAdapter();
startRMIConnector();
}
protected void startRMIConnector() {
ObjectName connectorName = null;
try {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnectorServer cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
connectorName = new ObjectName("JMXBookAgent:name=RMIConnector");
server.registerMBean(cs, connectorName);
cs.start();
} catch (Exception e) {
}
}
protected void startHTMLAdapter() {
HtmlAdaptorServer adapter = new HtmlAdaptorServer();
ObjectName adapterName = null;
try {
adapter.setPort(9092);
// create the HTML adapter
adapterName = new ObjectName("JMXBookAgent:name=html,port=9092");
server.registerMBean(adapter, adapterName);
adapter.start();
} catch (Exception e) {
System.out.println("Error Starting HTML Adapter for Agent");
}
}
public static void main(String[] args) {
System.out.println("\n>>> START of JMXBook Agent");
System.out.println("\n>>> CREATE the agent...");
try {
JMXBookAgent agent = new JMXBookAgent();
System.out.println("\nAgent is Ready for Service...\n");
agent.start();
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (InstanceAlreadyExistsException e) {
e.printStackTrace();
} catch (MBeanRegistrationException e) {
e.printStackTrace();
} catch (NotCompliantMBeanException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
package com.fanshadoop.rmi;
import java.io.IOException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class RMIClientFactory {
public static JMXConnector getClient() throws IOException {
JMXServiceURL url = new JMXServiceURL(
"service:jmx:rmi:///jndi/rmi://localhost:9999/server");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
return jmxc;
}
public static void main(String[] args) {
try {
JMXConnector jmxc = RMIClientFactory.getClient();
ObjectName mxName;
mxName = new ObjectName("com.fansjmx:name=helloworld");
jmxc.getMBeanServerConnection().invoke(mxName, "printGreeting",
null, null);
} catch (MalformedObjectNameException e) {
e.printStackTrace();
} catch (NullPointerException e) {
e.printStackTrace();
} catch (InstanceNotFoundException e) {
e.printStackTrace();
} catch (MBeanException e) {
e.printStackTrace();
} catch (ReflectionException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
在运行时需要运行:rmiregistry 9999