使用WatchService类做文件监控总结
2017-11-27 17:48
246 查看
由于项目中要求做一个数据交互功能,大概就是为外系统将一些数据导入到本系统,数据中涉及到大量图片,以及文档,或其他资料,大小大概50-200M左右,因此决定使用ftp进行交互。首先,提供外系统ftp账号,上传文件到文件服务器。然后,本系统监控文件服务器相应文件夹。本人在项目中使用的是WatchService类。1、项目初始化后,开启一个线程做文件监控服务(此处建议是重新开启一个线程,避免影响项目其他功能)。package com.*.*.modules.*.listener;import javax.annotation.Resource;import org.apache.log4j.Logger;import org.springframework.context.ApplicationListener;import org.springframework.context.event.ContextRefreshedEvent;import org.springframework.stereotype.Component;import com.*.*.modules.*.service.FileWatcherService;@Component("ContextEventHandler")public class ContextEventHandler implements ApplicationListener<ContextRefreshedEvent > {private static final Logger logger = Logger.getLogger(ContextEventHandler.class);@Resourceprivate FileWatcherService fileWatcherService;@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {if(event.getApplicationContext().getParent() == null){//root application context 没有parent,他就是老大.//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。logger.info("-------------开启一个线程进行FTP文件监控服务-------------");new Thread(new Runnable() {@Overridepublic void run() {try {fileWatcherService.handleEvents();} catch (Exception e) {logger.error("-------------文件监控服务开启失败-------------", e);}}}).start();}}}
2、
package com.*.*.modules.*.service;
import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;import static java.nio.file.StandardWatchEventKinds.ENTRY_DELETE;import static java.nio.file.StandardWatchEventKinds.OVERFLOW;import java.io.File;import java.io.IOException;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.WatchEvent;import java.nio.file.WatchKey;import java.nio.file.WatchService;import java.util.ArrayList;import java.util.List;import javax.annotation.Resource;import org.apache.log4j.Logger;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;/** * **数据交互处理service * @author wuyp * @date 2017/11/25 */@Service("FileWatcherService")public class FileWatcherService {@Resource...@Resourceprivate ThreadPoolTaskExecutor executor;private final String uploadDir = Global.getConfig("uploadDir"); // 上传文件夹private final String backupDir = Global.getConfig("backupDir"); // 备份文件夹private final String unzipDir = Global.getConfig("unzipDir"); // 解压文件夹private WatchService watcher; private static final Logger logger = Logger.getLogger(FileWatcherService.class); public FileWatcherService()throws IOException{ Path myDir = Paths.get(uploadDir); logger.info("监控文件夹为"+uploadDir); watcher = myDir.getFileSystem().newWatchService(); myDir.register(watcher, ENTRY_CREATE,ENTRY_DELETE); //ENTRY_MODIFY } public void handleEvents() throws Exception{ while(true){ WatchKey key = watcher.take();for(WatchEvent<?> event : key.pollEvents()){ WatchEvent.Kind kind = event.kind(); if(kind == OVERFLOW){//事件可能lost or discarded continue; } WatchEvent<Path> e = (WatchEvent<Path>)event; /* Path fileName = e.context(); File file = fileName.toFile();*/ String filePath = uploadDir+e.context(); logger.info("文件变动类型:"+kind.name()+",文件及路径:"+filePath); if (kind == ENTRY_CREATE) { // 判断文件是否创建成功 boolean fileIsCreateSuccess = fileIsCreateSuccess(filePath); if (fileIsCreateSuccess) { File file = new File(filePath); FileHandlingTask fileHandlingTask = new FileHandlingTask(file); executor.execute(fileHandlingTask);// 此处对文件进行处理}} } if(!key.reset()){ break; } } }
}大致的代码,就如上所示了。下面说下在开发过程中遇到的几个问题1、在项目初始化时候启动监控服务 由于项目是单体架构,初始化时候需要去完成一些其他功能,开始时候没有另起一个线程,直接在 WebContextListener里里监控,结果项目跑不动了,因为监控里是while(true),导致后续的初始化执行不了,因此需要另外开启一个线程。2、ftp上传文件后,WatchService能立即监控到,但是此时文件不一定上传成功,立即对文件处理,造成很多错误 开始,一直以为是文件夹权限,文件权限,或者ftp账号权限,最后赋予777权限都不行,最后证明统统都不是。 原因是上传文件并没有完全成功就立即被监控到,立即对文件进行复制、解压处理。后来是在操作前睡眠10s,最终 还是偶尔有问题,因为大文件上传并不是10s就够,因此需要判断文件上传成功(http://blog.csdn.net/w20228396/article/details/78646336)
相关文章推荐
- 使用java.nio.file.WatchService监控文件夹里的文件再操作文件出现的“文件不存在或目录不存在”的错误
- JAVA 文件监控 WatchService
- java7 WatchServiceDemo 文件系统监控
- watchService 监控文件生产数量的思路
- [疯狂Java]NIO.2:WatchService、WatchKey(监控文件变化)
- NIO.2:WatchService、WatchKey(监控文件变化)
- NIO--WatchService、WatchKey(监控文件变化)
- Java7 WatchService 监控文件变化
- 【监听文件 多线程】使用java--WatchService监听文件 开启多线程copy文件
- WatchService——监控硬盘文件改动功能用法及其缺陷
- JAVA 文件监控 WatchService的示例方法
- 使用 inotify 监控文件系统的活动
- 使用Inotify 监控Linux 文件系统事件
- c++总结(1)-变量作用域及extern使用以及头文件预编
- 使用 inotify 监控 Linux 文件系统事件
- 使用 inotify 监控 Linux 文件系统事件
- linux网络监控工具---系统自带的工具的使用示例(可以监控经过本局域网的任何数据,并可以打印到屏幕或者日志文件)
- 【转载】ADS分散加载文件使用总结(lpc23xx)
- 使用 inotify 监控 Linux 文件系统事件
- 使用shell脚本进行服务器系统监控——文件系统监控(5)