此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2! |
拦截Step
执行
就像Job
,在执行Step
其中用户可能需要执行某些功能。例如,要写出到需要页脚的平面文件,则ItemWriter
当Step
已已完成,以便可以编写页脚。这可以通过众多之一来完成Step
作用域侦听器。
您可以应用任何实现StepListener
(但不是那个接口本身,因为它是空的)通过listeners
元素。 这listeners
元素在步骤、任务或块声明中有效。 我们 建议您在其功能应用的级别声明监听器或者,如果它是多功能的(例如StepExecutionListener
和ItemReadListener
), 在应用的最精细级别声明它。
-
Java
-
XML
以下示例显示了在 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 中块级别应用的侦听器:
<step id="step1">
<tasklet>
<chunk reader="reader" writer="writer" commit-interval="10"/>
<listeners>
<listener ref="chunkListener"/>
</listeners>
</tasklet>
</step>
一ItemReader
,ItemWriter
或ItemProcessor
它本身实现了StepListener
接口会自动注册到Step
如果使用 Namespace<step>
元素或*StepFactoryBean
工厂。 这仅适用于直接注入Step
. 如果监听器嵌套在另一个组件中,则需要显式注册它(如前面在注册ItemStream
使用Step
).
除了StepListener
接口,提供注释来解决同样的问题。普通的旧 Java 对象可以具有具有这些注释的方法,这些注释是然后转换为相应的StepListener
类型。 注释块组件的自定义实现也很常见,例如ItemReader
或ItemWriter
或Tasklet
. XML 解析器分析注释<listener/>
元素 以及在listener
方法,所以你需要做的就是使用 XML 命名空间或构建器来注册带有步骤的侦听器。
StepExecutionListener
StepExecutionListener
表示最通用的监听器Step
执行。 它 允许在Step
开始后,无论结束正常还是失败,如以下示例所示:
public interface StepExecutionListener extends StepListener {
void beforeStep(StepExecution stepExecution);
ExitStatus afterStep(StepExecution stepExecution);
}
afterStep
返回类型为ExitStatus
,让侦听器有机会修改完成后返回的退出代码Step
.
与此接口对应的注释是:
-
@BeforeStep
-
@AfterStep
ChunkListener
“块”定义为在事务范围内处理的项目。提交transaction,在每个提交间隔内提交一个块。您可以使用ChunkListener
自 在块开始处理之前或块完成后执行逻辑成功,如以下接口定义所示:
public interface ChunkListener extends StepListener {
void beforeChunk(ChunkContext context);
void afterChunk(ChunkContext context);
void afterChunkError(ChunkContext context);
}
beforeChunk 方法在事务启动后但在读取开始之前调用在ItemReader
. 相反afterChunk
在块被调用后已提交(如果有回滚,则根本不调用)。
与此接口对应的注释是:
-
@BeforeChunk
-
@AfterChunk
-
@AfterChunkError
您可以应用ChunkListener
当没有块声明时。这TaskletStep
是
负责调用ChunkListener
,因此它适用于非面向项的任务
(它在 tasklet 之前和之后调用)。
一个ChunkListener
不是为抛出检查异常而设计的。错误必须在
实现,否则该步骤将终止。
ItemReadListener
之前在讨论跳过逻辑时,提到记录可能会有所帮助
跳过的记录,以便以后处理。在读取错误的情况下,
这可以通过ItemReaderListener
,作为以下接口
定义显示:
public interface ItemReadListener<T> extends StepListener {
void beforeRead();
void afterRead(T item);
void onReadError(Exception ex);
}
这beforeRead
在每次调用之前调用方法以读取ItemReader
.这afterRead
每次成功调用 read 后调用方法,并传递项目
那是读出来的。如果读取时出现错误,则onReadError
方法被调用。
提供遇到的异常,以便可以记录它。
与此接口对应的注释是:
-
@BeforeRead
-
@AfterRead
-
@OnReadError
ItemProcessListener
与ItemReadListener
,可以“监听”项目的处理,如
以下接口定义显示:
public interface ItemProcessListener<T, S> extends StepListener {
void beforeProcess(T item);
void afterProcess(T item, S result);
void onProcessError(T item, Exception e);
}
这beforeProcess
method 在process
在ItemProcessor
并且是
递上要处理的项目。这afterProcess
方法在
项目已成功处理。如果在处理过程中出现错误,则onProcessError
方法被调用。遇到的异常和
提供了尝试处理的,以便可以记录它们。
与此接口对应的注释是:
-
@BeforeProcess
-
@AfterProcess
-
@OnProcessError
ItemWriteListener
您可以使用ItemWriteListener
,作为
以下接口定义显示:
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);
}
这beforeWrite
method 在write
在ItemWriter
并被交给
已写入的项目列表。这afterWrite
方法在项目被调用后被调用
成功写入,但在提交与块处理关联的事务之前。
如果写入时出现错误,则onWriteError
方法被调用。
遇到的异常和尝试写入的项是
提供,以便可以记录它们。
与此接口对应的注释是:
-
@BeforeWrite
-
@AfterWrite
-
@OnWriteError
SkipListener
ItemReadListener
,ItemProcessListener
和ItemWriteListener
都提供了机制
收到错误通知,但没有记录实际上已通知您
跳。onWriteError
例如,即使重试了项目,也会调用,并且
成功的。因此,有一个单独的接口用于跟踪跳过的项目,如
以下接口定义显示:
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
在写入时跳过项目时调用。因为该项目具有
被成功读取(并且没有跳过),它也会作为
论点。
与此接口对应的注释是:
-
@OnSkipInRead
-
@OnSkipInWrite
-
@OnSkipInProcess