基于SpringBoot实现的文件监听器

最近有这么个需求,用户期望可以通过修改配置文件,并将数据文件丢到服务器上面,立即读取数据并绘制。由于这个数据我们不能直接拿来就用,需要转一遍格式,而且转换的速度又不是非常快,所以 和师兄们商量着想了个替代方案,异步化处理数据,不是用户点击之后才进行数据的转换,而是先转好,这个数据放内存也不靠谱,肯定要放数据库做持久化的,反正先整着试试。



1、引依赖

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.8.0</version>
        </dependency>

2、两大核心类(监听事件类和监控器类)

       监听事件类:

	@Slf4j
	@Component
	public class FileListener implements FileAlterationListener {
	    @Override
	    public void onStart(FileAlterationObserver fileAlterationObserver) {
	        File directory = fileAlterationObserver.getDirectory();
	        log.info("开始监听..." + directory);
	    }
	
	    @Override
	    public void onDirectoryCreate(File file) {
	        log.info("目录被创建了...");
	    }
	
	    @Override
	    public void onDirectoryChange(File file) {
	        log.info("目录被修改了...");
	    }
	
	    @Override
	    public void onDirectoryDelete(File file) {
	        log.info("目录被删除了...");
	    }
	
	    @Override
	    public void onFileCreate(File file) {
	        log.info("文件被创建了...");
	    }
	
	    @Override
	    public void onFileChange(File file) {
	        log.info("文件被修改了...");
	    }
	
	    @Override
	    public void onFileDelete(File file) {
	        log.info("文件被删除了...");
	    }
	
	    @Override
	    public void onStop(FileAlterationObserver fileAlterationObserver) {
	        File directory = fileAlterationObserver.getDirectory();
	        log.info("结束监听..." + directory);
	    }
	}

       监控器类:

	public class FileMonitor {
	    private FileListener fileListener;  //监听事件
	    private String path;    //监听的文件路径
	    private FileAlterationMonitor monitor;
	    private long defaultInterval = 10000L;  //默认监听的时间间隔
	
	    public FileMonitor() {
	    }
	
	    public FileMonitor(String path) {
	        this.path = path;
	        this.monitor = new FileAlterationMonitor(defaultInterval);
	    }
	
	    public FileMonitor(String path, long interval) {
	        this.path = path;
	        this.monitor = new FileAlterationMonitor(interval);
	    }
	
	    public void setFileListener(FileListener fileListener) {
	        this.fileListener = fileListener;
	    }
	
	    public void start() {
	        if (monitor == null) {
	            throw new IllegalStateException("Listener must not be null");
	        }
	        if (path == null) {
	            throw new IllegalStateException("Listen path must not be null");
	        }
	
	        FileAlterationObserver observer = new FileAlterationObserver(path);
	        observer.addListener(fileListener);
	        monitor.addObserver(observer);
	        try {
	            monitor.start();
	        } catch (Exception e) {
	            e.printStackTrace();
	        }
	    }
	}

3、监听Spring容器初始化

       启动类:

	@SpringBootApplication
	public class StartApplication {
	
	    public static void main(String[] args) {
	        SpringApplication.run(StartApplication.class, args);
	    }
	
	    @Bean
	    public FileMonitor fileMonitor() {
	        return new FileMonitor("./");
	    }
	}

       监听容器启动的类:

	@Slf4j
	@Component
	public class ContextFileListener implements ApplicationListener<ContextRefreshedEvent> {
	    @Autowired
	    private FileMonitor fileMonitor;
	    @Autowired
	    private FileListener fileListener;
	
	    @Override
	    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
	        if (contextRefreshedEvent.getApplicationContext().getParent() == null) {
	            fileMonitor.setFileListener(fileListener);
	            fileMonitor.start();
	        }
	    }
	}

4、底层

       可以看到,底层还是开一个线程在哪里不停地跑,只不过是线程会歇息interval的时间。

Alt


       这里有一点注意下,这个demo实现的path参数是目录名,也就是说,被观察的对象是该目录下的所有文件,当有文件发生变动的时候,就会触发监听事件

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于Spring Boot和Activiti,我们可以实现一个简单的流程审批系统。首先,需要搭建一个Spring Boot项目,并添加Activiti的相关依赖。然后,我们可以使用Activiti提供的API来定义流程、发起审批和处理审批。 在项目中,我们可以通过编写BPMN 2.0的定义文件来定义流程。在该文件中,我们可以添加活动(任务),并定义活动之间的流程流转条件。然后,使用Activiti的API部署该流程定义到Activiti引擎中。 在发起审批时,可以通过调用Activiti的API来启动一个流程实例。在启动流程实例时,可以设置相关的参数,如申请人、审批金额等。Activiti会根据流程定义自动创建相应的流程实例和任务。 在处理审批时,可以根据当前用户查询待办任务列表,并选择某个任务进行处理。处理任务可以包括审批通过、驳回、转交等操作。在处理任务时,可以通过Activiti的API设置相关的参数,并将任务流转到下一步或退回上一步。 此外,我们还可以添加监听器监听流程的各个状态,如流程启动、任务分配、任务完成等。通过监听器,我们可以在流程流转时执行一些自定义的逻辑,如发送邮件通知、记录审批历史等。 综上所述,基于Spring Boot和Activiti,我们可以实现一个简单的流程审批系统。通过配置流程定义、发起审批和处理审批,我们可以实现审批流程的自动化和可视化。同时,通过添加监听器和自定义逻辑,我们可以满足不同业务场景下的特定需求。 ### 回答2: 利用Spring Boot和Activiti可以很方便地实现流程审批功能。下面我将详细介绍如何使用Spring Boot和Activiti来实现流程审批。 首先,需要在Spring Boot项目的pom.xml文件中添加Activiti的依赖。可以在Maven仓库中找到最新的Activiti版本,并将其添加到pom.xml文件中。 接下来,需要创建Activiti的配置类,以便在Spring Boot中集成Activiti。这个配置类应该继承自Activiti的ProcessEngineConfigurationConfigurer接口,并实现其configure方法。在configure方法中,我们可以进行一些Activiti的配置,比如设置数据库相关的配置、添加流程监听器等。 然后,需要创建流程定义文件。可以使用Activiti提供的图形化工具来创建流程定义文件,也可以通过编码的方式来创建。在流程定义文件中,需要定义流程的各个节点,以及节点之间的连线和流程变量。 接下来,需要编写与流程审批相关的业务逻辑代码。这些代码应该包括启动流程实例、查询待办任务、完成任务等功能。可以使用Activiti提供的API来完成这些操作。 最后,需要创建前端页面用于展示和处理审批任务。可以使用Thymeleaf等模板引擎来创建页面,并通过Ajax请求与后端进行数据交互。 综上所述,借助于Spring Boot和Activiti,我们可以快速便捷地实现流程审批功能。这种方式不仅可以提高开发效率,还有利于代码的维护和扩展。希望以上内容对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值