在Spring Batch 中Chunk 是什么

581 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

这篇文章我们来介绍一些Spring Batch 中的Chunk。

什么是Chunk

Chunk 的中文意思是:大块、厚块;大部分,大量。Chunk 在Spring Batch 中就是“批量操作”的概念的抽象。它本身是一个类,这个类就是用来将原本的单条操作改成批量进行。在Spring Batch 中,chunk 的直观感受如图所示: Screen Shot 2022-10-28 at 10.54.03.png

我们的一次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 中可以设置的跳过策略、失败策略。概念也十分清晰,读者在实际应用的时候应该把握好这几个特性,以便更方便地实现自己的业务需求。