拦截Step执行

就像Job,在执行Step其中 用户可能需要执行某些功能。例如,写出到一个公寓 需要页脚的文件,则ItemWriterStep有 已完成,以便可以写入页脚。这可以通过众多Step作用域侦听器。spring-doc.cadn.net.cn

您可以应用任何实现StepListener(但不是那个界面 本身,因为它是空的)到通过listeners元素。 这listeners元素在步骤、任务或块声明中有效。我们 建议您在应用其函数的级别声明侦听器 或者,如果它是多功能(例如StepExecutionListenerItemReadListener), 在应用的最精细级别声明它。spring-doc.cadn.net.cn

以下示例显示了在 Java 中应用在块级别的侦听器:spring-doc.cadn.net.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.cadn.net.cn

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

ItemReader,ItemWriterItemProcessor它本身实现了StepListener接口会自动注册到Step如果使用 Namespace<step>元素或*StepFactoryBean工厂。这只是 适用于直接注入Step.如果监听器嵌套在 另一个组件,您需要显式注册它(如前面在注册ItemStream使用Step).spring-doc.cadn.net.cn

除了StepListener接口,提供注释来解决 同样的担忧。普通的旧 Java 对象可以具有具有这些注释的方法,这些注释是 然后转换为相应的StepListener类型。注释也很常见 块组件的自定义实现,例如ItemReaderItemWriterTasklet.XML 解析器分析注释<listener/>元素 以及在listener方法,所以你需要做的就是 是使用 XML 命名空间或构建器向步骤注册侦听器。spring-doc.cadn.net.cn

StepExecutionListener

StepExecutionListener表示最通用的监听器Step执行。它 允许在Step开始了,结束后,是否结束了 normal或failed,如以下示例所示:spring-doc.cadn.net.cn

public interface StepExecutionListener extends StepListener {

    void beforeStep(StepExecution stepExecution);

    ExitStatus afterStep(StepExecution stepExecution);

}

afterStep返回类型为ExitStatus,让听众有机会 修改完成Step.spring-doc.cadn.net.cn

与此接口对应的注释是:spring-doc.cadn.net.cn

ChunkListener

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

public interface ChunkListener extends StepListener {

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

}

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

与此接口对应的注释是:spring-doc.cadn.net.cn

您可以应用ChunkListener当没有块声明时。这TaskletStep是 负责调用ChunkListener,因此它适用于非面向项的任务 (它在 tasklet 之前和之后调用)。spring-doc.cadn.net.cn

一个ChunkListener不是为抛出检查异常而设计的。错误必须在 实现,否则该步骤将终止。spring-doc.cadn.net.cn

ItemReadListener

之前在讨论跳过逻辑时,提到记录可能会有所帮助 跳过的记录,以便以后处理。在读取错误的情况下, 这可以通过ItemReaderListener,如以下接口定义所示:spring-doc.cadn.net.cn

public interface ItemReadListener<T> extends StepListener {

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

}

beforeRead在每次调用之前调用方法以读取ItemReader.这afterRead每次成功调用读取后调用方法,并传递被读取的项目。如果读取时出现错误,则onReadError方法被调用。提供遇到的异常以便可以记录它。spring-doc.cadn.net.cn

与此接口对应的注释是:spring-doc.cadn.net.cn

ItemProcessListener

ItemReadListener,可以“监听”项目的处理,因为以下接口定义显示:spring-doc.cadn.net.cn

public interface ItemProcessListener<T, S> extends StepListener {

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

}

beforeProcessmethod 在processItemProcessor并且是 递上要处理的项目。这afterProcess方法在 项目已成功处理。如果在处理过程中出现错误,则onProcessError方法被调用。遇到的异常和 提供了尝试处理的,以便可以记录它们。spring-doc.cadn.net.cn

与此接口对应的注释是:spring-doc.cadn.net.cn

ItemWriteListener

您可以使用ItemWriteListener,作为 以下接口定义显示:spring-doc.cadn.net.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);

}

beforeWritemethod 在writeItemWriter并被交给 已写入的项目列表。这afterWrite方法在项目被调用后被调用 成功写入,但在提交与块处理关联的事务之前。 如果写入时出现错误,则onWriteError方法被调用。 遇到的异常和尝试写入的项是 提供,以便可以记录它们。spring-doc.cadn.net.cn

与此接口对应的注释是:spring-doc.cadn.net.cn

SkipListener

ItemReadListener,ItemProcessListenerItemWriteListener都提供了机制 收到错误通知,但没有记录实际上已通知您 跳。onWriteError例如,即使重试了项目,也会调用,并且 成功的。因此,有一个单独的接口用于跟踪跳过的项目,如 以下接口定义显示:spring-doc.cadn.net.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每当读取时跳过项目时都会调用。应该注意的是 回滚可能会导致同一项目多次注册为跳过。onSkipInWrite在写入时跳过项目时调用。因为该项目具有 被成功读取(并且没有跳过),它也会作为 论点。spring-doc.cadn.net.cn

与此接口对应的注释是:spring-doc.cadn.net.cn

SkipListeners 和事务

最常见的用例之一SkipListener是注销一个跳过的项目,因此可以使用另一个批处理甚至人工流程来评估和修复导致跳过的问题。因为在很多情况下原始事务可能会被回滚,Spring Batch 做了两个保证:spring-doc.cadn.net.cn

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

  • SkipListener总是在提交事务之前调用。 这是 以确保侦听器调用的任何事务资源不会被failure 在ItemWriter.spring-doc.cadn.net.cn