背景:在实际环境部署构成中,由于特殊网络环境因素,有很多服务器之间的网络都是单向的,不能互相访问的,只有通过特定技术手段做到文件的单项摆渡,这就需要在两台服务器上分别写序列化程序和反序列化程序,这里不记录序列化的内容,记录反序列化程序中的文件监控内容。

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之文件监控的更多相关文章

  1. 在C#使用文件监控对象FileSystemWatcher的几种方案

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给web服务 ...

  2. 使用文件监控对象FileSystemWatcher实现数据同步

    最近在项目中有这么个需求,就是得去实时获取某个在无规律改变的文本文件中的内容.首先想到的是用程序定期去访问这个文件,因为对实时性要求很高,间隔不能超过1S,而且每次获取到文本内容都要去分发给WEB服务 ...

  3. C#使用文件监控对象FileSystemWatcher 实现数据同步

    在C#使用文件监控对象FileSystemWatcher 实现数据同步 2013-12-12 18:24 by 幕三少, 352 阅读, 3 评论, 收藏, 编辑 最近在项目中有这么个需求,就是得去实 ...

  4. C#使用FileSystemWatcher控件实现的文件监控功能示例

    本文实例讲述了C#使用FileSystemWatcher控件实现的文件监控功能.分享给大家供大家参考,具体如下: FileSystemWatcher 可以使用FileSystemWatcher组件监视 ...

  5. SpringBoot系列: Java应用程序传参和SpringBoot参数文件

    ===========================向java 程序传参的几种形式:===========================1. 使用 OS 环境变量. 这个不推荐. 2. 使用JVM ...

  6. Springboot静态文件不更新的解决办法,以及Springboot实现热部署

    Springboot静态文件不更新的解决办法,以及Springboot实现热部署 原文链接:https://www.cnblogs.com/blog5277/p/9271882.html 原文作者:博 ...

  7. java实现文件监控

    文件监控器: package testfile; import org.apache.commons.io.monitor.FileAlterationListenerAdaptor; import ...

  8. Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控

    Spring Boot(二十):使用spring-boot-admin对spring-boot服务进行监控 Spring Boot Actuator提供了对单个Spring Boot的监控,信息包含: ...

  9. Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans

    Springboot 启动文件报错,原因是@ComponentScan写成了@ComponentScans

随机推荐

  1. MySql字符集与排序规则详解

    前段时间往MySQL中存入emoji表情或生僻字.繁体字时,报错无法添加,研究后发现这是字符集编码的问题,今天就来分析一下各个字符集与排序规则 一.字符集 先说字符,字符是各种文字和符号的总称,包括各 ...

  2. sqlplus、lsnrctl命令工具不可用(libclntsh.so.11.1)

    原因: libclntsh.so.11.1文件丢失了 解决方法: 在其他机器把这个文件拷贝到目标库安装目录底下的lib目录即可

  3. SpringBoot2.x集成Quartz实现定时任务管理(持久化到数据库)

    1. Quartz简介   Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目.   Quartz是一个完全由Java编写的开源作业调度框架,为在Java应 ...

  4. Sharding-JDBC分库分表简单示例

    1. 简介 Sharding是一个简单的分库分表中间件,它不需要依赖于其他的服务,即可快速应用在实际项目的分库分表策略中. 2. 初始化数据库(db0.db1.db2) 1 #创建数据库db0 2 C ...

  5. Fastjson 1.2.47 远程命令执行漏洞复现

    前言 这个漏洞出来有一段时间了,有人一直复现不成功来问我,就自己复现了下,顺便简单记录下这个漏洞原理,以便后面回忆. 复现过程 网上已经有很多文章了,这里就不在写了.主要记录一下复现过程中遇到的问题 ...

  6. IOS开发中实现UITableView按照首字母将集合进行检索分组

    在开发公司项目中遇到了将图书目录进行按照首字母分组排序的问题 1.在项目添加解析汉字拼音的Pinyin.h文件 /* * pinyin.c */ #define HANZI_START 19968 # ...

  7. 抢先看:笔者亲历的2020年中国.NET开发者大会活动纪实

    2020年中国.NET开发者大会活动纪实 1 2020年12月19日的苏州工业园区,天公作美,阳光明媚,气象迷人,正是一个搞事的好日子.在这里,数百名中国.NET开发者们汇聚一堂,怀揣着激情和梦想,一 ...

  8. JavaScript之经典面试题

    1.作用域经典面试题 var num = 123; // f1函数写好了,作用域就定下来了,也就是作用域链定下来了 // f1函数作用域链: f1函数作用域 ==> 全局作用域 function ...

  9. ID3很不错的讲解(matlab程序实现)

    1)决策树之ID3 决策树算法是分类算法的一种,基础是ID3算法,C4.5.C5.0都是对ID3的改进.ID3算法的基本思想是,选择信息增益最大的属性作为当前的分类属性. 看Tom M. Mitche ...

  10. 篇章一:SVN服务搭建【基于Windows server 2008R2 + Windows7】

    1.软件下载 1.1 软件介绍 Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站 ...