java-jmx使用
先粘一段内容
、程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布。 、程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。 、程序好手则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。 、程序高手则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。
JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展。这种机制可以方便的管理正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。
jmx整体架构:

1, Mbean准备
1, 先建立需要连接的接口
package com.wenbronk.le.iris.jmx; /**
* 实现接口, 可在jconsoler中调用属性
*/
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(); }
2, 实体类继承
package com.wenbronk.le.iris.jmx; import ch.qos.logback.core.joran.spi.NoAutoStart;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor; /**
* 必须实现 Mbean, 才可以进行注册
*/
@NoArgsConstructor
@AllArgsConstructor
public class Hello implements HelloMBean { private String name;
private String age; @Override
public String getName() {
System.out.println("get name::" + name);
return name;
}
@Override
public void setName(String name) {
this.name = name;
System.out.println("set name " + name);
}
@Override
public String getAge() {
System.out.println("get age::" + age);
return age;
}
@Override
public void setAge(String age) {
this.age = age;
System.out.println("set age " + age);
}
@Override
public void helloWorld() {
System.out.println("hello world");
}
@Override
public void helloWorld(String str) {
System.out.println("hello world " + str);
}
@Override
public void getTelephone() {
System.out.println("get telephone");
}
}
2, 使用java命令行指定
3,
package com.wenbronk.le.iris.jmx.local; import com.wenbronk.le.iris.jmx.Hello;
import org.junit.Test; import javax.management.*;
import java.lang.management.ManagementFactory; public class HelloAgent { public static void main(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException { MBeanServer server = ManagementFactory.getPlatformMBeanServer(); Hello hello = new Hello();
// com.le.iris:type=ZhixinSource/QPS 域名:name=MBean名称
ObjectName helloName = new ObjectName("com.wenbronk.le.jmxBean:name=" + hello.getClass().getName()); ObjectInstance objectInstance = server.registerMBean(hello, helloName); Thread.sleep(**);
}
}
需要添加password等, 并指定权限
jmx.access
monitor readonly
admin readwrite
jmx.password
monitor com.le.big
admin com.le.big
启动参数指定:
JMX_PORT= JAVA_OPTS="-server \
-Dcom.sun.management.jmxremote\
-Dcom.sun.management.jmxremote.authenticate=true\
-Dcom.sun.management.jmxremote.password.file=jmx.password\
-Dcom.sun.management.jmxremote.access.file=jmx.access\
-Dcom.sun.management.jmxremote.ssl=false\
-Dcom.sun.management.jmxremote.port=${JMX_PORT}\
-Dcom.sun.management.jmxremote.local.only=false\
-Djava.rmi.server.hostname=${IP}\
-Diris.hostname=${IP}\
-Xmx${MEM}m -XX:+UseG1GC -XX:MaxGCPauseMillis= -XX:ParallelGCThreads=\
" nohup java ${JAVA_OPTS} -jar ${APP_JAR_NAME} ${params} >>${APP_HOME}/nohup.log >& &
2, 使用java指定远程连接方式:
3, agentserver的编写
package com.wenbronk.le.iris.jmx.remote; import com.wenbronk.le.iris.jmx.Hello;
import com.wenbronk.le.iris.jmx.Testtt; import javax.management.MBeanServer;
import javax.management.ObjectInstance;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry; /**
* 开启后, 可通过jconsoler进行连接
*/
public class HelloAgentRemote { public static void main(String[] args) throws Exception {
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); Hello hello = new Hello("vini", "");
// 试了下, name 和 type没啥区别
ObjectName helloName = new ObjectName("com.wenbronk.le.jmxBean:name=" + hello.getClass().getSimpleName());
//ObjectName helloName1 = new ObjectName("com.wenbronk.le.jmxBean:type=" + hello.getClass().getSimpleName()); Testtt testtt = new Testtt();
ObjectName testtName = new ObjectName("com.wenbronk.le.jmxBean:type=" + testtt.getClass().getSimpleName());
//ObjectName testtName1 = new ObjectName("com.wenbronk.le.jmxBean:name=" + testtt.getClass().getSimpleName()); System.out.println(hello.getClass().getSimpleName());
ObjectInstance instance = mbs.registerMBean(hello, helloName);
//ObjectInstance instance3 = mbs.registerMBean(hello, helloName1);
ObjectInstance instance2 = mbs.registerMBean(testtt, testtName);
//ObjectInstance instance4 = mbs.registerMBean(testtt, testtName1); try {
// 注册一个端口并绑定
Registry registry = LocateRegistry.createRegistry();
JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
//service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi
JMXConnectorServer jmxConnectorServer = JMXConnectorServerFactory.newJMXConnectorServer(jmxServiceURL, null, mbs); jmxConnectorServer.start(); }catch (Exception e) {
e.printStackTrace();
}
}
}
此时可以通过jconsoler工具进行连接了,

4, 或者自己实现客户端进行连接
package com.wenbronk.le.iris.jmx.remote; import com.wenbronk.le.iris.jmx.HelloMBean; import javax.management.*;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;
import java.io.IOException;
import java.net.MalformedURLException; /**
* 远程连接jmx
*/
public class Client { public static void main(String[] args) throws Exception {
JMXServiceURL jmxServiceURL = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
JMXConnector connect = JMXConnectorFactory.connect(jmxServiceURL, null); MBeanServerConnection mBeanServerConnection = connect.getMBeanServerConnection(); String[] domains = mBeanServerConnection.getDomains();
for (int i = ; i < domains.length; i++) {
String obj = domains[i];
System.out.printf("domian[%d] = %s", i, domains[i].toString());
System.out.println();
} // 注册名和之前server的一致
ObjectName objectName = new ObjectName("com.wenbronk.le.jmxBean:name=Hello");
// 获取参数
getParam(mBeanServerConnection, objectName);
System.out.println("get params======================");
// 更改参数
changeParams(mBeanServerConnection, objectName);
getParam(mBeanServerConnection, objectName);
System.out.println("set params======================"); useMethod(mBeanServerConnection, objectName);
getParam(mBeanServerConnection, objectName);
System.out.println("useMethod.========================");
} /**
* 对method的调用, 采用反射的方式进行
*/
public static void useMethod(MBeanServerConnection connection, ObjectName objectName) {
HelloMBean helloMBean = MBeanServerInvocationHandler.newProxyInstance(connection, objectName, HelloMBean.class, true);
String age = helloMBean.getAge();
String name = helloMBean.getName();
helloMBean.setAge("");
helloMBean.helloWorld("nchar");
} /**
* 可进行相关参数修改
* 通过setAttribute、getAttrubute方法来进行操作,则属性的首字母要大写
*/
public static void changeParams(MBeanServerConnection mBeanServerConnection, ObjectName objectName) throws AttributeNotFoundException, InvalidAttributeValueException, ReflectionException, IOException, InstanceNotFoundException, MBeanException {
mBeanServerConnection.setAttribute(objectName, new Attribute("Name", "hangzhou"));
mBeanServerConnection.setAttribute(objectName, new Attribute("Age", ""));
} /**
* 获取参数
*/
public static void getParam(MBeanServerConnection connection, ObjectName objectName) throws AttributeNotFoundException, MBeanException, ReflectionException, InstanceNotFoundException, IOException {
String age = (String) connection.getAttribute(objectName, "Age");
String name = (String) connection.getAttribute(objectName, "Name");
System.out.println("name " + name + " age: " + age);
}
}
https://www.cnblogs.com/dongguacai/p/5900507.html
java-jmx使用的更多相关文章
- Java JMX 监管
Java JMX 监管 JSR 规范系列目录(https://www.cnblogs.com/binarylei/p/10348178.html) JMX(Java Management Extens ...
- java jmx
http://blog.csdn.net/qiao000_000/article/details/6063949 一.JMX简介 什么是JMX?在一篇网文中是这样说的:"JMX(Java M ...
- JAVA JMX协议监控
JMX协议监控,可通过JMX协议远程监控,实时监控线上jvm情况,并通过平台管理界面进行 展示,可以通过监控实时获得线上服务器运行情况. 可以监控内存.实时线程.共享内存等各种信息. 获取实时线程信息 ...
- Java jmx的使用
JMX Java Management Extensions,Java管理扩展.本质就是用来监控java语言开发的程序,一般常用于jconsole,java visual VM的监控,今天主要介绍ja ...
- java之JMX
java之JMX 有关JMX的定义和架构就不具体解释了.见百度百科: http://baike.baidu.com/link? url=6QzGGEqphTmpft3ll5mXmDNVRdvLRZhk ...
- Java 监控基础 - 使用 JMX 监控和管理 Java 程序
点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码网站 已经收录,有很多知识点和系列文章. 此篇文 ...
- 使用jmx监控tomcat
1.在tomcat启动过程中,开启相应的参数配置: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -D ...
- JVM Monitoring: JMX or SNMP?
JVM Monitoring: JMX or SNMP? By daniel on Feb 23, 2007 Since JavaTM SE 5.0, the JRE provides a means ...
- 在Docker中监控Java应用程序的5个方法
译者注:Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化.通常情况下,监控的主要目的在于:减少宕机 ...
- Zabbix系列之三——部署JMX监控tomcat
zabbix提供了一个java gateway的应用去监控jmx(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架.JMX可以 ...
随机推荐
- 【repost】JavaScript运动框架之速度时间版本
一.JavaScript运动框架之速度版 1.1 运动框架的实现思路 运动,其实就是在一段时间内改变 left . right . width . height . opactiy 的值,到达目的地之 ...
- web-day1
第1章 WEB01-HTML篇 今日任务 网站信息页面案例 网站图片信息页面案例 网站友情链接页面案例 网站首页案例 网站注册页面案例 网站后台页面案例 教学导航 教学目标 了解什么是标记语言 了 ...
- java基础知识-二进制
1.二进制<0B>出现的原因 2. 八进制<0>和十六进制<0X>出现的原因:简化书写和记忆 3.十进制到其他进制的转换方法 method:除以进制数,直到商为0, ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- Swift简单实现一个常规条款、免责声明文字+带有链接的展示形式
效果: IMG_F08DABE063A6-1.jpeg class DisclamerView: UIView { //@objc weak var vc:UIViewController? // ...
- cmd如何进入d盘
首先打开CMD 点开始 运行输入 CMD 在CMD窗口中输入 CD\(就是返回根目录) 回车 在输入 D: 即可在D盘操作状态
- CentOS下下载软件,不安装的方法
今天来说下在CentOS下下载软件,不安装的方法: 方法一:通过yum自带一个工具:yumdownloader[root@web1 ~]# rpm -qa |grep yum-utils[root@ ...
- [FMX]获取控件样式中的指定项目以便进行调节
[FMX]获取控件样式中的指定项目以便进行调节 2017-03-26 • C++ Builder.Delphi.教程 • 暂无评论 • swish •浏览 650 次 FMX 的样式丰富了我们的设计, ...
- cxGrid控件过滤筛选后如何获更新筛选后的数据集
cxGrid控件过滤筛选后如何获更新筛选后的数据集 (2015-06-19 12:12:08) 转载▼ 标签: delphi cxgrid筛选数据集 cxgrid过滤 分类: Delphi cxGri ...
- 关于质能等效的两个思想实验 Two Ideological Experiments on Mass-Energy Equivalence
大家知道,物质和能量是等效的,虽然质能方程已暗示了这种等效关系,但并非显而易见.此等效性可以从以下两个思想实验中获知. 实验一:一台电子称上放置一个金属物体,加热它,称的读数将会略微增加.这是因为金属 ...