使用quartz实现不重启服务器修改自定义配置

版权声明:欢迎转载, 转载请保留原文链接。 https://blog.csdn.net/autfish/article/details/54583183

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

项目结构:


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

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

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

package com.autfish;

import org.apache.commons.lang3.BooleanUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;

/**
 * Created by autfish on 2017/1/17.
 */
public class SystemConfig {
    private static Logger logger = LogManager.getLogger("system");

    private static Properties props = new Properties();
    private File configFile = null;

    public SystemConfig(String filePath) {
        try {
            this.configFile = ResourceUtils.getFile(filePath);
            this.refresh();
        } catch (FileNotFoundException e) {
            logger.error(e);
            logger.warn("file [" + filePath + "] not found!");
            this.configFile = null;
        }
    }

    public void refresh() {
        if (this.configFile != null)
            SystemConfig.loadConfig(this.configFile);
        else
            logger.warn("load configuration file failed!");
    }

    private static void loadConfig(File configFile) {
        try (FileInputStream fis = new FileInputStream(configFile) {
            @Override
            public void close() { }
        }) {
            if (props.isEmpty()) {
                props.load(fis);
            } else {
                Properties temp = new Properties();
                temp.load(fis);
                for (Object key : temp.keySet()) {
                    String value = temp.getProperty(key.toString());
                    if (props.getProperty(key.toString()) != null && !props.getProperty(key.toString()).equals(value)) {
                        props.setProperty(key.toString(), value);
                        logger.info("property changed: " + key.toString() + "=" + value);
                    }
                }
            }
        } catch (Exception e) {
            logger.error(e);
        }
    }

    public static boolean isDebug() {
        return BooleanUtils.toBoolean(props.getProperty("debug"));
    }
}
在项目中可通过SystemConfig.isDebug()方法读取当前配置。

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

扫描二维码关注公众号,回复: 3784281 查看本文章
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 线程执行器配置,用于任务注册 -->
    <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="10"/>
        <property name="maxPoolSize" value="100"/>
        <property name="queueCapacity" value="500"/>
    </bean>

    <!-- 设置调度 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
        <property name="triggers">
            <list>
                <ref bean="refreshConfigCronTrigger"/>
            </list>
        </property>
        <property name="taskExecutor" ref="executor"/>
    </bean>

    <bean id="systemConfig" class="com.autfish.SystemConfig" >
        <constructor-arg value="classpath:system.properties"/>
    </bean>

    <bean id="refreshConfigJobDetail"
          class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="systemConfig"/>
        <property name="targetMethod" value="refresh"/>
        <property name="concurrent" value="false"/>
    </bean>
    <bean id="refreshConfigCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="refreshConfigJobDetail"/>
        <property name="cronExpression" value="0 0/5 * * * ?"/>
    </bean>
</beans>

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


源码下载

猜你喜欢

转载自blog.csdn.net/autfish/article/details/54583183