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

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. 2020-2021 “Orz Panda” Cup Programming Contest

    2020-2021 "Orz Panda" Cup Programming Contest 比赛情况 我们一共过了道3题 本场贡献:et3_tsy :过了A,提供了H的关键修改 ​ ...

  2. Winform 去掉 最大化 最小化 关闭按钮(不是关闭按钮变灰)终极解决办法

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  3. matplotlib学习日记(十一)---坐标轴高阶应用

    (一)设置坐标轴的位置和展示形式 (1)向画布中任意位置添加任意数量的坐标轴 ''' 通过在画布的任意位置和区域,讲解设置坐标轴的位置和坐标轴的展示形式的实现方法, 与subplot,subplots ...

  4. x264编码demo定制修改介绍

    x264编码器,提供了两个demo来验证编码功能:一个是大而全的x264.c,另外一个是简洁版的example.c. 其中,前者demo,可以配置很多编码参数,但太冗长繁杂,对初学者不太友好.  后者 ...

  5. 安装简易OpenShift单节点并配置DNS泛域名

    1 楔子 公司有个项目部署在 OpenShift 容器云平台上,出现问题较多,于是萌生在公司环境搭建现场仿真环境,由于资源没有生产环境多,就使用单节点简单模拟下 本文主要内容包括以下: 使用 Dnsm ...

  6. Eclipse中,No compiler is provided in this environment. Perhaps you are running on a JRE rather than a

    问题说明 Eclipse导入Maven项目后,执行 mvn clean install后,出现如下错误: [INFO] ---------------------------------------- ...

  7. java 反射随记

    记录一下有关 Class 对象的相关方法: 1.获取 Class 对象的三个方法: ⑴ 使用 Class.forName("全限定类名") ,参数是该类的全限定类名,可拓展性强: ...

  8. GraduateDesign-初试APP编写(去除虚拟按键和禁止状态栏下拉)

    为了毕设的要求,需要在Android系统上运行一个app来控制硬件,今天开始这个app的编写. 首先,我们的系统将只运行这个app,也就是我们不需要状态栏,虚拟按键等. 故这里将app设置为全屏模式. ...

  9. CSDN中的MARKDOWN编辑器如何快速复制粘贴图片?

    前言 我们在使用csdn的markdown编辑器复制其它网站图片,按住ctrl+C复制选择图片,然后按ctrl+V粘贴图片到md编辑器无任何反应!markdown编辑器每次都没法复制粘贴截图! 下面小 ...

  10. 使用IDEA构建Spring Boot项目简单实例

    一.介绍 它的目标是简化Spring应用和服务的创建.开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署. Spring Boot ...