很早就开始去了解这个了,不过一直都是皮毛,基本概念明白,具体api几乎一无不知。。。

认真看了几篇文章,做了测试,终于有所了解

参考 入门级别: http://www.cnblogs.com/agou/articles/286871.html http://www.cnblogs.com/allenny/articles/179208.html

写得最好的:http://www.cnblogs.com/yaohonv/archive/2012/02/08/jmx.html, 图也很清楚,不过初入门的时候看起来比较吃力, 其中对jmx-rmi有所涉及,不错,可惜实验不通。没地方下载jmxremoting.jar

这个相当不错:http://www.cnblogs.com/zjstar12/archive/2012/06/10/2544387.html

http://www.cnblogs.com/xzh31390080/articles/2231213.html 很精辟简练,不过只能是最后才可以看,初学者看了也白看。。 像我之前那样怎么看都没用。

个人理解:

关于mbean:

standard MBean,这种类型的MBean最简单: 一个接口,一个实现类即可,不需要任何其他类依赖,但是命名必须遵循一定的规范,例如我们的MBean为Hello,则接口必须为HelloMBean。

假如某个属性只有get方法,则说明这个属性是只读的,get/set都有的话,说明这个属性是可读可写的

DynamicMBean 可以动态拓展需要管控的资源,即允许bean里面的属性、方法可变,因此需要实现额外的方法:

http://www.cnblogs.com/zjstar12/archive/2012/06/10/2544387.html

package javax.management; public interface DynamicMBean{     public Object getAttribute( String attribute )throws AttributeNotFoundException, MBeanException,ReflectionException;

public void setAttribute( Attribute attribute )throws AttributeNotFoundException,InvalidAttributeValueException,MBeanException,ReflectionException;

public AttributeList getAttributes( String[] attributes );

public AttributeList setAttributes( AttributeList attributes );

public Object invoke( String actionName, Object[] params,String[] signature ) throws MBeanException,ReflectionExceptionn

public MBeanInfo getMBeanInfo(); }

openMBean及其他一些未规范的就不说了

关于jmx客户端都jmx服务端的访问:

1 通过浏览器,jmx client程序启用http协议,这个时候需要一个HTMLAdapter

2 jconsole。  不能访问? 看看: http://www.cnblogs.com/orientsun/archive/2012/07/25/2608525.html

3 程序访问?

a 通过JMXConnector

http://www.cnblogs.com/yaohonv/archive/2012/02/08/jmx.html

b 通过http协议,HTMLAdapter?

一些重要的接口:

ManagementFactory 专门生产MBeanServer

MBeanServer  一般就是MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();

这个很重要,主要就是通过它来管理mbean的,主要方法有:registerMBean,unRegisterMBean,addNotificationListenerremoveNotificationListener

createMBean/queryMBean

get/setAttributes

instantiate 不知道干什么的。。。

  

JMXServiceURL 创建ConnectorServer需要用到,

RMIConnectorServer  -> ConnectorServer

JMXConnector

待续。。

=========================================== 20140215 =========================================================

今天终于搞定!!

一个完整的例子贴上!!!:

package jmx;
public interface HelloMBean {
// management attributes
public String getName();
public void setName(String name);
// management operations
public void print();
}
package jmx;
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 + "!!" );
}
}
package jmx;

import java.lang.management.ManagementFactory;
import java.net.InetAddress;
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; public class JmxServer { private final AtomicBoolean runningFlag = new AtomicBoolean(true); /**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
try {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); String addr = "10.74.169.50:31999";//本机的话ip地址可以使用localhost或者127.0.0.1
JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://"
+ addr + "/jndi/rmi://" + addr + "/jmxrmi"); Map<String, Object> jmxEnvironment = new HashMap<String, Object>();
jmxEnvironment.put("jmx.remote.credentials", new String[] { "saf",
"asswrd" }); InetAddress ipInterface = InetAddress.getByName("10.74.169.50");
RMISocketFactory rmiFactory = RMISocketFactory.getDefaultSocketFactory();
//new AnchorSocketFactory(ipInterface,"false");
LocateRegistry.createRegistry(31999, null, rmiFactory); // 這個是必須的,否則報 no such object in table之類是異常!!!! 花了相當長時間才發現這點
jmxEnvironment.put(
RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,
rmiFactory); // 需要认证则这么写:
// JMXAuthenticator auth = createJMXAuthenticator();
// jmxEnvironment.put(JMXConnectorServer.AUTHENTICATOR, auth); JMXConnectorServer connector = JMXConnectorServerFactory
.newJMXConnectorServer(address, jmxEnvironment,
ManagementFactory.getPlatformMBeanServer());
HelloMBean mbean = new Hello();
ObjectName testMBeanName = new ObjectName(
"helloMBean:name=helloMBean");
testMBeanName = new ObjectName("helloMBeanDomain", "type",
"HelloMBean");
mbs.registerMBean(mbean, testMBeanName); connector.start();
} catch (Exception e) {
e.printStackTrace();
} // try {//这个好像没用
// synchronized (this) {
// while (runningFlag.get()) {
// this.wait();
// }
// }
// } catch (Exception e) {
//
// }
} private 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 ("saf".equals(userName) && "asswrd".equals(pValue)) {
Set principals = new HashSet();
principals.add(new JMXPrincipal(userName));
return new Subject(true, principals, Collections.EMPTY_SET,
Collections.EMPTY_SET);
}
throw new SecurityException("Authentication failed!");
}
};
} }
package jmx;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.util.HashMap;
import java.util.Map; import javax.management.JMX;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL; public class JmxClient { /**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
ObjectName hello_name = null;
try {
hello_name = new ObjectName("helloMBeanDomain", "type",
"HelloMBean");
System.out.println("\tOBJECT NAME = " + hello_name);
// service:jmx:rmi://%s:%d/jndi/rmi://%s:%d/jmxrmi
String addr = "10.74.169.50:31999";
JMXServiceURL address = new JMXServiceURL("service:jmx:rmi://"
+ addr + "/jndi/rmi://" + addr + "/jmxrmi");
System.out.println("JmxRemote.main()1");
Map<String, Object> jmxEnvironment = new HashMap<String, Object>(); // 如果服務端有认证,則客戶端也要这么写:
// jmxEnvironment.put("jmx.remote.credentials", new String[] {
// "saf", "asswrd"}); JMXConnector connector = JMXConnectorFactory.connect(address,
jmxEnvironment);
System.out.println("JmxRemote.main()2");
MBeanServerConnection mbs = connector.getMBeanServerConnection();
System.out.println("JmxRemote.main()3");
ThreadMXBean threadBean = ManagementFactory.newPlatformMXBeanProxy(
mbs, ManagementFactory.THREAD_MXBEAN_NAME,
ThreadMXBean.class);
System.out
.println(" getThreadCount " + threadBean.getThreadCount());// 线程数量 MBeanServerConnection connection = connector
.getMBeanServerConnection();
HelloMBean helloMBean = JMX.newMXBeanProxy(connection, hello_name,
HelloMBean.class); System.out.println("aaaaaaaa " + helloMBean); helloMBean.setName("LKKKKKKK ddd basdf"); helloMBean.print();

       connector.close(); } catch (Exception e) {
e.printStackTrace();
return;
}
}
}
package jmx;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.rmi.server.RMISocketFactory; import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.SSLServerSocketFactory;
import javax.net.ssl.SSLSocketFactory; public class AnchorSocketFactory extends RMISocketFactory {
private InetAddress ipInterface = null;
private String sslEnabled; public AnchorSocketFactory() {
} public AnchorSocketFactory(InetAddress ipInterface, String sslEnabled) {
this.ipInterface = ipInterface;
this.sslEnabled = sslEnabled;
} public ServerSocket createServerSocket(int port) throws IOException {
if (this.sslEnabled.equalsIgnoreCase("true")) {
SSLServerSocket sslserversocket = null;
try {
SSLServerSocketFactory sslserversocketfactory =
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
sslserversocket =
(SSLServerSocket)sslserversocketfactory.createServerSocket(port,
50,
this.ipInterface);
} catch (IOException e) {
throw e;
}
return sslserversocket;
} else {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(port, 50, ipInterface);
} catch (IOException e) { throw e;
} return serverSocket;
}
} public Socket createSocket(String dummy, int port) throws IOException {
if (this.sslEnabled.equalsIgnoreCase("true")) {
return SSLSocketFactory.getDefault()
.createSocket(this.ipInterface.getHostName(), port);
} else {
return new Socket(ipInterface, port);
}
}
}

如果是通过jconsole连接的就这么来:

NOTE1:

server端步骤:

1 创建MBeanServerFactory mbs = ManagementFactory.getPlatformMBeanServer();

  或者MBeanServerFactory mbs = MBeanServerFactory.createMBeanServer("HelloAgentaa"); //  这个域名要和下面的保持一致

2 设置jmxEnvMap,必须的有RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE,可选的有账号密码、ssl参数等

3 创建JMXServiceURL,支持多种协议,http/snmp/rmi 等,有一定的格式,rmi的格式是:service:jmx:rmi://%s:%d/jndi/rmi://%s:%d/jmxrmi

4 获取JMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, jmxEnvMap, mbs);

5 创建ObjectName helloWorldName = new ObjectName("HelloAgentaa:type=hwa");

6 注册MBean  mbs.registerMBean(hw, helloWorldName);

7 启动connectorServer   connectorServer.start();

client端步骤:

1 同上2  如server端有设置账号密码、ssl参数等,client端需要一致

2 同上3

3 获取JMXConnector connector = JMXConnectorFactory.connect(address, jmxEnvironment);  需要注意的是,这里我们使用的是JMXConnector,而非JMXConnectorServer!

4 创建MBeanServerConnection connection = connector.getMBeanServerConnection();

  这里很关键的是,我们需要一个MBeanServerConnection, 而不再是JMXConnectorServer! 因为这个client端。。

5 同上5

6 获取MBean: HelloWorldMBean helloMBean = JMX.newMXBeanProxy(connection, hello_name, HelloWorldMBean.class);

  这里很关键的是,newMXBeanProxy的第三个参数和返回结果都是MBean接口,否则报错

7 尽情使用MBean,嘎嘎嘎!

8 使用后关闭MBeanServerConnection

NOTE2

ObjectName有三种构造函数:
  helloWorldName = new ObjectName("HelloAgentaa", "type", "hwa");
   helloWorldName = new ObjectName("HelloAgentaa:type=hwa");
   Hashtable<String, String> sadf = new Hashtable<String, String>(); sadf.put("type", "hwa");helloWorldName = new ObjectName("HelloAgentaa",sadf );

上面三种形式等价,但是不能,helloWorldName = new ObjectName("HelloAgentaa:type=hwa", key, value); 或者new ObjectName("HelloAgentaa:type=hwa", map); 这样混合使用!

NOTE3

创建MBeanServerFactory有两种方式:

1 MBeanServerFactorymbs = ManagementFactory.getPlatformMBeanServer(); //  获取jmx平台基础已有的MBeanServerFactory

2 或者MBeanServerFactory mbs = MBeanServerFactory.createMBeanServer("HelloAgentaa"); // 获取新的MBeanServerFactory

具体使用哪种要酌情考虑

(clien不t需要MBeanServerFactory)

NOTE4

客户端使用完记得关闭JMXConnector

我这里没有设置jmx账号,所以下面两栏为空

如果需要使用ssl通道加密数据的话,则需执行(当然,要jmx服务器配置好ssl先):

jconsole -J-Djavax.net.ssl.trustStore=D:\jmx\certificate\serverTrustStore -J-Djavax.net.ssl.trustStorePassword=asswor

然后再在弹出的jconsole页面——远程连接——输入ip/port/username/password。。。。。

jmx完整示例的更多相关文章

  1. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  2. WCF服务开发与调用的完整示例

    WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...

  3. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  4. C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

    一.开发环境 ReadHat6.3 32位.mysql5.6.15.gcc4.4.6 二.编译 gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient ma ...

  5. Struts 2.3.4.1完整示例

    [系统环境]Windows 7 Ultimate 64 Bit [开发环境]JDK1.6.21,Tomcat6.0.35,MyEclipse10 [其他环境]Struts2.3.4.1 [项目描述]S ...

  6. Spring 3 AOP 概念及完整示例

    AOP概念 AOP(Aspect Oriented Programming),即面向切面编程(也叫面向方面编程,面向方法编程).其主要作用是,在不修改源代码的情况下给某个或者一组操作添加额外的功能.像 ...

  7. springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目

    一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...

  8. springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试

    包结构 所需要的jar包直接拷贝到lib目录下 然后选定 build path 之后开始写项目代码 配置文件 ApplicationContext.xml <?xml version=" ...

  9. springmvc 项目完整示例03 小结

    利用spring 创建一个web项目 大致原理 利用spring的ioc 原理,例子中也就是体现在了配置文件中 设置了自动扫描注解 配置了数据库信息等 一般一个项目,主要有domain,dao,ser ...

随机推荐

  1. (shell )函数

    一.定义格式 [function] 函数名() { 命令表 } 二.调用方法 先定义,后使用,直接输入函数名,不需要圆括号() 三.函数参数传递方法 可以利用位置参数或者变量进行传递 #! /bin/ ...

  2. map阶段动态获取CombineTextInputFormat各输入文件路径

    老mr程序中map中conf的map.input.file参数只能获取获取CombineTextInputFormat的第一个输入文件,而新版mr程序则连第一个输入文件也无法获取,这是因为create ...

  3. C语言小练习一

    题目要求:国王将金币作为工资,发放给忠诚的骑士.第1天,骑士收到一枚金币:之后两天(第2天和第3天)里,每天收到两枚金币:之后三天(第4.5.6天)里,每天收到三枚金币:之后四天(第7.8.9.10天 ...

  4. eclipse的maven项目报Missing artifact jdk.toos:jdk.toos:jar:1.6错

    很多框架都会依赖jdk中的tools.jar,但是maven仓库中却没有. 如在eclipse+maven编写mapreduce代码,就会报Missing artifact jdk.toos:jdk. ...

  5. [转载]Firebird与MySQL:一个使用者的体会

    老板要我开发一个LINUX平台上的数据库项目,要求一定要用开源免费数据库.我知道这个数据库必须能够上网操作,同时作为公司的核心骨干数据库,除了必须是稳定的存储数据库外还必须有很强的数据和数据库控管功能 ...

  6. 算法入门笔记------------Day1

    1.C语言使用%d显示float值,不会把float值转换为近似的int值,而是显示垃圾值,使用%f显示int值,也不会把该int值转换为浮点值 2.三位数反转:输入一个三位数,分离它的百位,十位和个 ...

  7. 个人阅读作业Week7

    没有银弹 <没有银弹>,Brooks在该论文中,强调真正的银弹并不存在,而所谓的没有银弹则是指没有任何一项技术或方法可以能让软件工程的生产力在十年内提高十倍.文中讨论到了软件工程中主要的两 ...

  8. iOS项目旋转控制

    iOS6的旋屏控制技巧 在iOS5.1 和 之前的版本中, 我们通常利用 shouldAutorotateToInterfaceOrientation: 来单独控制某个UIViewController ...

  9. DSO动态加载PHP模块到Apache服务器

    PHP在Linux/Unix平台上经常与Apache搭配使用,在安装PHP时,有三种安装方式可供选择:静态模式.动态模式(DSO).CGI二进制模式. 由于易于维护和升级,我强烈建议以DSO方式安装P ...

  10. CocoaPods的版本升级

    我们在项目开发过程中为了更好的管理项目中引用的一些第三方的开源代码,我们在项目开发中都会使用CocoaPods,在项目中不使用Cocoapods可以绕过这篇帖子,但是Cocopods升级比较快,但是怎 ...