拦截Step执行
就像Job,在执行Step其中 a
用户可能需要执行某些功能。例如,要写出到平面
文件,则ItemWriter当Step具有
已完成,以便可以写入页脚。这可以通过许多Step作用域侦听器。
您可以应用任何实现StepListener(但不是那个界面
本身,因为它是空的)到listeners元素。
这listeners元素在 step、tasklet 或 chunk 声明中有效。我们
建议您在其函数适用的级别声明侦听器
或者,如果它是多功能的(例如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它本身实现了一个StepListenerinterfaces 会自动注册到Step如果使用
Namespace<step>元素或*StepFactoryBean工厂。仅此
适用于直接注入到Step.如果侦听器嵌套在
另一个组件,您需要显式注册它(如前面的注册ItemStream替换为Step).
除了StepListener接口中,提供了注解来解决
同样的担忧。普通的旧 Java 对象可以具有带有这些注释的方法,这些注释是
然后转换为相应的StepListener类型。注释
块组件的自定义实现,例如ItemReader或ItemWriter或Tasklet.注释由 XML 解析器分析<listener/>元素
以及在listener方法,因此您需要做的就是
是使用 XML 命名空间或生成器将侦听器注册到步骤。
StepExecutionListener
StepExecutionListener表示Step执行。它
允许在Step已启动,结束后,是否结束
normally 或 failed,如下例所示:
public interface StepExecutionListener extends StepListener {
void beforeStep(StepExecution stepExecution);
ExitStatus afterStep(StepExecution stepExecution);
}
ExitStatus的返回类型为afterStep,让听众有机会
修改在完成Step.
与此接口对应的注解是:
-
@BeforeStep -
@AfterStep
ChunkListener
“块”定义为在事务范围内处理的项目。提交
transaction 在每个提交间隔提交一个 chunk。您可以使用ChunkListener自
在 chunk 开始处理之前或 chunk 完成后执行逻辑
成功,如下面的接口定义所示:
public interface ChunkListener extends StepListener {
void beforeChunk(ChunkContext context);
void afterChunk(ChunkContext context);
void afterChunkError(ChunkContext context);
}
beforeChunk 方法在事务启动之后但在读取开始之前调用
在ItemReader.相反afterChunk在 chunk 被
已提交(如果有回滚,则根本不提交)。
与此接口对应的注解是:
-
@BeforeChunk -
@AfterChunk -
@AfterChunkError
您可以应用ChunkListener当没有 chunk 声明时。这TaskletStep是
负责调用ChunkListener,因此它适用于非面向项的 tasklet
以及(它在 tasklet 之前和之后调用)。
一个ChunkListener不是为了引发检查异常而设计的。错误必须在
implementation 否则该步骤将终止。
ItemReadListener
在之前讨论跳过逻辑时,提到对
跳过的记录,以便以后可以处理它们。在读取错误的情况下,
这可以通过ItemReaderListener,如下接口
定义显示:
public interface ItemReadListener<T> extends StepListener {
void beforeRead();
void afterRead(T item);
void onReadError(Exception ex);
}
这beforeRead方法在每次调用之前调用 read。ItemReader.这afterReadmethod 在每次成功调用 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);
}
这beforeProcessmethod 之前被调用process在ItemProcessor和 is
已递出要处理的项目。这afterProcessmethod 在
商品已成功处理。如果在处理过程中出现错误,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);
}
这beforeWritemethod 之前被调用write在ItemWriter并递给
写入的项目列表。这afterWritemethod 在项
已成功写入,但在提交与 chunk 的处理关联的事务之前。
如果在写入时出现错误,则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每当读取时跳过项时调用。需要注意的是
回滚可能会导致同一项目多次注册为 skipped。onSkipInWrite在写入时跳过项时调用。因为该项目具有
已成功读取(且未跳过),它还将项目本身作为
论点。
与此接口对应的注解是:
-
@OnSkipInRead -
@OnSkipInWrite -
@OnSkipInProcess