拦截执行

就像工作,执行过程中发生了许多事件其中 a 用户可能需要执行某些功能。例如,写出一个平面 需要页脚的文件,ItemWriter具有 已完成,以便编写尾脚。这可以通过多种方式实现有视野的听众。spring-doc.cadn.net.cn

你可以应用任何实现 扩展的类StepListener(听音器)(但不是那个界面 它本身,因为它是空的)到通过听众元素。 这听众元素在步骤、任务小节或区块声明中有效。我们 建议你将听众声明在其功能适用的层级 或者,如果它是多功能的(例如)StepExecutionListener项目阅读听者), 在适用的最细致层面上声明。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(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(听音器)接口会自动注册于如果使用 Namespace<阶>元素或*StepFactoryBean工厂。仅此而已 适用于直接注入.如果监听器嵌套在里面 另一个组件,你需要显式注册(如之前所述)注册ItemStream其中).spring-doc.cadn.net.cn

此外StepListener(听音器)接口、注释都被提供以处理 同样的担忧。普通的 Java 对象可以包含这些注释的方法,如下 然后转换为相应的StepListener(听音器)类型。注释也很常见 块组件的自定义实现,例如ItemReaderItemWriter任务.这些注释由XML解析器分析<听众/>元素 并且在听者架构材料中的方法,所以你只需要做 是使用 XML 命名空间或构建器来通过步骤注册监听者。spring-doc.cadn.net.cn

StepExecutionListener

StepExecutionListener代表最通用的听者执行。它 允许在开始了,结束后,是否结束了 正常或失败,如下示例所示:spring-doc.cadn.net.cn

public interface StepExecutionListener extends StepListener {

    void beforeStep(StepExecution stepExecution);

    ExitStatus afterStep(StepExecution stepExecution);

}

afterStep具有返回类型退出状态,给听众一个机会 修改完成后返回的退出代码.spring-doc.cadn.net.cn

对应该接口的注释有:spring-doc.cadn.net.cn

ChunkListener(分块听众)

“区块”定义为交易范围内处理的项目。提交 事务在每个提交间隔提交一个块。你可以用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.相反Chunk之后在该块被调用之后 承诺(或者如果有回滚则完全不承诺)。spring-doc.cadn.net.cn

对应该接口的注释有:spring-doc.cadn.net.cn

你可以应用ChunkListener(分块听众)当没有区块声明时。这任务步是 负责呼叫ChunkListener(分块听众),因此适用于非面向项目的任务项 也(在任务组之前和之后都称为)。spring-doc.cadn.net.cn

一个ChunkListener(分块听众)不设计用来抛出已检查的异常。错误必须在 实施,否则该步骤将终止。spring-doc.cadn.net.cn

项目阅读听者

之前讨论跳跃逻辑时,提到记录可能有益 这些记录被跳过,以便以后处理。在读取错误的情况下, 这可以通过ItemReader听者,作为以下接口 定义显示:spring-doc.cadn.net.cn

public interface ItemReadListener<T> extends StepListener {

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

}

之前阅读每次调用前都会调用方法,读取ItemReader.这读毕每次成功读取调用后调用方法,并传递该项 那是被宣读的。如果读取时出现错误,onReadError称为 方法。 遇到的异常被提供以便记录。spring-doc.cadn.net.cn

对应该接口的注释有:spring-doc.cadn.net.cn

ItemProcessListener

项目阅读听者,可以“监听”一个项目的处理过程,如 以下接口定义展示了: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);

}

在进程之前方法在过程ItemProcessor且是 递上要处理的物品。这后处理该方法在 该项目已成功处理。如果处理过程中出现错误,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);

}

在写之前方法在ItemWriter并被交付给 书写的物品列表。这后写方法在项目 发生后才被调用 成功写入,但在提交与该块处理相关的事务之前。 如果写入时出现错误,onWriteError称为 方法。 遇到的异常和尝试写入的项为 提供,以便记录。spring-doc.cadn.net.cn

对应该接口的注释有:spring-doc.cadn.net.cn

跳过听众

项目阅读听者,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

跳过听众与交易

最常见的用例之一是跳过听众是要登出跳过的项目,所以 可以使用另一个批处理过程,甚至人工过程来评估和修复 导致跳过的问题。因为在许多情况下,原始交易 可以回滚,Spring Batch 有两项保证:spring-doc.cadn.net.cn

  • 相应的跳过方法(取决于错误发生的时间)只调用一次 每件物品。spring-doc.cadn.net.cn

  • 跳过听众总是在事务提交前调用。这是 以确保监听者调用的任何事务资源不会被 在ItemWriter.spring-doc.cadn.net.cn