为了方便维护系统,开发中通常会设置一些自定义参数,写在单独的配置文件里,需要调整时可直接登录服务器修复配置文件,而不需要修改程序。但尴尬的是,web服务器并不会自动重新加载配置文件,重启服务器又会中断服务。本文是一个使用quartz解决此问题的示例。

项目结构:

其中,system.properties是自定义配置文件,内容只有一行:

  1. debug=false

这个定义了一个debug参数,切换true/false可以控制一些运行状态。

然后通过编写类来读取属性

  1. package com.autfish;
  2. import org.apache.commons.lang3.BooleanUtils;
  3. import org.apache.logging.log4j.LogManager;
  4. import org.apache.logging.log4j.Logger;
  5. import org.springframework.util.ResourceUtils;
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8. import java.io.FileNotFoundException;
  9. import java.util.Properties;
  10. /**
  11. * Created by autfish on 2017/1/17.
  12. */
  13. public class SystemConfig {
  14. private static Logger logger = LogManager.getLogger("system");
  15. private static Properties props = new Properties();
  16. private File configFile = null;
  17. public SystemConfig(String filePath) {
  18. try {
  19. this.configFile = ResourceUtils.getFile(filePath);
  20. this.refresh();
  21. } catch (FileNotFoundException e) {
  22. logger.error(e);
  23. logger.warn("file [" + filePath + "] not found!");
  24. this.configFile = null;
  25. }
  26. }
  27. public void refresh() {
  28. if (this.configFile != null)
  29. SystemConfig.loadConfig(this.configFile);
  30. else
  31. logger.warn("load configuration file failed!");
  32. }
  33. private static void loadConfig(File configFile) {
  34. try (FileInputStream fis = new FileInputStream(configFile) {
  35. @Override
  36. public void close() { }
  37. }) {
  38. if (props.isEmpty()) {
  39. props.load(fis);
  40. } else {
  41. Properties temp = new Properties();
  42. temp.load(fis);
  43. for (Object key : temp.keySet()) {
  44. String value = temp.getProperty(key.toString());
  45. if (props.getProperty(key.toString()) != null && !props.getProperty(key.toString()).equals(value)) {
  46. props.setProperty(key.toString(), value);
  47. logger.info("property changed: " + key.toString() + "=" + value);
  48. }
  49. }
  50. }
  51. } catch (Exception e) {
  52. logger.error(e);
  53. }
  54. }
  55. public static boolean isDebug() {
  56. return BooleanUtils.toBoolean(props.getProperty("debug"));
  57. }
  58. }

在项目中可通过SystemConfig.isDebug()方法读取当前配置。

下面设置quartz,定时调用refresh()方法重新加载修改的配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  5. <!-- 线程执行器配置,用于任务注册 -->
  6. <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
  7. <property name="corePoolSize" value="10"/>
  8. <property name="maxPoolSize" value="100"/>
  9. <property name="queueCapacity" value="500"/>
  10. </bean>
  11. <!-- 设置调度 -->
  12. <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
  13. <property name="triggers">
  14. <list>
  15. <ref bean="refreshConfigCronTrigger"/>
  16. </list>
  17. </property>
  18. <property name="taskExecutor" ref="executor"/>
  19. </bean>
  20. <bean id="systemConfig" class="com.autfish.SystemConfig" >
  21. <constructor-arg value="classpath:system.properties"/>
  22. </bean>
  23. <bean id="refreshConfigJobDetail"
  24. class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  25. <property name="targetObject" ref="systemConfig"/>
  26. <property name="targetMethod" value="refresh"/>
  27. <property name="concurrent" value="false"/>
  28. </bean>
  29. <bean id="refreshConfigCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  30. <property name="jobDetail" ref="refreshConfigJobDetail"/>
  31. <property name="cronExpression" value="0 0/5 * * * ?"/>
  32. </bean>
  33. </beans>

这里设置了每5分钟重新读取一下,如果需要更即时的读取变化可通过修改cron表达式实现。

源码下载

使用quartz实现不重启服务器修改自定义配置的更多相关文章

  1. 【Eclipse】Eclipse中tomcat的Server配置(解决修改代码不断的重启服务器)以及设置tomcat文件发布位置与JSP编译位置查看

     Eclipse有时候修改一点JS或者JSP都会自动重启,有时候修改完JS或者JSP之后必须重启服务器才生效,下面研究了server的一些选项之后彻底解决了这些问题,下面做记录: 我的 Eclipse ...

  2. Linux下IP修改后重启服务器 oralce 出错(监听无法启动)

    针对linux下修改IP导致的Oracle不能启动问题的解决 主要修改/etc/hosts配置文件.修改前配置: # Do not remove the following line, or vari ...

  3. scoket模块 粘包问题 tcp协议特点 重启服务器会遇到地址被占用问题

    scoket()模块函数用法 import socket socket.socket(socket_family,socket_type,protocal=0) 获取tcp/ip套接字 tcpsock ...

  4. post提交/文件上传服务器修改

    第一步:修改在php5下POST文件大小的限制   1.编修php.ini   找到:max_execution_time = 30 ,这个是每个脚本运行的最长时间,单位秒,修改为: max_exec ...

  5. 超实用,你get了吗?再也不怕本地文件更新到环境用Linux命令重启服务器了。。。

    来公司这么久,写过不少代码,可是一碰见关于Linux命令操作的马上绕过,每次都是嚷嚷同事过来帮我替换文件,重启服务器,一直害怕接触命令的我一次一次不嫌麻烦,哈哈.有没有醉了?其实我一直都知道操作不难, ...

  6. Rabbitmq重启服务器用户丢失解决办法

    参考:https://blog.csdn.net/yiluoAK_47/article/details/78173563?utm_source=blogxgwz2 Rabbitmq创建的用户在服务器重 ...

  7. 关于阿里云ECS服务器修改远程端口的一点总结

    般修改公司的远程服务器的登录端口号分为两大步: 一.修改注册表中的两个地方的端口号:(注册表打开命令:regedit) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro ...

  8. 【转载】Windows服务器修改远程桌面默认端口

    因为 windows服务器远程桌面端口默认是 3389端口,使用系统默认端口的风险很大,很容易被攻击软件扫描以及攻击,同时频繁的扫描和攻击会导致服务器的 CPU 及带宽资源耗尽,因此为了保证服务器的安 ...

  9. 阿里云ECS服务器购买流程 (自定义配置购买、按月、按量购买)教程

    阿里ECS云服务器自定义购买流程 本文提供全图文流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

随机推荐

  1. springCloud项目练习

    1.https://gitee.com/xfdm/FCat angular4.springcloud开源实战项目:FCat项目(springcloud.mybatis.redis.angular4)是 ...

  2. MVC+EF 入门教程(四)

    一.前言 写了那么久,那么现在给大家看效果了 二.效果展示 点击创建Blog 显示 编辑 编辑成功,是不是很酷. 删除 终于完成了,准备睡觉!虽然有很多不足的地方,我会慢慢的去改的.感谢累了一天的自己 ...

  3. Swift基础学习

    Swift基础学习  http://c.biancheng.net/cpp/html/2242.html 这个网站最近看了一下,对于基本语法解释概括的相对全面,如同重新练习一遍OC似的,挺全面的,谢谢 ...

  4. Thymeleaf引擎支持Multi Prefix

    最近团队的一个项目在重构,希望引入Thymeleaf减少页面端的代码复杂性.在重构过程中,发现html文件需要保存在多个不同的目录中,但Thymeleaf缺省的实现不支持这种方式. 1        ...

  5. OpenGL ES学习001---绘制三角形

    PS:OpenGL ES是什么? OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL三维图形 API 的子集,针对手机.PDA和游戏主机等嵌入式设备而设计 ...

  6. linux mysql添加、删除用户、用户权限及mysql最大字段数量

    1.  登录: mysql -u username -p 显示全部的数据库: show databases; 使用某一个数据库: use databasename; 显示一个数据库的全部表: show ...

  7. Paho -物联网 MQTT C Cient的实现和详解

    概述   在文章Paho - MQTT C Cient的实现中,我介绍了如何使用Paho开源项目创建MQTTClient_pulish客户端.但只是简单的介绍了使用方法,而且客户端的结果与之前介绍的并 ...

  8. 不解释,分享这个base.css

    @charset "utf-8"; /*! * @名称:base.css * @功能:1.重设浏览器默认样式 * 2.设置通用原子类 */ /* 防止用户自定义背景颜色对网页的影响 ...

  9. Python学习_13_继承和元类

    继承 继承的含义就是子类继承父类的命名空间,子类中可以调用父类的属性和方法,由于命名空间的查找方式,当子类中定义和父类同名属性或者方法时,子类的实例调用的是子类中的属性,而不是父类,这就形成了pyth ...

  10. 漂亮的提示框SweetAlert使用教程

    一.简介 所使用过的弹出框插件,SweetAlert是最好用的.发展至今,已经有两个版本,一个是原版 t4t5/sweetalert , 一个是分支版 limonte/sweetalert2 ,更新相 ...