Springboot之文件監控

背景:在實際環境部署構成中,因爲特殊網絡環境因素,有不少服務器之間的網絡都是單向的,不能互相訪問的,只有經過特定技術手段作到文件的單項擺渡,這就須要在兩臺服務器上分別寫序列化程序和反序列化程序,這裏不記錄序列化的內容,記錄反序列化程序中的文件監控內容。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;
    }
}
相關文章
相關標籤/搜索