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

背景

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

  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{

    @Override
    public 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 {

    //配置拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( new BrowserInterceptor() );
    }
}

测试

  1. 启动工程
  2. 使用jconsole连接工程,jconsole使用参考以往博文。
  3. 在jconsole找到注册的MBean
    java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据_第1张图片
  4. 使用被加入黑名单的firefox浏览器访问
    java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据_第2张图片
  5. 通过jconsole从黑名单移除firefox
    java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据_第3张图片
    java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据_第4张图片
    调用成功后再次使用浏览器访问
    java修改配置不重启,java运行时修改应用数据,通过jmx修改应用运行数据_第5张图片

你可能感兴趣的:(java,java)