Spring Boot笔记一:使用commons-io实现文件监控

项目中有需要监听文件、文件夹的需求,以便在文件、文件夹发生变化时出发相应的业务流程。这里使用Spring Boot + maven+ Apache Commons IO方案。
另外,Apache Commons IO涉及到多线程的应用,项目中应指定线程池的相关配置,参考Spring Boot 线程池配置。

1、添加依赖

在pom.xml


	commons-io
	commons-io
	2.6

2、设置监听器

package com.vav360.analysis.listener;

import com.vav360.analysis.service.ListenerService;
import org.apache.commons.io.monitor.FileAlterationListenerAdaptor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.apache.log4j.Logger;

import java.io.File;

/**
 * Created by wxl on 2018/12/13.
 *
 * 文件变化监听器
 * 在Apache的Commons-IO中有关于文件的监控功能的代码. 文件监控的原理如下:
 * 由文件监控类FileAlterationMonitor中的线程不停的扫描文件观察器FileAlterationObserver,
 * 如果有文件的变化,则根据相关的文件比较器,判断文件时新增,还是删除,还是更改。(默认为1000毫秒执行一次扫描)
 */
public class FileListener extends FileAlterationListenerAdaptor {
    private Logger log = Logger.getLogger(FileListener.class);

    // 声明业务服务
    private ListenerService listenerService;

    // 采用构造函数注入服务
    public FileListener(ListenerService listenerService) {
        this.listenerService = listenerService;
    }

    // 文件创建执行
    @Override
    public void onFileCreate(File file) {
        log.info("[新建]:" + file.getAbsolutePath());
        listenerService.doMain(file);
    }

    // 文件创建修改
    @Override
    public void onFileChange(File file) {
        log.info("[修改]:" + file.getAbsolutePath());
        // 触发业务
//        listenerService.doSomething();
    }

    // 文件创建删除
    @Override
    public void onFileDelete(File file) {
        log.info("[删除]:" + file.getAbsolutePath());
    }

    // 目录创建
    @Override
    public void onDirectoryCreate(File directory) {
        log.info("[目录创建]:" + directory.getAbsolutePath());
    }

    // 目录修改
    @Override
    public void onDirectoryChange(File directory) {
        log.info("[目录修改]:" + directory.getAbsolutePath());
    }

    // 目录删除
    @Override
    public void onDirectoryDelete(File directory) {
        log.info("[目录删除]:" + directory.getAbsolutePath());
    }


    // 轮询开始
    @Override
    public void onStart(FileAlterationObserver observer) {
    }

    // 轮询结束
    @Override
    public void onStop(FileAlterationObserver observer) {
    }

}

3、监听器工厂

package com.vav360.analysis.listener;

import com.vav360.analysis.service.ListenerService;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.HiddenFileFilter;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.apache.commons.io.monitor.FileAlterationObserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;
import java.util.concurrent.TimeUnit;

/**
 * Created by wxl on 2018/12/13.
 */

@Component
public class FileListenerFactory {
    // 设置监听路径
    private final String monitorDir = "E:\\Temp\\caiji";
    // 设置轮询间隔
    private final long interval = TimeUnit.SECONDS.toMillis(1);

    // 自动注入业务服务
    @Autowired
    private ListenerService listenerService;

    public FileAlterationMonitor getMonitor() {
        // 创建过滤器
        System.out.println("===in FileAlterationMonitor=== ");
        IOFileFilter directories = FileFilterUtils.and(
                FileFilterUtils.directoryFileFilter(),
                HiddenFileFilter.VISIBLE);
        IOFileFilter files = FileFilterUtils.and(
                FileFilterUtils.fileFileFilter(),
                FileFilterUtils.suffixFileFilter(".evt"));
        IOFileFilter filter = FileFilterUtils.or(directories, files);

        // 装配过滤器
//         FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir));
        FileAlterationObserver observer = new FileAlterationObserver(new File(monitorDir), filter);
        System.out.println("observer= "+observer);
        // 向监听者添加监听器,并注入业务服务
        observer.addListener(new FileListener(listenerService));
 //        observer.addListener(new FileListener());

        // 返回监听者
        return new FileAlterationMonitor(interval, observer);
    }
}

4、调用

package com.vav360.analysis.listener;

import org.apache.commons.io.monitor.FileAlterationMonitor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * Created by wxl on 2018/12/13.
 */
@Component
public class FileListenerRunner implements CommandLineRunner {

    @Autowired
    private FileListenerFactory fileListenerFactory;

    @Override
    public void run(String... strings) throws Exception {
        // 创建监听者

        System.out.println("fileListenerFactory= "+fileListenerFactory);
        FileAlterationMonitor fileAlterationMonitor = fileListenerFactory.getMonitor();
        try {
            // do not stop this thread
            fileAlterationMonitor.start();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

 

你可能感兴趣的:(spring,spring,spring,boot,监听文件夹)