Spring Batch使用Processor过滤掉记录

时间:2016-08-09 15:44:33

标签: java spring spring-batch

我正在开发一个Spring Batch作业,它创建一个基于sql insert,delete或update语句的字符串。它读取一个flatfile,其中每行的前三个字符是addchgdel

示例:

ADD123456001SOUTHLAND PAPER INCORPORATED  ... //more info
CHG123456002GUERNSEY BIG DEAL FAIRFAX     ...//more info
DEL123456002GUERNSEY BIG DEAL FAIRFAX     ...//more info

根据以上陈述,我的ItemReader将生成三个字符串:insert into ...update ...delete ...。读者读入整个flatfile,将这些字符串的arraylist返回给我的编写器,我的编写器将读取这些字符串并写入我的数据库。

这是我的问题。如果在请求chg之前请求了add,会发生什么?如果我尝试更改已删除的内容该怎么办?

我在SpringDocs上阅读了ItemProcessor,过滤过程的描述正是我想要做的:

  

例如,考虑一个读取包含三个文件的批处理作业   不同类型的记录:要插入的记录,要更新的记录,以及   要删除的记录。如果系统不支持记录删除,   那么我们不希望向ItemWriter发送任何“删除”记录。   但是,由于这些记录实际上不是坏记录,我们希望   过滤掉它们,而不是跳过。结果,ItemWriter   只会收到“插入”和“更新”记录。

但是文档中列出的ItemProcessor示例对我来说并不合理。有人能够理解我的过程吗?或者向我展示一些好的ItemProcessing的例子?

编辑:命令后面的6个字符是SQL数据库中的id。

1 个答案:

答案 0 :(得分:1)

在问题中描述的情况下,您不会过滤掉记录,您只想更改它们所经历的顺序。您最好先在此处对文件进行排序(至首先进行插入,然后进行更新,然后进行删除)。 ItemProcessor更多地用于过滤偶尔的坏或不相关的输入行。

您可以使用ItemProcessor验证更新或删除的行是否存在,或者要添加的行是否已经存在。在这里,我想知道你在ItemProcessor中查询的数量(输入文件中每行一个查询)是否会对偶尔可能发生的条件产生大量开销。您的选择将介于

之间
  • 使用ItemProcessor进行过滤(对每行进行预先查询)或
  • 没有进行任何前期查询,但如果违反了RI,则让ItemWriter跳过这些行(回滚块并一次重试一行),请参阅Spring Batch skip exception for ItemWriter