spring-boot 提供了Actuator方式的来获取spring-boot状态信息; 不过今天我介绍jmx的方式
为何要使用jmx, 引用某呼的回答
1、程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布。
2、程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是必须重启系统,以便读取配置文件里最新的值。
3、程序好手则会写一段代码,把配置值缓存起来,系统在获取的时候,先看看配置文件有没有改动,如有改动则重新从配置里读取,否则从缓存里读取。
4、程序高手则懂得物为我所用,用JMX把需要配置的属性集中在一个类中,然后写一个MBean,再进行相关配置。另外JMX还提供了一个工具页,以方便我们对参数值进行修改。
作者:郭无心
链接:https://www.zhihu.com/question/36688387/answer/68667704
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
感觉挺装逼的, 于是就花点时间整理了; 下面是已注解的方式使用jmx, 无需引入其他jar包;
1、第一步可以定义自己的MBean来管理自己想管理的数据;
@ManagedResource(objectName= "bean:name=xxx" , description= "描述" ) @Component
public class TestFactory {
..................
@ManagedOperation
public void flush() {
logger.warn("刷新了支付配置缓存");
..................
}
以上是代码; 如果没有自己的MBean,可以直接省略这一步;
2、第二步在spring里配置jmx服务信息;
@Bean //注册rmi
public RmiRegistryFactoryBeanrmiRegistry() {
final RmiRegistryFactoryBean rmiRegistryFactoryBean =new RmiRegistryFactoryBean();
rmiRegistryFactoryBean.setPort(8896); //链接端口
rmiRegistryFactoryBean.setAlwaysCreate(true);
return rmiRegistryFactoryBean;
}
@Bean
@DependsOn("rmiRegistry") //声明链接
public ConnectorServerFactoryBeanconnectorServerFactoryBean()throws Exception {
final ConnectorServerFactoryBean connectorServerFactoryBean =new ConnectorServerFactoryBean();
connectorServerFactoryBean.setObjectName("connector:name=rmi");
String serviceUrl = String.format("service:jmx:rmi://%s:%s/jndi/rmi://%s:%s/jmxrmi", "127.0.0.1", 8896, "127.0.0.1", 8896);
connectorServerFactoryBean.setServiceUrl(serviceUrl);
logger.info("ConnectorServerFactoryBean create success !! url:{}", serviceUrl);
return connectorServerFactoryBean;
}
这样,在spring-boot中的配置可以说已经完成了;
3、配置启动参数
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.port=8899
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=true #如果不想用认证就设置为false
4、如果第三步配置了需要认证; 默认的认证文件是在JAVA_HOME/jre/lib/management/jmxremote.access和 JAVA_HOME/jre/lib/management/jmxremote.password(有个template文件,重命名这个文件后把默认的用户和密码去掉注释就可以)由于jmx要求jmxremote.password只能有读取权限;所以需要修改文件的权限;linux环境下执行 chmod 600 jmxremote.access; windows按如下操作;
右键文件,选择->属性->安全->高级->更改权限 把下面的权限勾选调
5、使用jconsole链接 ,打开jconsole, 在远程进程中输入Url和用户名密码; 如下
6、因为禁用了ssl, 所以会提示不安全的链接; 链接成功后效果如下;
jconsole中,能找到自己定义的MBean以及Tomcat, spring自己的MBean; MBean里有属性信息; 操作是指能直接调用MBean里的方法;通知是MBean之间信息交流的接口;
至此,jconsole监控spring-boot配置完成;