zoukankan      html  css  js  c++  java
  • 使用quartz实现不重启服务器修改自定义配置

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

    项目结构:

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

    [html] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. debug=false  

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

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

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

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

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

    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    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.     <!-- 线程执行器配置,用于任务注册 -->  
    7.     <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">  
    8.         <property name="corePoolSize" value="10"/>  
    9.         <property name="maxPoolSize" value="100"/>  
    10.         <property name="queueCapacity" value="500"/>  
    11.     </bean>  
    12.   
    13.     <!-- 设置调度 -->  
    14.     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">  
    15.         <property name="triggers">  
    16.             <list>  
    17.                 <ref bean="refreshConfigCronTrigger"/>  
    18.             </list>  
    19.         </property>  
    20.         <property name="taskExecutor" ref="executor"/>  
    21.     </bean>  
    22.   
    23.     <bean id="systemConfig" class="com.autfish.SystemConfig" >  
    24.         <constructor-arg value="classpath:system.properties"/>  
    25.     </bean>  
    26.   
    27.     <bean id="refreshConfigJobDetail"  
    28.           class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
    29.         <property name="targetObject" ref="systemConfig"/>  
    30.         <property name="targetMethod" value="refresh"/>  
    31.         <property name="concurrent" value="false"/>  
    32.     </bean>  
    33.     <bean id="refreshConfigCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">  
    34.         <property name="jobDetail" ref="refreshConfigJobDetail"/>  
    35.         <property name="cronExpression" value="0 0/5 * * * ?"/>  
    36.     </bean>  
    37. </beans>  

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

    源码下载

  • 相关阅读:
    序列化
    执行mysql脚本
    MinGW-notepad++开发c/c++程序
    MySql免安装版配置方法
    Wamp 简单使用方法
    [锋利JQ]-图片提示效果
    [锋利的JQ]-超链接提示效果
    PHPcms 系统简单使用
    NC帮助文档网址
    NC的开发模型
  • 原文地址:https://www.cnblogs.com/sa-dan/p/6837121.html
Copyright © 2011-2022 走看看