背景

运行中的应用修改了配置后应用能生效有多种解决方案,比如:

  1. 配置存入redis中
  2. 修改了配置文件后按时检测配置文件是否被修改,被修改则读取修改后的内容
    下面介绍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() );}
}

测试

  1. 启动工程
  2. 使用jconsole连接工程,jconsole使用参考以往博文。
  3. 在jconsole找到注册的MBean
  4. 使用被加入黑名单的firefox浏览器访问
  5. 通过jconsole从黑名单移除firefox


    调用成功后再次使用浏览器访问

java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据相关推荐

  1. 程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

    参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFB ...

  2. spring java code配置_Spring-09-使用Java的方式配置Spring

    9. 使用Java的方式配置Spring 我们现在要完全不使用Spring的xml配置,全权使用Java来配置Spring! JavaConfig是Spring的一个子项目,在Spring4之后,他成 ...

  3. java环境变量设置 win2003,2021-03-09Win10的Java环境配置Win10下Java环境变量配置

    接下来主要讲怎么配置 Java 的环境变量,也是为了以后哪天自己忘记了做个备份 (注:win10的Java环境变量配置和其他的windows版本稍有不同) 在电脑桌面 右键点击 "此电脑&q ...

  4. 安装oculus运行时出现问题_PS 2021安装失败?运行时提示程序错误?解决办法全在这里...

    PS 2021 安装时提示此时无法安装? PS 2021 运行时提示程序错误? 解决办法全在这里! 由于PS 2021的正式版本出来了,所以这几天问紫枫最多的问题就是这两个问题,一个就是在安装过程中提 ...

  5. corn java 可配置_SpringBoot——目前Java开发最流行的框架(四)

    [SpringBoot] 十九.SpringBoot整合Junit4 1.添加启动器 2.编写测试类 在src/main/test里面新建com.bjsxt.MyTest 注意: 测试类不能叫做Tes ...

  6. ubuntu中java环境配置_Ubuntu下java环境的搭建

    喜欢捣鼓计算机相关的,然后大二的时候就想着用linux,于是当时就装了个ubuntu,还想着把java环境搭建进去,但当时由于"意志不坚定"后来就没用linux了,知道最近突然想在 ...

  7. redis java spring_spring配置redis(xml+java方式)(最底层)

    条件:引用好架包 org.springframework.data spring-data-redis 2.1.3.RELEASE redis.clients jedis 2.9.0 一.使用xml进 ...

  8. linux java 环境配置_linux下java开发环境配置

    jdk 1 下载jdk: jdk-6u22-linux-i586.bin 2 增加可执行权限: chmod +x jdk-6u22-linux-i586.bin 3 复制到/usr下 sudo cp  ...

  9. 重启docker service时为什么一般情况下不影响已经运行的容器?

    如果是所示,这是docker自身的一个属性决定,该属性默认使true,因此当我们执行systemctl docker restart时已经运行的容器未受影响. 原文在: https://docs.do ...

最新文章

  1. WinForm下ComboBox获取绑定对象集的SelectedValue补充
  2. Google面试题——及答案
  3. 为什么转换到Visual Studio 2017如此 “容易”
  4. Linux常用开发环境软件-redis安装
  5. Unity Hub安装Android Build Support报错:Failed to delete old Unity Android Supprtinstallation files
  6. Docker实战(精简版本)
  7. 解决bootstrap-table表头filter-control select控件被遮挡显示不全的问题
  8. 拓端tecdat:数据评估三方科技公司开发人员能力
  9. mouseclick
  10. 机器人学导论——操作臂运动学
  11. 用JS屏蔽backspace(退格删除)键或某一个指定键的完美代码
  12. 时间序列分析-ARMA模型
  13. 论文阅读:Factorizable Net: An Efficient Subgraph-based Framework for Scene Graph Generation
  14. l曲线 matlab,L曲线确定岭参数
  15. python豆瓣镜像_pip使用豆瓣的镜像源
  16. LivePlayer H5播放器、在react中使用
  17. JAVA基础英语单词
  18. 用 visio 2013 绘制倾斜立方体
  19. 【Unity】Avatar与AvatarMask系统介绍(TPS.番外篇)
  20. 【php】分享一个php转换微信、QQ、微博 特殊非主流 | 杀马特 网名的 function

热门文章

  1. 由我妈买菜,联想到了数据挖掘
  2. php调用函数的变量,从内PHP函数调用的变量在外部函数使用
  3. mysql开机启动脚本_centos简单的mysql开机自启和自动保存脚本
  4. mysql模板引擎有哪些_ecshop用的是什么模板引擎?
  5. 北航java大作业,北航成人继续教育 本科 计算机科学与技术 JAVA——大作业.doc
  6. java创建多级xml树_月光软件站 - 编程文档 - Java - 用XSL与XML实现多级树形菜单
  7. python dict 排序原理_第一章Python数据结构和算法(字典排序)
  8. c语言中的typedef struct相当于java的一个类?,C ++中'struct'和'typedef struct'之间的区别?...
  9. 风吹来_风吹年年,雪落片片
  10. 七十五、React环境搭建,目录文件分析和JSX