此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Batch 文档 5.1.2spring-doc.cn

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Batch 文档 5.1.2spring-doc.cn

与 一样,在执行 a 过程中有许多事件,其中 a 用户可能需要执行某些功能。例如,要写出到平面 需要页脚的文件,则需要在有 已完成,以便可以写入页脚。这可以通过许多 scoped 侦听器之一来实现。JobStepItemWriterStepStepspring-doc.cn

您可以应用实现 (但不是该接口) 的扩展之一的任何类 本身,因为它是空的)执行到遍历元素的单步执行。 该元素在 step、tasklet 或 chunk 声明中有效。我们 建议您在其函数适用的级别声明侦听器 或者,如果它是多功能的(例如 和 ), 在应用它的最精细级别声明它。StepListenerlistenerslistenersStepExecutionListenerItemReadListenerspring-doc.cn

以下示例显示了在 Java 中应用于块级别的侦听器:spring-doc.cn

Java 配置
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
	return new StepBuilder("step1", jobRepository)
				.<String, String>chunk(10, transactionManager)
				.reader(reader())
				.writer(writer())
				.listener(chunkListener())
				.build();
}

以下示例显示了在 XML 中的块级别应用的侦听器:spring-doc.cn

XML 配置
<step id="step1">
    <tasklet>
        <chunk reader="reader" writer="writer" commit-interval="10"/>
        <listeners>
            <listener ref="chunkListener"/>
        </listeners>
    </tasklet>
</step>

如果 , 或 本身实现其中一个接口,则使用 namespace 元素或其中一个工厂。仅此 适用于直接注入 .如果侦听器嵌套在 另一个组件,您需要显式注册它(如前面使用 Step 注册 ItemStream 中所述)。ItemReaderItemWriterItemProcessorStepListenerStep<step>*StepFactoryBeanStepspring-doc.cn

除了接口之外,还提供了注释来寻址 同样的担忧。普通的旧 Java 对象可以具有带有这些注释的方法,这些注释是 然后转换为相应的类型。注释 块组件的自定义实现,例如 OR 或 。注释由 XML 解析器分析元素 以及使用 builder 中的方法注册,因此您需要做的所有事情 是使用 XML 命名空间或生成器将侦听器注册到步骤。StepListenerStepListenerItemReaderItemWriterTasklet<listener/>listenerspring-doc.cn

StepExecutionListener

StepExecutionListener表示执行的最通用侦听器。它 允许在 a 开始之前和结束之后通知 a 是否结束 normally 或 failed,如下例所示:StepStepspring-doc.cn

public interface StepExecutionListener extends StepListener {

    void beforeStep(StepExecution stepExecution);

    ExitStatus afterStep(StepExecution stepExecution);

}

ExitStatus的返回类型为 ,以便侦听器有机会 修改在完成 .afterStepStepspring-doc.cn

与此接口对应的注解是:spring-doc.cn

ChunkListener

“块”定义为在事务范围内处理的项目。提交 transaction 在每个提交间隔提交一个 chunk。您可以使用 to 在 chunk 开始处理之前或 chunk 完成后执行逻辑 成功,如下面的接口定义所示:ChunkListenerspring-doc.cn

public interface ChunkListener extends StepListener {

    void beforeChunk(ChunkContext context);
    void afterChunk(ChunkContext context);
    void afterChunkError(ChunkContext context);

}

beforeChunk 方法在事务启动之后但在读取开始之前调用 在 .相反,在 chunk 被 已提交(如果有回滚,则根本不提交)。ItemReaderafterChunkspring-doc.cn

与此接口对应的注解是:spring-doc.cn

当没有 chunk 声明时,您可以应用 a。的 负责调用 ,因此它适用于非面向项的 tasklet 以及(它在 tasklet 之前和之后调用)。ChunkListenerTaskletStepChunkListenerspring-doc.cn

A 不是为了引发检查异常而设计的。错误必须在 implementation 否则该步骤将终止。ChunkListenerspring-doc.cn

ItemReadListener

在之前讨论跳过逻辑时,提到对 跳过的记录,以便以后可以处理它们。在读取错误的情况下, 这可以通过 来完成,如下面的接口 定义显示:ItemReaderListenerspring-doc.cn

public interface ItemReadListener<T> extends StepListener {

    void beforeRead();
    void afterRead(T item);
    void onReadError(Exception ex);

}

在每次调用之前调用该方法以读取 .该方法在每次成功调用 read 后调用,并将项目传递给 那被读了。如果在读取时出错,则调用该方法。 提供遇到的异常,以便可以记录它。beforeReadItemReaderafterReadonReadErrorspring-doc.cn

与此接口对应的注解是:spring-doc.cn

ItemProcessListener

与 一样,项目的处理可以被 “监听” ,因为 以下接口定义显示:ItemReadListenerspring-doc.cn

public interface ItemProcessListener<T, S> extends StepListener {

    void beforeProcess(T item);
    void afterProcess(T item, S result);
    void onProcessError(T item, Exception e);

}

该方法在 和 之前被调用 已递出要处理的项目。该方法在 商品已成功处理。如果在处理时出错,则调用该方法。遇到的异常以及 尝试处理,以便可以记录它们。beforeProcessprocessItemProcessorafterProcessonProcessErrorspring-doc.cn

与此接口对应的注解是:spring-doc.cn

ItemWriteListener

您可以使用 , 作为 接口定义如下:ItemWriteListenerspring-doc.cn

public interface ItemWriteListener<S> extends StepListener {

    void beforeWrite(List<? extends S> items);
    void afterWrite(List<? extends S> items);
    void onWriteError(Exception exception, List<? extends S> items);

}

该方法在 之前被调用,并被传递给 写入的项目列表。该方法在项目完成后调用 已成功写入,但在提交与 chunk 的处理关联的事务之前。 如果在写入时出现错误,则调用该方法。 遇到的异常和尝试写入的项为 提供,以便可以记录它们。beforeWritewriteItemWriterafterWriteonWriteErrorspring-doc.cn

与此接口对应的注解是:spring-doc.cn

SkipListener

ItemReadListener、 和 都提供机制 收到错误通知,但没有通知你记录实际上已被 跳。,即使重试某个项,也会调用 成功的。因此,有一个单独的接口用于跟踪跳过的项目,如 以下接口定义显示:ItemProcessListenerItemWriteListeneronWriteErrorspring-doc.cn

public interface SkipListener<T,S> extends StepListener {

    void onSkipInRead(Throwable t);
    void onSkipInProcess(T item, Throwable t);
    void onSkipInWrite(S item, Throwable t);

}

onSkipInRead每当读取时跳过项时调用。需要注意的是 回滚可能会导致同一项目多次注册为 skipped。 在写入时跳过项时调用。因为该项目具有 已成功读取(且未跳过),它还将项目本身作为 论点。onSkipInWritespring-doc.cn

与此接口对应的注解是:spring-doc.cn

SkipListeners 和事务

a 最常见的用例之一是注销跳过的项目,因此 另一个批处理过程甚至人工过程可用于评估和修复 导致 SKIP 的问题。因为在很多情况下,原始交易 可以回滚,Spring Batch 做出两个保证:SkipListenerspring-doc.cn

  • 适当的 skip 方法(取决于错误发生的时间)只调用一次 每件。spring-doc.cn

  • 总是在提交事务之前调用 the。这是 要确保侦听器调用的任何事务资源不会被 失败 。SkipListenerItemWriterspring-doc.cn