SpringBoot JMX的基本使用方式
程序员文章站
2022-03-07 23:21:31
目录springboot jmx的基本使用什么情况我们需要使用jmx?springboot jmx的基本使用1. 声明当前内容主要为学习和使用springboot注册jmx的操作,主要方便管理需要的类...
springboot jmx的基本使用
1. 声明
当前内容主要为学习和使用springboot注册jmx的操作,主要方便管理需要的类
当前内容来源:springboot官方文档
主要内容为:
- 使用springboot注册jmx中的mbean
- 使用jconsole查看和修改属性
基本的pom依赖
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <version>2.2.13.release</version> </parent> <properties> <project.build.sourceencoding>utf-8</project.build.sourceencoding> </properties> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> </dependency> </dependencies>
2. 基本demo
application.properties的内容
spring.jmx.enabled=true
mysqldb.properties的内容
jdbc.driverclassname=com.mysql.cj.jdbc.driver jdbc.url=jdbc:mysql://localhost:3306/test?servertimezone=utc&useunicode=true&characterencoding=utf-8 jdbc.username=root jdbc.password=123456 # mysql connector timeout check jdbc.maxidle=216000 jdbc.validationquery=select 1 jdbc.validationquerytimeout=1800 jdbc.testonborrow=true jdbc.testwhileidle=true
配置类appconfig
@configuration @propertysource(value = {"mysqldb.properties"}) @enableconfigurationproperties(value = { mysqldbproperties.class}) public class appconfig { }
mysqldbproperties
import org.springframework.boot.context.properties.configurationproperties; import org.springframework.jmx.export.annotation.managedattribute; import org.springframework.jmx.export.annotation.managedresource; /** * @description 当前内容主要为对应sqlserverdb的数据库配置文件中的属性 * @author hy * @createtime 2021-03-31 13:26:36 **/ @configurationproperties(prefix = "jdbc") @managedresource("com.hy.springboot.jmx.test.properties:type=mysqldbproperties,name=mysqldbproperties") public class mysqldbproperties { private string url; private string driverclassname; private string username; private string password; private integer maxidle; private integer validationquerytimeout; private string validationquery; private boolean testonborrow; // 是否在使用的时候进行检查操作 private boolean testwhileidle;// 测试是否已经不能使用了 @managedattribute public boolean gettestonborrow() { return testonborrow; } @managedattribute public void settestonborrow(boolean testonborrow) { this.testonborrow = testonborrow; } @managedattribute public boolean gettestwhileidle() { return testwhileidle; } @managedattribute public void settestwhileidle(boolean testwhileidle) { this.testwhileidle = testwhileidle; } @managedattribute public integer getvalidationquerytimeout() { return validationquerytimeout; } @managedattribute public void setvalidationquerytimeout(integer validationquerytimeout) { this.validationquerytimeout = validationquerytimeout; } @managedattribute public string getvalidationquery() { return validationquery; } @managedattribute public void setvalidationquery(string validationquery) { this.validationquery = validationquery; } @managedattribute public integer getmaxidle() { return maxidle; } @managedattribute public void setmaxidle(integer maxidle) { this.maxidle = maxidle; } @managedattribute public string geturl() { return url; } @managedattribute public void seturl(string url) { this.url = url; } @managedattribute public string getdriverclassname() { return driverclassname; } @managedattribute public void setdriverclassname(string driverclassname) { this.driverclassname = driverclassname; } @managedattribute public string getusername() { return username; } @managedattribute public void setusername(string username) { this.username = username; } @managedattribute public string getpassword() { return password; } @managedattribute public void setpassword(string password) { system.out.println("设置新的密码为:" + password); this.password = password; } }
主要借助:@managedattribute和@managedresource来实现操作
入口类:基本的main方法
3. 执行结果
使用jconsole连接并查看mbean结果
使用jmx可将一些需要的信息注册,然后通过jconsole动态查看运行中的属性,也可以修改属性
springboot自定义jmx对象
在使用springboot-admin对springboot项目进行监控的时候我们发现其是具有web访问jmx对象的功能的,那它内部是怎么实现的呢。
jolokia是一个jmx-http桥梁,它提供了访问jmx bean的http访问方式。
<dependency> <groupid>org.jolokia</groupid> <artifactid>jolokia-core</artifactid> </dependency>
什么情况我们需要使用jmx?
我认为比较实用有如下2点:
1、获取java对象里的属性的实时情况。
2、动态修改对象里的属性的值。
例如:你有一个耗时较长的定时任务,里面会处理一批数据,这时通过jmx暴露当前已处理的数据的相关数据就能得到实时的结果(当然,你可以通过写日志、数据库、缓存来实现,但这无疑增加了更业务无关的代码)。
那要怎么做呢?
首先看一下相关注解定义
将类的所有实例标识为jmx受控资源 | managedresource | @managedresource | class 类 |
将方法标识为jmx操作 | managedoperation | @managedoperation | method方法 |
将getter或者setter标识为部分jmx属性 | managedattribute | @managedattribute | method (only getters and setters) 方法(仅getters和setters) |
定义操作参数说明 | managedoperationparameter | @managedoperationparameter和@managedoperationparameters | method 方法 |
例子:
import org.springframework.beans.factory.annotation.autowired; import org.springframework.jmx.export.annotation.managedattribute; import org.springframework.jmx.export.annotation.managedresource; import lombok.extern.slf4j.slf4j; @service @slf4j @managedresource (objectname= "com.longge:name=spidempbserviceimpl" , description= "brower spider service" ) public class spidempbserviceimpl implements spidempbservice { // 临时表当前最大id private long tempmaxid = 0l; /** * 暴露mbean方法 * @return */ @managedattribute(description="temp info now max id") public long getnowtempmaxid() { return tempmaxid; } }
在jmc的mbean选项卡、springboot-admin的jmx就能看到这属性和这方法。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 打印Java程序的线程栈信息方式
推荐阅读