如果 Item Reader returns 什么都没有,如何跳过 Spring 批处理块中的 Item Writer?

How to skip Item Writer in Spring Batch chunk if Item Reader returns nothing?

所以我有一个 Spring 批处理项目有一个重复的步骤。

<batch:job id="fooJob">
    <batch:step id="barStep">
        <batch:tasklet>
            <batch:chunk reader="myReader" writer="myWriter"
                commit-interval="5">
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

reader 是一个 JdbcCursorItemReader,它还有一个 RowMapper 用于将从数据库检索的信息存储到 POJO 中。然后"myWriter"将POJO中设置的字段写入一个文本文件。这经常发生(由 cron 决定)。

当数据库为空且 reader 无法读取任何内容时,如何设置条件以完全跳过 itemWriter?

在面向块的 tasklet 中,一切都以项目块的形式处理,而不是所有项目。要在 reader 未读取任何内容时跳过,您必须知道实际上没有任何项目;遇到一个空的数据块是不够的,因为之前可能有另一个数据块。

解决此问题的一个简单方法是,如果未读取任何内容,则让步骤继续。那样的话,作者就没有什么可写的了。假设您正在使用 FlatFileItemWriter to write the file, you can configure it not to leave an empty file behind. This is done through the shouldDeleteIfEmpty 属性:

Flag to indicate that the target file should be deleted if no lines have been written (other than header and footer) on close. Defaults to false.

因此,您只需将 属性 设置为 true 来配置您的编写器。如果没有写入,它将删除空文件。