持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
这篇文章我们来介绍一些Spring Batch 中的Chunk。
什么是Chunk
Chunk 的中文意思是:大块、厚块;大部分,大量。Chunk 在Spring Batch 中就是“批量操作”的概念的抽象。它本身是一个类,这个类就是用来将原本的单条操作改成批量进行。在Spring Batch 中,chunk 的直观感受如图所示:
我们的一次batch 操作的任务中,可能会涉及到很多次读写操作。如果我们选择一条条地处理,然后立刻向数据库提交,这样效率不会很高,同时会浪费资源。
于是在Spring Batch 中就提出了chunk 的概念。首先我们设定一个chunk 的size,随后Spring Batch 一条条地区处理数据,但是到ItemWriter 阶段,Spirng Batch 不会选择立刻将数据提交到数据库,只有在处理的数据累积数量达到了之前设置的chunk 的size 之后,才会进行提交操作。
Skip 处理 & 失败处理
在我们做任何业务开发的时候,即使是虽简单的向控制台打印数据,也有可能失败,更何况是一个job 中的step 有可能会处理大量的数据。于是我们就应该思考,如何应对这种失败的情况。Spring Batch 对失败的情况也做了良好的支持。
我们来看一下如下代码:
private Step buildCalculateStep(@NonNull String promotionName) {
stepBuilderFactory.get("abc")
.chunk(10)
.reader(xxxItemReader())
.writer(xxxItemWriter())
.faultTolerant()
.skipLimit(5)
.skip(Exception.class)
.noSkip(BadRequestException.class)
.build();
在这段代码中,我们首先获取了name 为"abc" 的step 实例,然后设置其chunk size 为10。这里我们需要着重注意三个方法:skipLimit() / skip() / noSkip()
skipLimit()
这个方法的作用是设置一个值,这个值是允许我们跳过的step 中发生的异常的数量。即如果这个step 中发生的异常数量小于等于这个数字,那么系统就会继续向下执行这个step。但是如果发生的异常数量超过了这个值,那么这个step 就会被置为fail 状态。(如果不设置这个值,那么系统默认值为0)
skip()
skip 方法的作用是设置某种异常类型,当系统中出现这种类型的异常的时候,那么系统会自动忽略,不会对系统造成任何影响。
noSkip()
noSkip 方法的作用就是在系统中出现了这种类型的异常之后,系统不会选择绕过这种异常,而是要“正视”这种异常。对于noSkip 中的异常类型,是会跳过skip 方法中的限制的。从上面的代码来看,就是在这个Step 中跳过所有除了BadRequestException 的Exception。也就是说,如果在这个Step 的执行过程中遇到BadRequestException,那么这个Step 会被直接标记为fail。
总结
这篇文章主要介绍了Spring 中的Chunk 的概念以及Step 中可以设置的跳过策略、失败策略。概念也十分清晰,读者在实际应用的时候应该把握好这几个特性,以便更方便地实现自己的业务需求。