Springboot之文件监控
背景:在实际环境部署构成中,由于特殊网络环境因素,有很多服务器之间的网络都是单向的,不能互相访问的,只有通过特定技术手段做到文件的单项摆渡,这就需要在两台服务器上分别写序列化程序和反序列化程序,这里不记录序列化的内容,记录反序列化程序中的文件监控内容。
1、文件监控方式一:java的文件监控有两种方式,方法一:java7提供的 WatchService,但是这个方法有一些问题存在以下问题:
a.当文件修改的时候,会收到两次通知,这个问题需要通过自己写代码去解决
b.不能监控子目录下的文件变化
c.无法对监控文件进行过滤,只监控自己感兴趣的文件
2、文件监控方式二:commons-io(原理采用监控者模式和定时刷新监控文件夹),项目中实际使用的方式。
代码如下:
/**
* 目录监听器
*
* @return
*/
@Bean
public FileAlterationMonitor fileAlterationMonitor(@Autowired DirectoryWatchService directoryWatchService, @Autowired FileFilter fileFilter) {
//监控器 100 监控刷新时间
FileAlterationMonitor monitor = new FileAlterationMonitor(100);
// 多个文件夹监控,需要add多个观察者
for (String path : directoryPath) {
log.info("监听目录:{}",path);
//对某个路径的观察者
FileAlterationObserver observer = new FileAlterationObserver(path, fileFilter);
// 增加文件过滤,符合文件后缀的文件才进行处理,防止操作系统中生成的临时文件无法处理
//添加监听事件响应,与path无关,rsync同步需要
observer.addListener(directoryWatchService);
//将观察者添加到监控器
monitor.addObserver(observer);
}
return monitor;
}
目录监听服务
@Component
@Slf4j
public class DirectoryWatchService extends FileAlterationListenerAdaptor { @Override
public void onStart(FileAlterationObserver observer) { log.debug("开始对目录:{}进行监听", observer.getDirectory().getPath()); } @Override
public void onDirectoryCreate(File directory) {
log.info("目录:{}创建", directory.getPath()); } @Override
public void onDirectoryChange(File directory) {
log.info("目录:{}改变", directory.getPath());
} @Override
public void onDirectoryDelete(File directory) {
log.info("目录:{}被删除", directory.getPath());
} @Override
public void onFileCreate(File file) {
log.info("文件:{}创建", file.getPath());
// TODO
} @Override
public void onFileChange(File file) {
log.info("文件:{}改变", file.getPath());
} @Override
public void onFileDelete(File file) {
log.info("文件:{}删除", file.getPath());
} @Override
public void onStop(FileAlterationObserver observer) {
log.debug("停止目录{}监听", observer.getDirectory().getPath());
super.onStop(observer);
}
}
文件过滤器
public class BchtFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
if(pathname.getPath().endsWith(".data") || pathname.getPath().endsWith(".DATA")){
return true;
}
return false;
}
}
Springboot之文件监控的更多相关文章
- 在C#使用文件监控对象FileSystemWatcher的几种方案
最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务 ...
- 使用文件监控对象FileSystemWatcher实现数据同步
最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务 ...
- C#使用文件监控对象FileSystemWatcher 实现数据同步
在C#使用文件监控对象FileSystemWatcher 实现数据同步 2013-12-12 18:24 by 幕三少, 352 阅读, 3 评论, 收藏, 编辑 最近在项目中有这么个需求,就是得去实 ...
- C#使用FileSystemWatcher控件实现的文件监控功能示例
本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...
- SpringBoot系列: Java应用程序传参和SpringBoot参数文件
===========================向java 程序传参的几种形式:===========================1. 使用 OS 环境变量. 这个不推荐. 2. 使用JVM ...
- Springboot静态文件不更新的解决办法,以及Springboot实现热部署
Springboot静态文件不更新的解决办法,以及Springboot实现热部署 原文链接:https://www.cnblogs.com/blog5277/p/9271882.html 原文作者:博 ...
- java实现文件监控
文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...
- Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控
Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控 Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含: ...
- Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans
Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans
随机推荐
- Sense Sense (Beta)安装及解决部分Chrome插件安装时程序包无效:"CRX_HEADER_INVALID"
下载地址 http://down.cnplugins.com/down/down.aspx?fn=1412/www.cnplugins.com_lhjgkmllcaadmopgmanpapmpjgm ...
- 使用MDNS进行局域网服务发现(.NET Core)
使用MDNS进行局域网服务发现(.NET Core) 想要服务写的好,配置文件不可少.如果是一个复杂的系统,甚至配置文件都是需要进行动态调整的,做起来好像就不是那么方便了,通常情况下,asp.net ...
- 访问控制列表ACL应用
ACL的应用的场景 应用在三层接口 • Nat地址转换 Nat(network address translation,地址转换)是将数据报报头中的ip地址转换为另一个ip地址的过程,主要用于实现内部 ...
- 云原生网络代理(MOSN)的进化之路
本文系云原生应用最佳实践杭州站活动演讲稿整理.杭州站活动邀请了 Apache APISIX 项目 VP 温铭.又拍云平台开发部高级工程师莫红波.蚂蚁金服技术专家王发康.有赞中间件开发工程师张超,分享云 ...
- 其它语言通过HiveServer2访问Hive
先解释一下几个名词: metadata :hive元数据,即hive定义的表名,字段名,类型,分区,用户这些数据.一般存储关系型书库mysql中,在测试阶段也可以用hive内置Derby数据库. me ...
- k8s应用环境
1.7:k8s应用环境: 1.7.1:dashboard(1.10.1) 部署kubernetes的web管理界面dashboard 参考文档: https://www.jianshu.com/p/4 ...
- webform中ajax.ajaxMethod使用方法
前言 dll文件 如果还没有ajax.dll文件,就先下载一个来 引用 将ajax.dll添加到项目引用中:在VS的解决方案资源管理器中右键点击项目名称--"添加项目引用"--浏览 ...
- Python序列(十一)集合
集合试无序可变列表,使用一对大括号界定,元素不可重复,同一个集合中每一个元素的都是唯一的. 集合只能包含数字.字符串.元祖等不可变类型(或者说可哈希)的数据,而不能包含列表.字典.集合等可变类型额数据 ...
- CSS中margin:auto什么意思?margin:auto属性的用法详解
我们都知道使用margin:auto可以让元素水平居中的.但你有没有想过使用margin:auto可以让元素水平居中的原因,要回答这个问题,我们首先需要看一下margin:auto的工作原理.auto ...
- python使用smtplib和email库发送邮件
国内很多服务器提供商都默认禁止了smtp默认的25端口服务,而启用465端口发送邮件 在smtplib库中直接调用SMTP_SSL就是默认使用465端口 示例代码如下: def send_eamil( ...