服务端代码如下
package com.rmi;
import java.rmi.registry.LocateRegistry;
import java.util.HashMap;
import java.util.Map;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class Server {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
LocateRegistry.createRegistry(1234);//必须要这句,参数为端口号
ObjectName helloName = new ObjectName("QianYu:type=oamp,name=hello");
HelloWorld hello = new HelloWorld();
MBeanServer server = MBeanServerFactory.createMBeanServer();
// provide a valid username and password (e.g., via program arguments)
String user = "monitorRole";
String pw = "password";
// place the username and password in a string array of credentials that
// can be used when making the connection to the remote JMX agent
String[] credentials = new String[] { user, pw };
// the string array of credentials is placed in a map keyed against the
// well-defined credentials identifier string
Map<String, String[]> props = new HashMap<String, String[]>();
props.put("jmx.remote.credentials", credentials);
// supply the map of credentials to the connect call
JMXServiceURL address =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");
JMXConnectorServer cserver =
JMXConnectorServerFactory.newJMXConnectorServer(address, props, server);
cserver.start();
server.registerMBean(hello, helloName);
}
}
以下是客户端代码:
package com.rmi;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// provide a valid username and password (e.g., via program arguments)
String user = "monitorRole";
String pw = "password";
// place the username and password in a string array of credentials that
// can be used when making the connection to the remote JMX agent
String[] credentials = new String[] { user, pw };
// the string array of credentials is placed in a map keyed against the
// well-defined credentials identifier string
Map<String, String[]> props = new HashMap<String, String[]>();
props.put("jmx.remote.credentials", credentials);
// supply the map of credentials to the connect call
JMXServiceURL address =
new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(address, props);
// it is a trivial matter to get a reference for the MBean server
// connection to the remote agent
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
connector.connect();
ObjectName objectName=new ObjectName("hello:name=hello");
if(!mbsc.isRegistered(objectName)){
mbsc.createMBean("com.rmi.HelloWorld", objectName,null,null);
}
System.out.println("\nMBean count = " + mbsc.getMBeanCount());
for (ObjectInstance object : mbsc.queryMBeans(null, null)) {//服务器上的所有MBean
System.out.println("object.getObjectName="+object.getObjectName());
}
//hello对象属于远程的对象,调用sayHello方法,则是调用服务器端的sayHello方法
final HelloWorldMBean hello = JMX.newMBeanProxy(mbsc, objectName,
HelloWorldMBean.class);
// hello.setName("Peter");
hello.sayHello();
// ObjectName unObjectName=new ObjectName("hello:name=hello");
// Hashtable map=new Hashtable();
// map.put("name", "hello");
//unregister MBean
// ObjectName unObjectName=new ObjectName("hello",map);
// ObjectName unObjectName=ObjectName.getInstance("hello:name=hell*");
// for (ObjectInstance object : mbsc.queryMBeans(unObjectName, null)) {//这里可根据查询结果进行注销MBean
// mbsc.unregisterMBean(object.getObjectName());
// }
System.out.println("\nMBean count = " + mbsc.getMBeanCount());
System.out.println("end");
}
}
以下是HelloWorldMBean
package com.rmi;
import java.io.Serializable;
public interface HelloWorldMBean extends Serializable{
void setName(String name);
String getName();
void sayHello();
String getHelloString();
int getId();
String toString();
int hashCode();
boolean equals( Object obj);
HelloWorldMBean getThis();
}
以下是HelloWorld.java类:
package com.rmi;
import java.io.Serializable;
import java.util.concurrent.atomic.AtomicInteger;
import javax.management.AttributeChangeNotification;
import javax.management.MBeanRegistration;
import javax.management.MBeanServer;
import javax.management.NotificationBroadcasterSupport;
import javax.management.ObjectName;
public class HelloWorld implements HelloWorldMBean, Serializable{
static AtomicInteger count = new AtomicInteger();
private static final long serialVersionUID = 1627976932729278650L;
int id = 0;
String name;
public synchronized void setName(String name) {
this.name = name;
}
public synchronized String getName() {
return name;
}
public synchronized void sayHello() {
System.out.println(getHelloString());
}
public synchronized String getHelloString() {
// System.out.println("1111");
return "Hello, " + name;
}
public synchronized int getId() {
return id;
}
public HelloWorldMBean getThis() {
return this;
}
}