SpringBatch从入门到放弃011- 文件分区处理
昨天鹏哥写了一个关于数据库分区处理的例子,有朋友反馈说项目不会用文件分区的方法,今天鹏哥就带大家一起看看Batch是如何实现文件分区处理的。
使用技术: 1. Spring Boot 2. Spring Batch
先来一波需求分析。我们这个例子实现一个简单的需求,就是将一个目录下边的文件读出来,在每一行前边加上读这行文件的线程名称,然后打印出来。所以我们第一先在resource下边新建三个文件:
?
文件里面写几行数据:
?
好了,准备工作已经做完了,下边开始干活吧。
Step 1: 新建一个Spring Boot的工程,引入Spring Batch 的依赖
如果一直关注鹏哥的话,这一步应该不在话下了,已经成为每天的必修课了。如果还不会请自觉面壁思过,然后重读文章SpringBatch从入门到放弃001- HelloWorld。
Step 2: 配置文件的分区规则
这里鹏哥采用一个文件一个分区的方式,使用Batch自带的MultiResourcePartitioner 来实现分区规则,这里有个小的知识点就是如何根据路径获取Resource[] 。keyName 是我们要往ExecuteContext 里面放置参数时的key,在下边Reader里面读取这个参数时需要。
?
Step 3: 配置Reader/Processor/Writer
因为是读文件,我们选用FlatFileItemReader 作为我们的Reader 实现。同时传入Context 中的文件路径作为Resource 。这里只是一个文件路径,Spring 会自动帮我们把文件的路径转化为一个Resource对象。
?
Processor 则是在每一行读出的数据前边加上鹏哥的网名。
?
Writer 是在每一行的前边加上当前线程的名称。
?
Step 4:为Step 添加Listener
参照前边数据库分区的例子SpringBatch从入门到放弃011- 一个典型的数据库分片处理的例子。
Step 5:定义执行业务逻辑的Step
定义方法和之前数据库分区的一样。?
Step 6: 定义执行Step的Handler
我们使用TaskExecutorPartitionHandler 作为我们的载体。
?
Step 7: 定义master Step
?
Step 8: 组装Job
?
Step 9:测试Job,并查看结果
我们在Listener 中打印出来每一个线程对应的Step Name和ExecuteContext 的值。分析日志我们看出,三个文件我们分了三片执行,每一片使用那个线程,执行那个文件也清晰的反应在了日志里面。
?
在来看Writer 里面打印出来的日志,也能看出多线程执行了程序,每个线程执行执行了什么内容,也能清晰的反应。
?
好了,今天的文件分区执行的例子已经分享完了,现实项目中可以直接按照这个例子配置即可,当然因为不同的需求不同,分区规则肯定也不同,这个需要每个项目自己客户化的。
为了排版美观,鹏哥采用了图片的形式在展示源码,有需要源码的鹏哥,可以联系鹏哥索取。