背景:在實際環境部署構成中,因爲特殊網絡環境因素,有不少服務器之間的網絡都是單向的,不能互相訪問的,只有經過特定技術手段作到文件的單項擺渡,這就須要在兩臺服務器上分別寫序列化程序和反序列化程序,這裏不記錄序列化的內容,記錄反序列化程序中的文件監控內容。java
一、文件監控方式一:java的文件監控有兩種方式,方法一:java7提供的 WatchService,可是這個方法有一些問題存在如下問題:服務器
a.當文件修改的時候,會收到兩次通知,這個問題須要經過本身寫代碼去解決網絡
b.不能監控子目錄下的文件變化ide
c.沒法對監控文件進行過濾,只監控本身感興趣的文件spa
二、文件監控方式二:commons-io(原理採用監控者模式和定時刷新監控文件夾),項目中實際使用的方式。操作系統
代碼以下:debug
/** * 目錄監聽器 * * @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; }
目錄監聽服務code
@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); } }
文件過濾器server
public class BchtFileFilter implements FileFilter { @Override public boolean accept(File pathname) { if(pathname.getPath().endsWith(".data") || pathname.getPath().endsWith(".DATA")){ return true; } return false; } }