zoukankan      html  css  js  c++  java
  • 独立线程监控配置文件是否变更,适用于更新了配置文件,不需要重启tomcat服务

    直接贴出来代码:

      1 package cn.leadeon.utils.file;
      2 
      3 import java.io.File;
      4 import java.io.FileInputStream;
      5 import java.io.FileNotFoundException;
      6 import java.io.IOException;
      7 import java.util.Properties;
      8 
      9 /**
     10  * 轮询监控配置文件是否更新,动态获取最新内容
     11  * 
     12  * @author LiJunJun
     13  * @date 2018.08.08
     14  */
     15 public class MonitorSysPropertiesUtil
     16 {
     17     private static Properties SysLocalPropObject = null;
     18     
     19     // 配置文件绝对路径
     20     private static String defaultPropFilePath = null;
     21     
     22     // 配置文件名称
     23     private static String propertiesName = null;
     24     
     25     // 文件更新标识
     26     protected long lastModifiedData = -1;
     27     
     28     private static MonitorSysPropertiesUtil instance;
     29     
     30     public static MonitorSysPropertiesUtil getInstance(String fileName)
     31     {
     32         if (propertiesName == null)
     33         {
     34             propertiesName = fileName;
     35         }
     36         
     37         if (instance == null)
     38         {
     39             syncInit();
     40         }
     41         
     42         return instance;
     43     }
     44     
     45     /**
     46      * 同步块,避免多线程调用,生成多个实例
     47      */
     48     private static synchronized void syncInit()
     49     {
     50         if (instance == null)
     51         {
     52             instance = new MonitorSysPropertiesUtil();
     53         }
     54     }
     55     
     56     /**
     57      * 私有构造器启动一个线程实时监控配置文件
     58      */
     59     private MonitorSysPropertiesUtil()
     60     {
     61         SysLocalPropObject = new Properties();
     62         
     63         ClassLoader classLoader = MonitorSysPropertiesUtil.class.getClassLoader();
     64         
     65         defaultPropFilePath = classLoader.getResource(propertiesName).getFile();
     66         
     67         File propertyFile = new File(defaultPropFilePath);
     68         
     69         if (propertyFile.exists())
     70         {
     71             reloadFile(propertyFile);
     72         }
     73         
     74         // 循环监控配置文件的变化,一旦发现文件发生变化了则重读配置文件
     75         Thread thread = new Thread(new monitorRunnable(defaultPropFilePath));
     76         
     77         thread.start();
     78     }
     79     
     80     /**
     81      * 监控线程内部类
     82      * 
     83      * @author LiJunJun
     84      */
     85     class monitorRunnable implements Runnable
     86     {
     87         
     88         private String filePath;
     89         
     90         final MonitorSysPropertiesUtil self = MonitorSysPropertiesUtil.this;
     91         
     92         public monitorRunnable(String filePath)
     93         {
     94             this.filePath = filePath;
     95         }
     96         
     97         @Override
     98         public void run()
     99         {
    100             while (true)
    101             {
    102                 // 间隔10分钟
    103                 try
    104                 {
    105                     Thread.sleep(1000 * 60 * 10);
    106                     // Thread.sleep(1000);
    107                 }
    108                 catch (InterruptedException e)
    109                 {
    110                     System.out.println("定时巡检配置文件线程休眠异常" + Thread.currentThread().getName());
    111                     e.printStackTrace();
    112                 }
    113                 
    114                 try
    115                 {
    116                     File propertyFile = new File(filePath);
    117                     
    118                     if (self.lastModifiedData != propertyFile.lastModified())
    119                     {
    120                         self.reloadFile(propertyFile);
    121                         self.lastModifiedData = propertyFile.lastModified();
    122                     }
    123                 }
    124                 catch (Exception e)
    125                 {
    126                     System.out.println("校验配置文件是否改变异常,MonitorSysPropertiesUtil -- monitorRunnable");
    127                     e.printStackTrace();
    128                 }
    129             }
    130         }
    131         
    132     }
    133     
    134     /**
    135      * 重新加载文件
    136      * 
    137      * @author LiJunJun 2017.08.08
    138      * @param propertyFile 配置文件路径
    139      */
    140     private void reloadFile(File propertyFile)
    141     {
    142         FileInputStream inputStreamLocal = null;
    143         try
    144         {
    145             inputStreamLocal = new FileInputStream(propertyFile);
    146             
    147             SysLocalPropObject.load(inputStreamLocal);
    148         }
    149         catch (Exception e)
    150         {
    151             if (e instanceof FileNotFoundException)
    152             {
    153                 SysLocalPropObject = null;
    154             }
    155             else
    156             {
    157                 System.out.println("校验配置文件是否改变异常,MonitorSysPropertiesUtil -- reloadFile failed");
    158             }
    159             e.printStackTrace();
    160         }
    161         finally
    162         {
    163             try
    164             {
    165                 if (inputStreamLocal != null)
    166                 {
    167                     inputStreamLocal.close();
    168                 }
    169             }
    170             catch (IOException e)
    171             {
    172                 System.out.println("关闭IO流异常,MonitorSysPropertiesUtil -- reloadFile failed");
    173                 e.printStackTrace();
    174             }
    175         }
    176     }
    177     
    178     /**
    179      * 对外提供获取配置文件对象的方法
    180      */
    181     public static Properties getPropertiesObject()
    182     {
    183         return SysLocalPropObject;
    184     }
    185 }
  • 相关阅读:
    RabbitMq的死信队列和延迟队列
    Rabbitmq的过期时间
    技术干货 | 源码解析 Github 上 14.1k Star 的 RocketMQ
    深入分析 Flutter 渲染性能
    重磅发布 阿里云数据中台全新产品DataTrust聚焦企业数据安全保障
    DataWorks搬站方案:Airflow作业迁移至DataWorks
    DataWorks搬站方案:Azkaban作业迁移至DataWorks
    基于 Flutter 的 Web 渲染引擎「北海」正式开源!
    走完线上 BUG 定位最后一公里
    10种编程语言实现Y组合子
  • 原文地址:https://www.cnblogs.com/ft535535/p/9681039.html
Copyright © 2011-2022 走看看