如果 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
来配置您的编写器。如果没有写入,它将删除空文件。
所以我有一个 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
来配置您的编写器。如果没有写入,它将删除空文件。