java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据
背景
运行中的应用修改了配置后应用能生效有多种解决方案,比如:
- 配置存入redis中
- 修改了配置文件后按时检测配置文件是否被修改,被修改则读取修改后的内容
下面介绍springboot工程通过jmx动态修改配置不停机的方式来管理配置信息,此种方式使用简单,而且实时生效。
知识普及
- jmx
- MBean:所有被MBeanServer管理的资源,提供了访问接口,可通过RMI或HTTP访问
实现功能
动态修改应用的浏览器黑名单
实现过程
编写MBean类
编写浏览器黑名单类,使用ManagedResource注解使得spring将其注册到MBeanServer。
@Component
@ManagedResource(objectName = "blacklist:name=browser", description = "request from those browser not allow")
public class BlackListMBean {private final Set<String> blackList = new HashSet<>( Arrays.asList("firefox") );@ManagedAttribute(description = "obtaining blacklist")public Set<String> getBlackList() {return blackList;}@ManagedOperation@ManagedOperationParameter(name = "browser", description = "adding browser to blacklist")public void addBlackArea(String browser){blackList.add(browser);}@ManagedOperation@ManagedOperationParameter(name = "browser", description = "removing browser from blacklist")public void removeFromBlacklist(String browser){blackList.remove(browser);}public boolean allow(String browser){for (String name : blackList) {if ( browser.startsWith(name) ) return false;}return true;}
}
告诉Spring自动注册MBean
@SpringBootApplication
@EnableMBeanExport
public class DemoApplication {public static void main(String[] args) {ConfigurableApplicationContext context = SpringApplication.run(DemoApplication.class, args);SpringUtil.setContext(context);System.out.println("ok");}
}
编写拦截器拦截客户端请求
public class BrowserInterceptor extends HandlerInterceptorAdapter{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String userAgent = request.getHeader("User-Agent");//获取浏览器类型String browserName = UserAgent.parseUserAgentString(userAgent).getBrowser().getName().toLowerCase();//获取浏览器类型BlackListMBean blackListMBean = SpringUtil.getBean(BlackListMBean.class);boolean flag = blackListMBean.allow(browserName);if (!flag){printErr(response);}return flag;}private void printErr(HttpServletResponse response) throws IOException {try (PrintWriter writer = response.getWriter()){writer.write("browser not support");writer.flush();}}
}
注册拦截器
@Configuration
public class SysConfig implements WebMvcConfigurer {//配置拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor( new BrowserInterceptor() );}
}
测试
- 启动工程
- 使用jconsole连接工程,jconsole使用参考以往博文。
- 在jconsole找到注册的MBean
- 使用被加入黑名单的firefox浏览器访问
- 通过jconsole从黑名单移除firefox
调用成功后再次使用浏览器访问
java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据相关推荐
- 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系
参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...
- spring java code配置_Spring-09-使用Java的方式配置Spring
9. 使用Java的方式配置Spring 我们现在要完全不使用Spring的xml配置,全权使用Java来配置Spring! JavaConfig是Spring的一个子项目,在Spring4之后,他成 ...
- java环境变量设置 win2003,2021-03-09Win10的Java环境配置Win10下Java环境变量配置
接下来主要讲怎么配置 Java 的环境变量,也是为了以后哪天自己忘记了做个备份 (注:win10的Java环境变量配置和其他的windows版本稍有不同) 在电脑桌面 右键点击 "此电脑&q ...
- 安装oculus运行时出现问题_PS 2021安装失败?运行时提示程序错误?解决办法全在这里...
PS 2021 安装时提示此时无法安装? PS 2021 运行时提示程序错误? 解决办法全在这里! 由于PS 2021的正式版本出来了,所以这几天问紫枫最多的问题就是这两个问题,一个就是在安装过程中提 ...
- corn java 可配置_SpringBoot——目前Java开发最流行的框架(四)
[SpringBoot] 十九.SpringBoot整合Junit4 1.添加启动器 2.编写测试类 在src/main/test里面新建com.bjsxt.MyTest 注意: 测试类不能叫做Tes ...
- ubuntu中java环境配置_Ubuntu下java环境的搭建
喜欢捣鼓计算机相关的,然后大二的时候就想着用linux,于是当时就装了个ubuntu,还想着把java环境搭建进去,但当时由于"意志不坚定"后来就没用linux了,知道最近突然想在 ...
- redis java spring_spring配置redis(xml+java方式)(最底层)
条件:引用好架包 org.springframework.data spring-data-redis 2.1.3.RELEASE redis.clients jedis 2.9.0 一.使用xml进 ...
- linux java 环境配置_linux下java开发环境配置
jdk 1 下载jdk: jdk-6u22-linux-i586.bin 2 增加可执行权限: chmod +x jdk-6u22-linux-i586.bin 3 复制到/usr下 sudo cp ...
- 重启docker service时为什么一般情况下不影响已经运行的容器?
如果是所示,这是docker自身的一个属性决定,该属性默认使true,因此当我们执行systemctl docker restart时已经运行的容器未受影响. 原文在: https://docs.do ...
最新文章
- WinForm下ComboBox获取绑定对象集的SelectedValue补充
- Google面试题——及答案
- 为什么转换到Visual Studio 2017如此 “容易”
- Linux常用开发环境软件-redis安装
- Unity Hub安装Android Build Support报错:Failed to delete old Unity Android Supprtinstallation files
- Docker实战(精简版本)
- 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题
- 拓端tecdat:数据评估三方科技公司开发人员能力
- mouseclick
- 机器人学导论——操作臂运动学
- 用JS屏蔽backspace(退格删除)键或某一个指定键的完美代码
- 时间序列分析-ARMA模型
- 论文阅读:Factorizable Net: An Efficient Subgraph-based Framework for Scene Graph Generation
- l曲线 matlab,L曲线确定岭参数
- python豆瓣镜像_pip使用豆瓣的镜像源
- LivePlayer H5播放器、在react中使用
- JAVA基础英语单词
- 用 visio 2013 绘制倾斜立方体
- 【Unity】Avatar与AvatarMask系统介绍(TPS.番外篇)
- 【php】分享一个php转换微信、QQ、微博 特殊非主流 | 杀马特 网名的 function
热门文章
- 由我妈买菜,联想到了数据挖掘
- php调用函数的变量,从内PHP函数调用的变量在外部函数使用
- mysql开机启动脚本_centos简单的mysql开机自启和自动保存脚本
- mysql模板引擎有哪些_ecshop用的是什么模板引擎?
- 北航java大作业,北航成人继续教育 本科 计算机科学与技术 JAVA——大作业.doc
- java创建多级xml树_月光软件站 - 编程文档 - Java - 用XSL与XML实现多级树形菜单
- python dict 排序原理_第一章Python数据结构和算法(字典排序)
- c语言中的typedef struct相当于java的一个类?,C ++中'struct'和'typedef struct'之间的区别?...
- 风吹来_风吹年年,雪落片片
- 七十五、React环境搭建,目录文件分析和JSX