直接贴出来代码:

 package cn.leadeon.utils.file;

 import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties; /**
* 轮询监控配置文件是否更新,动态获取最新内容
*
* @author LiJunJun
* @date 2018.08.08
*/
public class MonitorSysPropertiesUtil
{
private static Properties SysLocalPropObject = null; // 配置文件绝对路径
private static String defaultPropFilePath = null; // 配置文件名称
private static String propertiesName = null; // 文件更新标识
protected long lastModifiedData = -1; private static MonitorSysPropertiesUtil instance; public static MonitorSysPropertiesUtil getInstance(String fileName)
{
if (propertiesName == null)
{
propertiesName = fileName;
} if (instance == null)
{
syncInit();
} return instance;
} /**
* 同步块,避免多线程调用,生成多个实例
*/
private static synchronized void syncInit()
{
if (instance == null)
{
instance = new MonitorSysPropertiesUtil();
}
} /**
* 私有构造器启动一个线程实时监控配置文件
*/
private MonitorSysPropertiesUtil()
{
SysLocalPropObject = new Properties(); ClassLoader classLoader = MonitorSysPropertiesUtil.class.getClassLoader(); defaultPropFilePath = classLoader.getResource(propertiesName).getFile(); File propertyFile = new File(defaultPropFilePath); if (propertyFile.exists())
{
reloadFile(propertyFile);
} // 循环监控配置文件的变化,一旦发现文件发生变化了则重读配置文件
Thread thread = new Thread(new monitorRunnable(defaultPropFilePath)); thread.start();
} /**
* 监控线程内部类
*
* @author LiJunJun
*/
class monitorRunnable implements Runnable
{ private String filePath; final MonitorSysPropertiesUtil self = MonitorSysPropertiesUtil.this; public monitorRunnable(String filePath)
{
this.filePath = filePath;
} @Override
public void run()
{
while (true)
{
// 间隔10分钟
try
{
Thread.sleep(1000 * 60 * 10);
// Thread.sleep(1000);
}
catch (InterruptedException e)
{
System.out.println("定时巡检配置文件线程休眠异常" + Thread.currentThread().getName());
e.printStackTrace();
} try
{
File propertyFile = new File(filePath); if (self.lastModifiedData != propertyFile.lastModified())
{
self.reloadFile(propertyFile);
self.lastModifiedData = propertyFile.lastModified();
}
}
catch (Exception e)
{
System.out.println("校验配置文件是否改变异常,MonitorSysPropertiesUtil -- monitorRunnable");
e.printStackTrace();
}
}
} } /**
* 重新加载文件
*
* @author LiJunJun 2017.08.08
* @param propertyFile 配置文件路径
*/
private void reloadFile(File propertyFile)
{
FileInputStream inputStreamLocal = null;
try
{
inputStreamLocal = new FileInputStream(propertyFile); SysLocalPropObject.load(inputStreamLocal);
}
catch (Exception e)
{
if (e instanceof FileNotFoundException)
{
SysLocalPropObject = null;
}
else
{
System.out.println("校验配置文件是否改变异常,MonitorSysPropertiesUtil -- reloadFile failed");
}
e.printStackTrace();
}
finally
{
try
{
if (inputStreamLocal != null)
{
inputStreamLocal.close();
}
}
catch (IOException e)
{
System.out.println("关闭IO流异常,MonitorSysPropertiesUtil -- reloadFile failed");
e.printStackTrace();
}
}
} /**
* 对外提供获取配置文件对象的方法
*/
public static Properties getPropertiesObject()
{
return SysLocalPropObject;
}
}

独立线程监控配置文件是否变更,适用于更新了配置文件,不需要重启tomcat服务的更多相关文章

  1. 【shell脚本】自动监控tomcat服务===autoCheck.sh

    自动监控tomcat服务,当tommcat服务挂掉时自动重启 一.脚本内容 [root@localhost ]# cat /root/autoCheck.sh #!/bin/bash startTom ...

  2. Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案

    注:本文以hadoop-2.5.0-cdh5.3.2为例进行说明.   Hadoop Yarn的资源隔离是指为运行着不同任务的“Container”提供可独立使用的计算资源,以避免它们之间相互干扰.目 ...

  3. 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。

    Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API ...

  4. 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰

    服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...

  5. Security基础(四):OpenSSL及证书服务常用系统监控命令、搭建nagios监控服务器、配置文件及插件使用、监控远程主机的公有数据、监控远程主机的私有数据

    一.OpenSSL及证书服务常用系统监控命令 目标: 本案例要求练习常用的系统监控命令完成以下任务: 使用vmstat命令监控内存及磁盘I/O信息 使用iostat命令监控CPU处理器及磁盘的I/O信 ...

  6. C#新开一个线程取到数据,如何更新到主线程UI上面

       一:问题 之前有被面试官问过,在WinForm中,要去网络上获取数据,由于网络环境等原因,不能很快的完成,因此会发生进程阻塞,造成主进程假死的现象,需要怎么解决?    二:思路 因此,往往是新 ...

  7. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  8. 多线程爬虫Java调用wget下载文件,独立线程读取输出缓冲区

    写了个抓取appstore的,要抓取大量的app,本来是用httpclient,但是效果不理想,于是直接调用wget下载,但是由于标准输出.错误输出的原因会导致卡住,另外wget也会莫名的卡住. 所以 ...

  9. MOOS学习笔记4——独立线程不同回调

    MOOS学习笔记4--独立线程不同回调 /** * @fn 独立线程不同回调 * @version v1.0 * @author */ #include "MOOS/libMOOS/Comm ...

随机推荐

  1. PTA 畅通工程之最低成本建设问题(30 分)(最小生成树 krusal)

    畅通工程之最低成本建设问题(30 分) 某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路 ...

  2. elasticsearch5.6.8中文分词器

    安装分词器,务必确保版本一致! 下载地址:https://github.com/medcl/elasticsearch-analysis-ik 为了保证一致,我特地将elasticsearch进行降级 ...

  3. 编写一个jQuery的扩展方法(插件)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Shell编程的基本语法

    Shell编程 创建sh文件 touch test.sh vim test.sh 写入如下内容 #!/bin/bash a="hello" 运行 chmod +x /root/te ...

  5. springboot成神之——websocket发送和请求消息

    本文介绍如何使用websocket发送和请求消息 项目目录 依赖 DemoApplication MessageModel WebConfig WebSocketConfig HttpHandshak ...

  6. C# IP地址去掉端口号

    string Ip1 = "192.168.0.199:7777"; string Ip2 = Ip1.Remove(Ip1.IndexOf(':'));

  7. Internet Explorer 无法打开该 Internet 站点,请求的站点不可用或无法找到

    笔者最近遇见一个神奇的问题,同事在开发时用的谷歌浏览器,实现了一个下载功能,测试也没问题:但测试人员反馈说他那边没法下载,报异常.弹出框 同事跑过来和我商讨这个问题,笔者当时就懵了,于是赶紧查找相关资 ...

  8. Logos

    [Logos] Logos is a component of the Theos development suite that allows method hooking code to be wr ...

  9. Base -快捷键|通配符|特殊符号|输出(正确与错误的保存)

    curl + a   移动光标到行首. curl +e    移动光标到行尾. curl +k    剪切光标所在位置到行末的字符. curl+u    剪切光标所在位置到行首的字符. curl +y ...

  10. MySQL - pt-query-digest的下载与使用

    对于脚本文件,是可以执行的,我们不用安装.所以,但是这个脚本文件没有执行的权限,所以,我们首先赋予这个脚本文件的可执行的权限. 再次查看文件的信息后. 已经有了执行的权限了. 运行脚本的时候,可要注意 ...