独立线程监控配置文件是否变更,适用于更新了配置文件,不需要重启tomcat服务
直接贴出来代码:
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服务的更多相关文章
- 【shell脚本】自动监控tomcat服务===autoCheck.sh
自动监控tomcat服务,当tommcat服务挂掉时自动重启 一.脚本内容 [root@localhost ]# cat /root/autoCheck.sh #!/bin/bash startTom ...
- Hadoop Yarn内存资源隔离实现原理——基于线程监控的内存隔离方案
注:本文以hadoop-2.5.0-cdh5.3.2为例进行说明. Hadoop Yarn的资源隔离是指为运行着不同任务的“Container”提供可独立使用的计算资源,以避免它们之间相互干扰.目 ...
- 通过使用Web Workers,Web应用程序可以在独立于主线程的后台线程中,运行一个脚本操作。这样做的好处是可以在独立线程中执行费时的处理任务,从而允许主线程(通常是UI线程)不会因此被阻塞/放慢。
Web Workers API - Web API 接口参考 | MDNhttps://developer.mozilla.org/zh-CN/docs/Web/API/Web_Workers_API ...
- 用java语言构建一个网络服务器,实现客户端和服务器之间通信,实现客户端拥有独立线程,互不干扰
服务器: 1.与客户端的交流手段多是I/O流的方式 2.对接的方式是Socket套接字,套接字通过IP地址和端口号来建立连接 3.(曾经十分影响理解的点)服务器发出的输出流的所有信息都会成为客户端的输 ...
- Security基础(四):OpenSSL及证书服务常用系统监控命令、搭建nagios监控服务器、配置文件及插件使用、监控远程主机的公有数据、监控远程主机的私有数据
一.OpenSSL及证书服务常用系统监控命令 目标: 本案例要求练习常用的系统监控命令完成以下任务: 使用vmstat命令监控内存及磁盘I/O信息 使用iostat命令监控CPU处理器及磁盘的I/O信 ...
- C#新开一个线程取到数据,如何更新到主线程UI上面
一:问题 之前有被面试官问过,在WinForm中,要去网络上获取数据,由于网络环境等原因,不能很快的完成,因此会发生进程阻塞,造成主进程假死的现象,需要怎么解决? 二:思路 因此,往往是新 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- 多线程爬虫Java调用wget下载文件,独立线程读取输出缓冲区
写了个抓取appstore的,要抓取大量的app,本来是用httpclient,但是效果不理想,于是直接调用wget下载,但是由于标准输出.错误输出的原因会导致卡住,另外wget也会莫名的卡住. 所以 ...
- MOOS学习笔记4——独立线程不同回调
MOOS学习笔记4--独立线程不同回调 /** * @fn 独立线程不同回调 * @version v1.0 * @author */ #include "MOOS/libMOOS/Comm ...
随机推荐
- spring data mongodb 操作
xml配置(mongo集群方式): <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...
- AJAX流程 代码
var xml = window.XMLHttpRequest ?new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHT ...
- ubuntu双网卡准备配置
近日有个需求,交换机有两台,做了堆叠,服务器双网卡,每个分别连到一台交换机上.这样就需要将服务器的网卡做成主备模式,以增加安全性,使得当其中一个交换机不通的时候网卡能够自动切换. 整体配置不难,网上也 ...
- scikit-learn和tensorflow的区别
1.功能不同 Scikit-learn(sklearn)的定位是通用机器学习库,而TensorFlow(tf)的定位主要是深度学习库.一个显而易见的不同:tf并未提供sklearn那种强大的特征工程, ...
- STM32使用无源蜂鸣器演奏歌曲
上一次使用了有源蜂鸣器,只能发出固定的”滴滴“声,当然不能满足于此呀.使用无源蜂鸣器,只要输出不同频率的PWM波,即可发出不同的音符. 不同的音符组合起来就是一个曲子了. 改变PWM的音调,可以输出D ...
- delphi IOS发布添加其他资源文件
添加自己的文件. Project>Deployment>Add File Remote Path android and IOS: assets\internal\ TPath.GetDo ...
- MSDE2000
安装MSDE2000的时候,遇到的两个问题 sqlserver 小版本 SQL安装问题.系统说:为了安全,要求使用SA密码,请使用SAPWD开关提供同一密码
- typedef struct与struct的区别
typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据 ...
- EF中的批量操作
阅读目录 插入 更新 删除 在使用EF的过程中,我们经常会遇到需要批量操作数据的场景,批量操作有的时候不仅能提高性能,比如使用SqlBulkCopy进入批量插入的时候,而且比较方便操作,提高效率.那么 ...
- Python:cmd传参
假如你写了一个文件test.py,你需要三个参数,你运行时: python test.py arg1 arg2 arg3 在test.py中读取这几个参数: import sys print 'Num ...