先粘一段内容

1、程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布。2、程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。3、程序好手则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。4、程序高手则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。

JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展。这种机制可以方便的管理正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等。

jmx整体架构:

1, Mbean准备

1, 先建立需要连接的接口

package com.wenbronk.le.iris.jmx;/**

* 实现接口, 可在jconsoler中调用属性*/

public interfaceHelloMBean {publicString getName();public voidsetName(String name);publicString getAge();public voidsetAge(String age);public voidhelloWorld();public voidhelloWorld(String str);public voidgetTelephone();

}

2, 实体类继承

package com.wenbronk.le.iris.jmx;

import ch.qos.logback.core.joran.spi.NoAutoStart;

import lombok.AllArgsConstructor;

import lombok.NoArgsConstructor;/**

* 必须实现 Mbean, 才可以进行注册*/@NoArgsConstructor

@AllArgsConstructorpublic classHello implements HelloMBean {privateString name;privateString age;

@OverridepublicString getName() {

System.out.println("get name::" +name);returnname;

}

@Overridepublic voidsetName(String name) {this.name =name;

System.out.println("set name" +name);

}

@OverridepublicString getAge() {

System.out.println("get age::" +age);returnage;

}

@Overridepublic voidsetAge(String age) {this.age =age;

System.out.println("set age" +age);

}

@Overridepublic voidhelloWorld() {

System.out.println("hello world");

}

@Overridepublic voidhelloWorld(String str) {

System.out.println("hello world" +str);

}

@Overridepublic voidgetTelephone() {

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 classHelloAgent {public static voidmain(String[] args) throws MalformedObjectNameException, NotCompliantMBeanException, InstanceAlreadyExistsException, MBeanRegistrationException, InterruptedException {

MBeanServer server=ManagementFactory.getPlatformMBeanServer();

Hello hello= newHello();//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(60*1000*1000);

}

}

需要添加password等, 并指定权限

jmx.access

monitor readonlyadmin readwrite

jmx.password

monitor com.le.big

admin com.le.big

启动参数指定:

JMX_PORT=12345JAVA_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=200 -XX:ParallelGCThreads=4\"nohup java ${JAVA_OPTS}-jar ${APP_JAR_NAME} ${params} 1>>${APP_HOME}/nohup.log 2>&1 &

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 classHelloAgentRemote {public static voidmain(String[] args) throws Exception {

MBeanServer mbs=ManagementFactory.getPlatformMBeanServer();

Hello hello= new Hello("vini", "23");

// 试了下, 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= newTesttt();

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(9999);

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 classClient {public static voidmain(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 = 0; 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 voiduseMethod(MBeanServerConnection connection, ObjectName objectName) {

HelloMBean helloMBean= MBeanServerInvocationHandler.newProxyInstance(connection, objectName, HelloMBean.class, true);

String age=helloMBean.getAge();

String name=helloMBean.getName();

helloMBean.setAge("2323223");

helloMBean.helloWorld("nchar");

}/**

* 可进行相关参数修改

* 通过setAttribute、getAttrubute方法来进行操作,则属性的首字母要大写*/

public static voidchangeParams(MBeanServerConnection mBeanServerConnection, ObjectName objectName) throws AttributeNotFoundException, InvalidAttributeValueException, ReflectionException, IOException, InstanceNotFoundException, MBeanException {

mBeanServerConnection.setAttribute(objectName,new Attribute("Name", "hangzhou"));

mBeanServerConnection.setAttribute(objectName,new Attribute("Age", "1990"));

}/**

* 获取参数*/

public static voidgetParam(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使用相关推荐

  1. Java管理扩展JMX入门学习

    系列文章目录 Java管理扩展JMX入门学习 Spring JMX编程学习(一)- 手动注册bean到MBeanServer Spring JMX编程学习(二)- 以Bean的方式注册MbeanSer ...

  2. eclipse java调用c 代码吗_linux下通过eclipse开发用java调用c程序的方法

    linux下通过eclipse开发用java调用c程序的方法: 1.先建立好java工程并建立java文件如下: public class testso {     static {         ...

  3. Java调用C/C++编写的第三方dll动态链接库(zz)

    这里主要用的方法是JNI.在网上查资料时看到很多人说用JNI非常的复杂,不仅要看很多的文档,而且要非常熟悉C/C++编程.恐怕有很多人在看到诸如此类的评论时已经决定绕道用其他方法了.本文将做详细的介绍 ...

  4. 使用JNA,让java调用原生代码

    JNA定义: JNA:java Native Access,是SUN公司开发的基于JNI的框架.JNI使得Java可以调用原生的c或者c++代码. JNA与JNI(Java Native Interf ...

  5. java无阻塞执行脚本,JAVA调用Shell脚本-及阻塞的解决方法

    JAVA调用Shell脚本--及阻塞的解决办法 用java调用shell,使用 Process p=Runtime.getRuntime().exec(String[] cmd); Runtime.e ...

  6. Java 调用Oracle的存储过程

    2019独角兽企业重金招聘Python工程师标准>>> 1.创建存储过程的语句: 1.表结构:①:create table TESTA(A_ID VARCHAR2(10) not n ...

  7. Java调用ocx控件以及dll

    2019独角兽企业重金招聘Python工程师标准>>> http://lvqingboy-163-com.iteye.com/blog/769358 通过Java调用OCX控件有几种 ...

  8. java 调用c/c++

    2019独角兽企业重金招聘Python工程师标准>>> java 调用c/c++ 第一步: 编写java程序:如-- public class Pxy { static{ //加载动 ...

  9. java调用cd传输_Java调用Linux命令(cd的处理)

    一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: 1 publicString executeLinuxCmd(String cmd) {2 System.out.pri ...

  10. 用Java调用WebService

    这是一个用Java调用C#版WebService接口的例子: C#接口: Java代码 <SPAN style="FONT-SIZE: 11px"> using Sys ...

最新文章

  1. shell脚本编程之更多结构化命令
  2. 一文搞懂PointNet全家桶——强势的点云处理神经网络
  3. 高校计算机通识教育目标,美国高校计算机通识教育研究
  4. CAST 和 CONVERT的用法和区别
  5. pde lec 6 part 2
  6. Linux中Shell的命令替换用法笔记
  7. pycharm (二)
  8. sqlite管理工具
  9. jvm系列(五):tomcat性能调优和性能监控(visualvm)
  10. 分布式系统的基本特征
  11. 莫烦python学习笔记
  12. 开源GIS与空间数据库实战教程
  13. 嵌入式软件开发到底是干什么的?
  14. Python_day01-----day07
  15. QQ群共享总是下载失败怎么解决?
  16. CentOS7下安装配置zookeeper集群及设置开机自启
  17. 大疆Tello EDU版本(新发布)
  18. 如何实现ASP.NET中网站访问量的统计
  19. winform一个小游戏,赛马
  20. 【干货书】Python中的商业分析概念、技术和应用的数据挖掘

热门文章

  1. 《摩根写给儿子的32封信》10 不断汲取新经验
  2. 利用 Python 自动化和 Windows 服务 删除掉移动硬盘的临时文件
  3. 为控制台程序加个图标
  4. 【理论 | 代码】机器学习分类与回归性能评估指标大全
  5. 解决关于swift的Array repeating 初始化多个对象问题
  6. js逆向第1例:淘宝逛逛H5页面SIGN加密算法
  7. dcp-9020cdn复印位置有_兄弟9020CDN驱动
  8. 我的MBTI职业性格测试 挺准!
  9. java 用户输入框_Java——用户名输入框
  10. 使用Labelme和PaddleSeg实现动漫人物实例分割