必须以MBean结尾
public interface HelloMBean
{
public String getName();
public void setName(String name);
public String getAge();
public void setAge(String age);
public void helloWorld();
public void helloWorld(String str);
public void getTelephone();
}
public class Hello implements HelloMBean {
String name;
String age;
@Override
public String getName() {
System.out.println("return:" + name);
return this.name;
}
@Override
public void setName(String name) {
this.name = name;
System.out.println(name);
}
@Override
public String getAge() {
return null;
}
@Override
public void setAge(String age) {
}
@Override
public void helloWorld() {
}
@Override
public void helloWorld(String str) {
this.age = str;
System.out.println("helloWorld:");
}
@Override
public void getTelephone() {
System.out.println(age);
}
}
注册mbean并开启mbeanserver服务
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import javax.management.JMException;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
public class HelloAgent {
public static void main(String[] args) throws JMException, Exception {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName helloName = new ObjectName("mydomin:name=hello");
//create mbean and register mbean
server.registerMBean(new Hello(), helloName);
try {
//这个步骤很重要,注册一个端口,绑定url后用于客户端通过rmi方式连接JMXConnectorServer
LocateRegistry.createRegistry(9999);
//URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
System.out.println("begin rmi start");
jcs.start();
System.out.println("rmi start");
} catch (RemoteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
连接mbeanserver
import java.io.IOException;
import javax.management.Attribute;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class Client {
public static void main(String[] args) throws IOException, Exception, NullPointerException {
JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
JMXConnector jmxc = JMXConnectorFactory.connect(url, null);
MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
//ObjectName的名称与前面注册时候的保持一致
ObjectName mbeanName = new ObjectName("mydomin:name=hello");
System.out.println("Domains ......");
String[] domains = mbsc.getDomains();
for (int i = 0; i < domains.length; i++) {
System.out.println("doumain[" + i + "]=" + domains[i]);
}
System.out.println("MBean count = " + mbsc.getMBeanCount());
//设置指定Mbean的特定属性值
//这里的setAttribute、getAttribute操作只能针对bean的属性
//例如对getName或者setName进行操作,只能使用Name,需要去除方法的前缀
mbsc.setAttribute(mbeanName, new Attribute("Name", "杭州"));
mbsc.setAttribute(mbeanName, new Attribute("Age", "1990"));
String age = (String) mbsc.getAttribute(mbeanName, "Age");
String name = (String) mbsc.getAttribute(mbeanName, "Name");
System.out.println("age=" + age + ";name=" + name);
HelloMBean proxy = MBeanServerInvocationHandler.
newProxyInstance(mbsc, mbeanName, HelloMBean.class, false);
proxy.helloWorld();
proxy.helloWorld("migu");
proxy.getTelephone();
//invoke调用bean的方法,只针对非设置属性的方法
//例如invoke不能对getName方法进行调用
mbsc.invoke(mbeanName, "getTelephone", null, null);
mbsc.invoke(mbeanName, "helloWorld", new String[] {"I'll connect to JMX Server via client2"},
new String[] {"java.lang.String"});
mbsc.invoke(mbeanName, "helloWorld", null, null);
}
}
网友评论