直接贴出来代码:

 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. N个节点的二叉树有多少种形态(卡特兰数)

    N个节点的二叉树有多少种形态   这是一道阿里的面试题.其实算不上新鲜,但是我之前没关注过,如今碰到了,就顺便探讨下这个问题吧:) 拿到这个题,首先想到的是直接写出表达式肯定不行,所以有必要从递推入手 ...

  2. PHP base64多图片上传

    // 多图片上传,base64 public function upload_multi() { $pic = $_POST['pic']; if (!$pic) { $this->json-& ...

  3. python使用pika链接rabbitmq Connection reset by peer 解决办法

    记录一下, 最近在用机器学习打算做一个Rest API, 数据存入mongo,任务采用消息队列,rabbitmq 由于引擎采用python编写,所以WEB也直接打算用python编写了,比较省事. W ...

  4. 内网渗透神器xerosploit

    项目地址:https://github.com/LionSec/xerosploit 安装完成后直接在终端输入xerosploit打开 显示了本机的内网ip,mac地址,网关,网卡,输入help查看帮 ...

  5. Python之模拟职场人生游戏

    题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想 ...

  6. struts2结合axis开发webservice

    第一步:引入axis的依赖jar包  第二步:修改web.xml文件  <listener> <listener-class>org.apache.axis.transport ...

  7. java之yield(),sleep(),wait()区别详解-备忘笔记(转)

    1.sleep() 使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁.也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据.注意该方 ...

  8. 【原】Zookeeper 概述 + 官网 Overview 翻译

    分布式应用 分布式应用 distributed application可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的方式完成特定任务. (a), (b): a distrib ...

  9. eclipse egit(远程仓库)

    Git的强大之一体现在远程仓库,Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上.怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且 ...

  10. 【更多教程关注公众号全要买】1-2 Disruptor与BlockingQueue压力测试性能对比

    JDK所提供的BlockingQueue替换成Dis