目录
  • springboot jmx的基本使用
    • 1. 声明
    • 2. 基本demo
    • 3. 执行结果
  • springboot自定义jmx对象
    • 什么情况我们需要使用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就能看到这属性和这方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。