使用quartz实现不重启服务器修改自定义配置
为了方便维护系统,开发中通常会设置一些自定义参数,写在单独的配置文件里,需要调整时可直接登录服务器修复配置文件,而不需要修改程序。但尴尬的是,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()方法重新加载修改的配置:
- <?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表达式实现。
使用quartz实现不重启服务器修改自定义配置的更多相关文章
- 【Eclipse】Eclipse中tomcat的Server配置(解决修改代码不断的重启服务器)以及设置tomcat文件发布位置与JSP编译位置查看
Eclipse有时候修改一点JS或者JSP都会自动重启,有时候修改完JS或者JSP之后必须重启服务器才生效,下面研究了server的一些选项之后彻底解决了这些问题,下面做记录: 我的 Eclipse ...
- Linux下IP修改后重启服务器 oralce 出错(监听无法启动)
针对linux下修改IP导致的Oracle不能启动问题的解决 主要修改/etc/hosts配置文件.修改前配置: # Do not remove the following line, or vari ...
- scoket模块 粘包问题 tcp协议特点 重启服务器会遇到地址被占用问题
scoket()模块函数用法 import socket socket.socket(socket_family,socket_type,protocal=0) 获取tcp/ip套接字 tcpsock ...
- post提交/文件上传服务器修改
第一步:修改在php5下POST文件大小的限制 1.编修php.ini 找到:max_execution_time = 30 ,这个是每个脚本运行的最长时间,单位秒,修改为: max_exec ...
- 超实用,你get了吗?再也不怕本地文件更新到环境用Linux命令重启服务器了。。。
来公司这么久,写过不少代码,可是一碰见关于Linux命令操作的马上绕过,每次都是嚷嚷同事过来帮我替换文件,重启服务器,一直害怕接触命令的我一次一次不嫌麻烦,哈哈.有没有醉了?其实我一直都知道操作不难, ...
- Rabbitmq重启服务器用户丢失解决办法
参考:https://blog.csdn.net/yiluoAK_47/article/details/78173563?utm_source=blogxgwz2 Rabbitmq创建的用户在服务器重 ...
- 关于阿里云ECS服务器修改远程端口的一点总结
般修改公司的远程服务器的登录端口号分为两大步: 一.修改注册表中的两个地方的端口号:(注册表打开命令:regedit) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro ...
- 【转载】Windows服务器修改远程桌面默认端口
因为 windows服务器远程桌面端口默认是 3389端口,使用系统默认端口的风险很大,很容易被攻击软件扫描以及攻击,同时频繁的扫描和攻击会导致服务器的 CPU 及带宽资源耗尽,因此为了保证服务器的安 ...
- 阿里云ECS服务器购买流程 (自定义配置购买、按月、按量购买)教程
阿里ECS云服务器自定义购买流程 本文提供全图文流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...
随机推荐
- Eclipse中Spring插件的安装
java中为了方便学习使用SSH框架,框架插件的安装是非常必要的. 本博文记录了自己安装Spring插件的过程: 本机环境:win8 64bit eclipse版本:4.5.2 MARS 插件版本:S ...
- org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
异常信息 org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable represen ...
- 初探Azure的保留实例(Reserved Instance)
最近的Ignite 2017宣布了Azure将在年底推出保留实例(Reserved Instance).虽然在没有RI的这些年,Azure的EA Monetary Commitment同样也提供了和R ...
- Java8函数之旅 (五) -- Java8中的排序
前言 对数据进行排序是平常经常会用到的操作之一,使用Jav8排序可以减少你在排序这方面的代码量,优化你的代码. 测试用例代码 定义个实体类User,拥有姓名name,年龄age,积分credit ...
- 78、excel的读写操作
本篇主要是用python来自动生成excel数据文件也就是简单的excel读写操作.python读写excel文件主要是第三方模块库xlrd.xlwt. 本篇导航: 写excel 读excel 一.写 ...
- jmeter通过org.sqlite.JDBC驱动连接db数据库
最近遇到个项目,默认业务库为内置db数据库,在性能脚本编辑过程中要通过正则表达式提取器(关联)获取对应的id号,通过该id号到db数据库中查找对应的数据源name字段内容,为下一个post请求做par ...
- String 转化成java.sql.Date和java.sql.Time
String类型转换成java.sql.Date类型不能直接进行转换,首先要将String转换成java.util.Date,在转化成java.sql.Date 请点击---> java架构 ...
- Android:Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
今天开发Android项目时,导入了http有关架包后,程序编译报错如下: Error:Execution failed for task ':app:transformResourcesWithMe ...
- primer漏配问题解决
在对之前的ITS数据(454数据)做split时,发现有一些reads没有被匹配上,但是barcode能够完全匹配,虽然之后的primer在中间漏了一个碱基,导致后面的碱基全部误匹配,从而导致这条re ...
- 微信小程序开发之普通链接二维码
本文主要介绍扫普通链接二维码打开小程序, 详情请看官方文档https://mp.weixin.qq.com/debug/wxadoc/introduction/qrcode.html 配置普通链接二维 ...