SpringBoot框架下实现配置文件修改动态加载(不用重启服务)

代码中涉及到的redis的东西都可以删除,主要在文件监听和文件加载这些地方

Controller层
File file = new File("配置文件url");
JSONObject jsonObject = fileLinstenerService.fileChangeDoSomething(file);
Service层
@Autowired
RedisUtils redisUtils;

private Map<String,Long> configFileModifyDate = new HashMap<String, Long>();

@Override
public JSONObject fileChangeDoSomething(File file) {
    return this.loadAllConfigFiles(file);
}

/**
* 检查系统配置文件,并更新全局变量 。
* @throws Exception
* @date 2012-8-31
*/
private JSONObject loadAllConfigFiles(File file){
   String name = file.getName();
   String fullPath = file.getAbsolutePath();
   JSONObject jsonObject =  null;
   if(name.matches("^flowsurvey.*\\.properties$")){//properties,配置文件
      Long value = configFileModifyDate.get(fullPath);
      if(value==null || value.longValue()!=file.lastModified()){
      jsonObject = loadPropertieFile(file);
      System.out.println("loadAllConfigFiles-"+file);
      LOGGER.info("更新的文件为:{}",file);
             configFileModifyDate.put(fullPath,file.lastModified());
            }
        }
     return jsonObject;
    }
/**
 * 加载配置文件到SYSTEM_CONFIG
 * @date 2012-8-31
 * @param configFile 系统配置文件以 sys*.properties命名。
*/
private JSONObject loadPropertieFile(File configFile) {
try {
     Properties properties = PropertiesLoaderUtils.loadProperties(new FileSystemResource(configFile));
     JSONObject jsonObject = new JSONObject();          
     redisUtils.deleteKey("Smk_Flowsurvey_Subject_Tip");
     for(String key:properties.stringPropertyNames()){
                String value=properties.getProperty(key);
                if (key.equals("key1")){
                    jsonObject.put("middleRisk",value);
                }
                if (key.equals("key2")){
                    jsonObject.put("highRisk",value);
                }
            }
            redisUtils.set("redis中存储的key", jsonObject.toJSONString());
            LOGGER.info(configFile+"-更新以后的信息为:{}",jsonObject.toJSONString());
            return jsonObject;
        } catch (IOException e) {
            e.printStackTrace();
            LOGGER.info("更新配置文件异常{}",e.getMessage());
            return new JSONObject();
        }
    }
编写文件监听器
@Configuration
public class FileListener extends FileAlterationListenerAdaptor {

    @Autowired
    FileLinstenerService fileLinstenerService;

    public FileListener(FileLinstenerService fileLinstenerService){
        this.fileLinstenerService = fileLinstenerService;
    }

    // 文件创建执行
    @Override
    public void onFileCreate(File file) {
        System.out.println(" onFileCreate");
    }

    // 文件创建修改
    @Override
    public void onFileChange(File file) {
        // 触发业务
        fileLinstenerService.fileChangeDoSomething(file);
    }

    // 文件创建删除
    @Override
    public void onFileDelete(File file) {
        System.out.println(" 文件创建删除");
    }

    // 目录创建
    @Override
    public void onDirectoryCreate(File directory) {
        System.out.println(" 目录创建");
    }

    // 目录修改
    @Override
    public void onDirectoryChange(File directory) {
    }

    // 目录删除
    @Override
    public void onDirectoryDelete(File directory) {
    }


    // 轮询开始
    @Override
    public void onStart(FileAlterationObserver observer) {
    }

    // 轮询结束
    @Override
    public void onStop(FileAlterationObserver observer) {
    }

}

设置监听工厂
@Component
public class FileListenerFactory {

    //设置监听路径
   private final String listenerPath = "./";

   //设置轮询间隔
    private final long interval = TimeUnit.SECONDS.toMillis(1);

    //自动注入业务服务
    @Autowired
    FileLinstenerService fileLinstenerService;

    public FileAlterationMonitor getMonitor(){

        System.out.println("listenerPath"+listenerPath);
        System.out.println("getMonitor");
        //创建过滤器
        IOFileFilter directories = FileFilterUtils
                .and(FileFilterUtils.directoryFileFilter(), HiddenFileFilter.VISIBLE);
        IOFileFilter fileFilter = FileFilterUtils
                .and(FileFilterUtils.fileFileFilter(),FileFilterUtils.suffixFileFilter(".properties"));
        IOFileFilter filter = FileFilterUtils.or(directories,fileFilter);

        //装配过滤器
        FileAlterationObserver observer = new FileAlterationObserver(new File(listenerPath),filter);
        //向监听者添加业务监听器,并注入业务服务
        observer.addListener(new FileListener(fileLinstenerService));
        //返回监听者
        return new FileAlterationMonitor(interval,observer);
    }
}

设置文件监听自启动

@Component
public class FileListenerRunner implements CommandLineRunner {

    @Autowired
    FileListenerFactory fileListenerFactory;

    @Override
    public void run(String... args) throws Exception {
        try {
            System.out.println("FileListenerRunner");
            FileAlterationMonitor monitor = fileListenerFactory.getMonitor();
            monitor.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值