接口定义:
public interface HelloMBean {
public String getName();
public void setName(String name);
public void print();
}
实现接口:
public class Hello implements HelloMBean {
private String name = "";
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void print() {
System.out.println("Hello, " + name + "!!!");
}
}
Server端
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMISocketFactory;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import javax.management.remote.JMXAuthenticator;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXPrincipal;
import javax.management.remote.JMXServiceURL;
import javax.management.remote.rmi.RMIConnectorServer;
import javax.security.auth.Subject;
import com.sun.jdmk.comm.HtmlAdaptorServer;
public class JmxServer {
private final AtomicBoolean runningFlag = new AtomicBoolean(true);
public static void main(String[] args) throws Exception
{
String ipString= "127.0.0.1";
String port = "31999";
//客户端需要用的认证信息
String userName = "userName";
String password = "passWord";
//创建server
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();
//ObjectName testMBeanName = new ObjectName("helloMBeanDomain:name=helloMBean");
ObjectName testMBeanName = new ObjectName("helloMBeanDomain", "type", "HelloMBean");
//创建对象
HelloMBean mbean = new Hello();
//注册对象到mBeanServer
mBeanServer.registerMBean(mbean, testMBeanName);
//监听
JMXConnectorServer jmxConnectorServer = createMBeanServerConnection(ipString, port, userName, password);
jmxConnectorServer.start();
// 启动HtmlAdaptorServer适配器,这样远程可以通过网页调用服务端程序:http://192.168.1.189:9999/ (server端ip:port)
HtmlAdaptorServer adaptor = new HtmlAdaptorServer();
ObjectName adaptorName = new ObjectName("jmxAdaptor:name=adaptor,port=5050");
mBeanServer.registerMBean(adaptor, adaptorName);
adaptor.setPort(9999);
adaptor.start();
}
/**
*
* @param ip server端ip
* @param jmxport 端口号
* @param userName 认证用的用户名
* @param password 认证用的密码
*/
public static JMXConnectorServer createMBeanServerConnection(String ip, String jmxport, String userName, String password) throws IOException
{
String jmxURLString = "service:jmx:rmi:///jndi/rmi://" + ip + ":" + jmxport + "/jmxrmi";
JMXServiceURL jmxURL = new JMXServiceURL(jmxURLString);
Map<String, Object> jmxEnvironmen = new HashMap<String, Object>();
//credentials n. 证书;文凭;
jmxEnvironmen.put("jmx.remote.credentials", new String[]{userName, password});
RMISocketFactory rmiFactory = RMISocketFactory.getDefaultSocketFactory();
//Registry n. 注册;登记处;
LocateRegistry.createRegistry(31999, null, rmiFactory);
jmxEnvironmen.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, rmiFactory);
// 需要认证则这么写:Authenticator n. 认证者;认证器
JMXAuthenticator auth = createJMXAuthenticator();
jmxEnvironmen.put(JMXConnectorServer.AUTHENTICATOR, auth);
JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxURL , jmxEnvironmen, ManagementFactory.getPlatformMBeanServer());
return jmxConnectorServer;
}
/**
* 认证
* @return
*/
private static JMXAuthenticator createJMXAuthenticator()
{
return new JMXAuthenticator()
{
public Subject authenticate(Object credentials)
{
String[] sCredentials = (String[]) credentials;
if (null == sCredentials || sCredentials.length != 2)
{
throw new SecurityException("Authentication failed!");
}
String userName = sCredentials[0];
String pValue = sCredentials[1];
if ("userName".equals(userName) && "passWord".equals(pValue))
{
Set<JMXPrincipal> principals = new HashSet<JMXPrincipal>();
principals.add(new JMXPrincipal(userName));
return new Subject(true, principals, Collections.EMPTY_SET, Collections.EMPTY_SET);
}
throw new SecurityException("Authentication failed!");
}
};
}
}
client端
package jmx;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import javax.management.Attribute;
import javax.management.JMX;
import javax.management.MBeanInfo;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
import org.hyperic.sigar.Sigar;
import org.hyperic.sigar.SigarException;
import jmx.os.property.IMonitorService;
import jmx.os.property.MonitorInfoBean;
import jmx.os.property.MonitorServiceImpl;
public class JmxClient {
private static String rmiPort = "31999";
private static String ip = "192.168.1.189"; //server端ip
//private static String ip = "127.0.0.1";
private static String userName = "userName";
private static String passWord = "passWord";
public static void main(String[] args) throws Exception
{
//ObjectName.getInstance(String domain, String key, String value)
//返回 ObjectName 的实例,该 ObjectName 可用于任何使用 new ObjectName(domain, key, value) 获得的对象可以使用的地方。
//ObjectName hello_name = new ObjectName("helloMBeanDomain", "type", "HelloMBean");
ObjectName hello_mbeanName = new ObjectName("helloMBeanDomain:type=HelloMBean");
JMXConnector jmxConnector = getJMXConnector(ip, rmiPort, userName, passWord);
// MBeanServerConnection mbs = jmxConnector.getMBeanServerConnection();
// ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy(mbs, ManagementFactory.THREAD_MXBEAN_NAME, ThreadMXBean.class);
// System.out.println("getThreadCount " + threadBean.getThreadCount());//线程数
MBeanServerConnection mBeanServerConnection = jmxConnector.getMBeanServerConnection();
//print domains
System.out.println("Domain:---------------------");
String domains[] = mBeanServerConnection.getDomains();
for(int i = 0; i < domains.length; i++) {
System.out.println("\t Domain[" + i +"] = " + domains );
}
//MBean count
System.out.println("MBean count = " + mBeanServerConnection.getMBeanCount());
//process attribute
mBeanServerConnection.setAttribute(hello_mbeanName, new Attribute("Name", "new value"));//set value
System.out.println("Name = " + mBeanServerConnection.getAttribute(hello_mbeanName, "Name"));//get value
//invoke via proxy
HelloMBean proxy = (HelloMBean) MBeanServerInvocationHandler.newProxyInstance(mBeanServerConnection, hello_mbeanName, HelloMBean.class, false);
proxy.setName("albert");
proxy.print();
//invoke via rmi
mBeanServerConnection.invoke(hello_mbeanName, "print", null, null);
//get mbean information
MBeanInfo mBeanInfo = mBeanServerConnection.getMBeanInfo(hello_mbeanName);
System.out.println("Hello Class: " + mBeanInfo.getClassName());
for(int i = 0; i < mBeanInfo.getAttributes().length; i++) {
System.out.println("Hello Attribute: " + mBeanInfo.getAttributes()[i].getName());
}
for(int i = 0; i < mBeanInfo.getOperations().length; i++) {
System.out.println("Hello Operation: " + mBeanInfo.getOperations()[i].getName());
}
//ObjectName of MBean
System.out.println("all ObjectName:--------------");
Set set = mBeanServerConnection.queryMBeans(null, null);
for(Iterator it = set.iterator(); it.hasNext();) {
ObjectInstance objectInstance = (ObjectInstance) it.next();
System.out.println("\t" + objectInstance.getObjectName());
}
HelloMBean helloMBean = JMX.newMXBeanProxy(mBeanServerConnection, hello_mbeanName, HelloMBean.class);
//System.out.println("helloMBean: " + helloMBean.toString());
helloMBean.setName("firstName: wenhao");
helloMBean.print();
helloMBean.setName("LastName: wang");
helloMBean.print();
jmxConnector.close();
}
/**
* 建立连接
* @param ip 服务端ip
* @param jmxport 服务端port
* @param userName 认证用的用户名
* @param password 认证用的密码
*/
public static JMXConnector getJMXConnector(String ip, String jmxport, String userName, String password) throws IOException
{
JMXServiceURL jmxURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + ip + ":" + jmxport + "/jmxrmi");
Map<String, Object> jmxEnvironment = new HashMap<String, Object>();
// 如果服務端有认证,則客戶端也要这么写:
jmxEnvironment.put("jmx.remote.credentials", new String[] {userName, password});
JMXConnector connector = JMXConnectorFactory.connect(jmxURL, jmxEnvironment);
return connector;
}
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
稍后我会写一篇关于JMX比较详细的文章。
参考链接:
JMX: http://blog.csdn.net/DryKillLogic/article/details/38412913
JMX:http://www.cnblogs.com/FlyAway2013/p/jmx.html
JMX:http://www.cnblogs.com/dongguacai/p/5900507.html
JMX:http://blog.csdn.net/u013256816/article/details/52800742
JMX:http://blog.csdn.net/chaofanwei2/article/details/51291118
RMI:http://www.blogjava.net/zhenyu33154/articles/320245.html
RMI:http://code727.iteye.com/blog/1874271
RMI:http://blog.csdn.net/ppyy11223344/article/details/52691290
RMI:http://blog.csdn.net/a19881029/article/details/9465663
RPC:http://www.cnblogs.com/flyoung2008/archive/2011/11/12/2246282.html
Netty:
http://www.infoq.com/cn/presentations/netty-architecture-analysis-and-industry-application?utm_source=infoq&utm_medium=videos_homepage&utm_campaign=videos_row3#10006-weixin-1-52626-6b3bffd01fdde4900130bc5a2751b6d1