欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot JMX的基本使用方式

程序员文章站 2022-06-19 18:08:07
目录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. 执行结果

SpringBoot JMX的基本使用方式

使用jconsole连接并查看mbean结果

SpringBoot JMX的基本使用方式SpringBoot JMX的基本使用方式

使用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就能看到这属性和这方法。

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

相关标签: SpringBoot JMX