java - Spring Batch 使用处理器过滤记录

标签 java spring spring-batch

我正在开发一个 Spring Batch 作业,该作业创建一个基于 sql 插入、删除或更新语句的字符串。它读取一个平面文件,其中每行的前三个字符是 addchgdel

示例:

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

根据上述语句,我的 ItemReader 将生成三个字符串:insert into ...update ...delete ... 。读取器读取整个平面文件,将这些字符串的数组列表返回给我的写入器,然后我的写入器将获取这些字符串并写入我的数据库。

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

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

For example, consider a batch job that reads a file containing three different types of records: records to insert, records to update, and records to delete. If record deletion is not supported by the system, then we would not want to send any "delete" records to the ItemWriter. But, since these records are not actually bad records, we would want to filter them out, rather than skip. As a result, the ItemWriter would receive only "insert" and "update" records.

但是文档中列出的 ItemProcessor 示例对我来说并没有什么意义。有人可以让我理解这个过程吗?或者给我展示一些好的 ItemProcessing 示例?

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

最佳答案

在问题中描述的情况下,您不会过滤掉记录,您只想更改它们进入的顺序。您最好在前面的步骤中对文件进行排序(首先进行插入,然后是更新,然后是删除)。 ItemProcessor 更多的是用于过滤掉偶尔出现的错误或不相关的输入行。

您可以使用 ItemProcessor 来验证更新或删除的行是否存在,或者要添加的行尚不存在。在这里,我想知道您必须在 ItemProcessor 中执行的查询量(输入文件中的每行一个查询)对于仅偶尔发生的情况是否不会产生大量开销。您的选择是:

  • 使用 ItemProcessor 进行过滤(预先对每一行进行查询),或
  • 不执行任何预先查询,但如果违反 RI,则让 ItemWriter 跳过这些行(回滚 block 并一次重试一行),请参阅 Spring Batch skip exception for ItemWriter .

关于java - Spring Batch 使用处理器过滤记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855171/

相关文章:

java - Eclipse 更新失败

java - Apache Tomcat/6.0.24 上的部署错误

database - 如何使用 MyBatis Spring Integration 连接多个数据库?

java - Spring Security 自定义登录表单操作与 default-target-url

java - 无法设置MarkLogic Spring Batch基本应用

java - 关于Java的LinkedList类的问题

java - 如何在 Java 中创建自定义列表模型

java - 启用 CORS Apache Tomcat 7.0.52

java - 测量 Spring 批步骤执行时间

java - Spring Batch 并行 Seam 上下文,没有 Activity 的应用程序上下文