【发布时间】:2017-07-07 10:56:22
【问题描述】:
我正在使用 FlatFileItemReader 读取文件。我插入 DefaultLineMapper 和我自己的自定义 FieldSetMapper (myMapper)。
目前在 myMapper 中,当发生错误时,我只需将其记录下来。我想为文件中的所有行累积所有个错误,然后将它们保存到一个文件中。
我正在考虑实现我自己的 Tasklet。但是根据我的阅读,建议仅在您的步骤不进行面向块的处理时才这样做。
另一种选择是使用 ItemListenerSupport 或 ItemReadListener 并实现 onReadError() 方法。但如果我这样做,我不确定如何访问包含所有错误列表的全局/共享对象,对于 所有 行。
我一直在这两个选项之间来回切换,试图让它们发挥作用,但没有取得多大成功。非常感谢任何建议。
***** 编辑 *****
我不认为我的代码不是非标准的。我定义了错误日志 Job Param:
Map<String, JobParameter> jobParametersMap ...
jobParametersMap.put("errorsFile", new JobParameter(errorsFileURI));
我的 xml 配置如下所示:
<job ...>
<step ...>
<step id="import">
<tasklet>
<chunk reader="importReader" writer="importWriter" .../>
</tasklet>
</step>
</job>
<bean id="importReader" class="MyImportReader" scope="step">
<property name="resource" .../>
<property name="lineMapper">
<bean class = "...DefaultLineMapper">
...
<property name="fieldSetMapper" ref="importMapper"/>
</bean>
</property>
<property name="errorsFile" value="#jobParameters['errorsFile']}"/>
</bean>
<bean id="importWriter" ...scope="step">
...
<property name="errorsFile" value="#jobParameters['errorsFile']}"/>
</bean>
Reader 类扩展了 FlatFileItemReader 并实现了 ItemReadListener。 writer 实现 BatchLoadableWriter 和 StepExecutionListener。
如您所见,我将 errorsFile 传递给 Reader 和 Writer。 Writer 使用 errorsFile 有一段时间了,而我只是将它添加到 Reader。两个类都有一个用于 errorsFile 的 getter/setter。
它们之间的区别在于,在Writer中,@Overridden write()方法验证然后将所有项写入文件中。所以 all 错误会立即写入errorsFile。此外,如果有错误,则设置一个标志 (hasErrors),并在 @Overridden afterStep() 方法中检查该标志的值。如果为真,则返回 ExitStatus.FAILED。
而对于 Reader,doRead() 方法为每个 Item 调用一次。如果有错误,我可以将它写入errorsFile,并且我可以像Writer那样设置一个标志。但是该标志将为该行/项目设置 only。
假设我导入了 10 行。前 5 个有错误,后 5 个没有。当 afterRead() 被调用时,它将检查最后处理的 Item 的标志值,它没有错误,因此 hasErrors 将为 false。不好。或者也许重写 onReadError() 会更好。但是什么会导致该方法被调用,Mapper 中的一个错误?
有些东西告诉我实现我自己的 Reader,和/或让它实现 ItemReadListener 可能不是解决这个问题的方法。对我来说,似乎我需要将部分或全部这些逻辑放在 Reader 的“父级”中......这将是......一个 Tasklet?但是我在网上的 SO 和其他地方读到过,不建议实施你自己的 Tasklet 来执行块处理;它应该只用于简单的任务。
我很茫然……
【问题讨论】:
-
您能否在当前配置 Spring 批处理作业的位置发布一些代码。它使给出答案更容易。
标签: spring-batch