跳过记录处理
使用跳过记录处理来跳过事务批处理作业中的读写记录错误。在 xJCL 中指定跳过记录策略。
跳过记录处理
每个批处理数据流都具有其自己的跳过记录策略配置。您可以通过在 xJCL 中为 com.ibm.batch.bds.skip.count 批处理数据流属性指定非零值,启用跳过记录处理。
可以通过以下方式来优化跳过记录处理:使用 com.ibm.batch.bds.skip.include.exception.class.<n> 属性指定要跳过的记录错误,并使用 com.ibm.batch.bds.skip.exclude.exception.class.<n> 属性指定不可跳过的记录错误。这两个属性是互斥的。
批处理框架在本地作业状态数据库中基于每个步骤跟踪跳过记录处理。从批处理框架仅针对批处理数据流执行此跟踪。 步骤处理结束时,会将消息写入作业日志。 此消息指示每个批处理数据流跳过的记录数以及每个批处理数据流每秒的记录数。每秒的记录数可能与批处理数据流处理的记录数不匹配。如果处理实际数目的记录所花时间少于 1 秒,那么每秒记录数的值推断自处理实际数目的记录所花的时间量。
以下列表包含每个跳过记录属性,且后跟描述。
- com.ibm.batch.bds.skip.count
指定由于读取或写入记录发生错误,批处理数据流可跳过的记录数。到达限制后,批处理数据流不会再跳过任何更多读取或写入错误。
跳过输入记录时,批处理数据流会移动到下一条记录,并对其进行访存。控件不会返回到调用者,直到成功读取记录,不会发生涉及跳过记录的错误或到达跳过限制。
跳过输出记录时,批处理数据流会正常返回到调用者。
如果在到达跳过限制后批处理数据流遇到读取或写入错误,那么会向调用者返回读取或写入异常。不会跳过记录。
如果向批处理数据流注册了跳过侦听器,那么跳过侦听器会收到每个已跳过记录的控件。针对已跳过的读取,会调用 SkipListener.onSkippedRead(Throwable t) 方法。在访存下一条记录之前,跳过侦听器会收到控件。针对已跳过的写入,会调用 SkipListener.onSkippedWrite(Object record, Throwable t) 方法。在第一个自变量中传递已跳过的记录。在批处理数据流返回到调用者之前,跳过侦听器会收到控件。
批处理数据流的运行的跳过计数会在每个检查点处保留。作业步骤再次开始时,会从上一个已落实的检查点恢复跳过计数。
缺省情况下,跳过记录处理已禁用。
任何扩展 com.ibm.websphere.batch.devframework.datastreams.bdsadapter.AbstractBatchDataInputStreamRecordMetrics 类或 com.ibm.websphere.batch.devframework.datastreams.bdsadapter.AbstractBatchDataOutputStreamRecordMetrics 类的批处理流实现会自动继承跳过记录支持。在 com.ibm.websphere.batch.devframework.datastreams 软件包下定义的所有批处理数据流都包含跳过记录支持。
- com.ibm.batch.bds.skip.include.exception.class.<n>
指定读取或写入记录时要跳过的批处理数据流的异常列表。批处理数据流仅跳过列表上的异常。
<n> 变量为整数。变量以 1 开始,且针对每个异常,此变量递增 1。
如果未指定任何异常,那么缺省情况下,所有异常均包含在要跳过的读/写错误列表中。
以下示例使用该属性:
<batch-data-streams> <bds> <logical-name>inputBDS</logical-name> <props> <prop name="PATTERN_IMPL_CLASS" value="com.ibm.ws.batch.sample.bds.WCGSampleBDS"/> <prop name="file.encoding" value="8859_1"/> <prop name="FILENAME" value="/tmp/input.txt" /> <prop name="com.ibm.batch.bds.skip.count" value="5" /> <prop name="com.ibm.batch.bds.skip.include.exception.class.1" value="java.io.IOException" /> <prop name="com.ibm.batch.bds.skip.include.exception.class.2" value="com.xyz.bds.error.BadDataException" /> </props> <impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.TextFileReader</impl-class> </bds> </batch-data-streams>
批处理数据流跳过输入/输出异常的记录以及错误数据异常的记录。
- com.ibm.batch.bds.skip.exclude.exception.class.<n>
指定读取或写入记录时无法跳过的异常列表。
<n> 变量为整数。变量以 1 开始,且针对每个异常,此变量递增 1。
如果未指定任何异常,那么缺省情况下,不会从要跳过的读/写记录错误列表中排除任何记录。
以下示例使用该属性:
<batch-data-streams> <bds> <logical-name>inputBDS</logical-name> <props> <prop name="PATTERN_IMPL_CLASS" value="com.ibm.ws.batch.sample.bds.WCGSampleBDS"/> <prop name="file.encoding" value="8859_1"/> <prop name="FILENAME" value="/tmp/input.txt" /> <prop name="com.ibm.batch.bds.skip.count" value="3" /> <prop name="com.ibm.batch.bds.skip.exclude.exception.class.1" value="java.io.FileNotFoundException" /> </props> <impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.TextFileReader</impl-class> </bds> </batch-data-streams>
批处理数据流不会跳过未发现异常的文件的记录。
跳过侦听器
可以向批处理数据流注册跳过侦听器以侦听已跳过的记录。不管何时跳过记录,跳过侦听器都会收到控件。
AbstractBatchDataInputStream _inputBDS =
(AbstractBatchDataInputStream)BatchDataStreamMgr.getBatchDataStream("inputBDS", getJobStepID());
((AbstractBatchDataStreamRecordMetrics)_inputBDS).addSkipListener(new MySkipListener());