正文
然后使用注解开启Batch模块:
...
@EnableBatchProcessing
public class Application { ... }
之后就可以注入JobBuilderFactory和StepBuilderFactory:
@Autowired
private JobBuilderFactory jobs;
@Autowired
private StepBuilderFactory steps;
有了这2个factory之后,就可以build job。
SpringBatch中的相关基础概念比如ItemReader、ItemWriter、Chunk等本文就不介绍了。
我们以FlatFileItemReader作为reader,一个自定义Writer用于打印reader中读取出来的数据。
这个定义的writer遇到good job这条数据的时候会报错,具体逻辑如下:
@Override
public void write(List extends String> items) throws Exception {
System.out.println("handle start =====" + items);
for(String a : items) {
if(a.equals("good job")) {
throw new Exception("custom exception");
}
}
System.out.println("handle end.. -----" + items);
}
其中reader中读取的文件中的数据如下:
hello world
hello coder
good job
cool
66666
我们使用StepBuilderFactory构造Step,chunkSize设置为2。然后在job1中使用并执行:
stepBuilderFactory.get("test-step").chunk(2).reader(reader).writer(writer).build();
执行job1后console打印如下:
handle start =====[hello world, hello coder]
handle end.. -----[hello world, hello coder]
handle start =====[good job, cool]
job1遇到了good job这条数据,writer抛出了异常,由于没有使用skip或者retry机制,导致整个流程停止。job1的处理流程底层在SimpleChunkProcessor这个类中完成,包括processor、writer的使用。
接下里我们构造一个job2,job2使用skip机制(其中skipLimit必须要和skip(Class extends Throwable> type)一起使用),skip机制可以防止writer发生异常后不停止整个job,但是需要同时满足skip的限制次数和skip对应的Exception是发生异常的父类或自身关系条件才不会停止整个job,这里我们使用Exception作为异常和Integer.MAX_VALUE作为skip的限制次数为例: