|
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Batch 文档 5.1.2! |
|
此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Batch 文档 5.1.2! |
RepeatTemplate (重复模板)
批处理是关于重复操作的,无论是作为简单的优化还是作为一部分
的工作。为了制定和概括重复,并提供相当于
iterator 框架,Spring Batch 具有该接口。该接口具有以下定义:RepeatOperationsRepeatOperations
public interface RepeatOperations {
RepeatStatus iterate(RepeatCallback callback) throws RepeatException;
}
回调是一个接口,如以下定义所示,允许您将 一些需要重复的业务逻辑:
public interface RepeatCallback {
RepeatStatus doInIteration(RepeatContext context) throws Exception;
}
重复执行回调,直到 implementation 确定
iteration 应该结束。这些接口中的返回值是一个枚举值,该值可以
是 或 。枚举将信息传达给重复操作的调用方,说明是否
任何工作都留下来。一般来说,的实现 should 检查并使用它作为决定结束
迭 代。任何希望向调用方发出没有工作的信号的回调
可以返回 。RepeatStatus.CONTINUABLERepeatStatus.FINISHEDRepeatStatusRepeatOperationsRepeatStatusRepeatStatus.FINISHED
最简单的通用实现是 :RepeatOperationsRepeatTemplate
RepeatTemplate template = new RepeatTemplate();
template.setCompletionPolicy(new SimpleCompletionPolicy(2));
template.iterate(new RepeatCallback() {
public RepeatStatus doInIteration(RepeatContext context) {
// Do stuff in batch...
return RepeatStatus.CONTINUABLE;
}
});
在前面的示例中,我们返回 ,以表明存在
还有更多的工作要做。回调还可以返回 ,以向
没有工作的调用者。某些迭代可以由
回调中正在完成的工作所固有的注意事项。其他
无限循环(就回调而言),完成决定是
委托给外部策略,如前面的示例所示。RepeatStatus.CONTINUABLERepeatStatus.FINISHED
值 |
描述 |
|
还有更多的工作要做。 |
|
不应再发生重复。 |
完成策略
在 中,方法中循环的终止是
由 确定,它也是 的工厂。它有责任使用当前策略来创建 a 并将其传递给迭代的每个阶段。
回调完成其 后,必须进行调用
添加到 中,要求它更新其状态(将存储在 中)。然后,它会询问策略迭代是否完成。RepeatTemplateiterateCompletionPolicyRepeatContextRepeatTemplateRepeatContextRepeatCallbackdoInIterationRepeatTemplateCompletionPolicyRepeatContext
Spring Batch 提供了一些简单的通用实现。 允许执行最多固定次数(随时强制提前完成)。CompletionPolicySimpleCompletionPolicyRepeatStatus.FINISHED
对于更复杂的情况,用户可能需要实施自己的完成策略 决定。例如,阻止批处理作业执行的批处理窗口 一旦在线系统投入使用,将需要一个自定义策略。
异常处理
如果在 中引发了异常,则 会查阅
an ,它可以决定是否重新引发异常。RepeatCallbackRepeatTemplateExceptionHandler
下面的清单显示了接口定义:ExceptionHandler
public interface ExceptionHandler {
void handleException(RepeatContext context, Throwable throwable)
throws Throwable;
}
一个常见的用例是计算给定类型的异常数量,并在
达到 limit 时。为此, Spring Batch 提供了 和 稍微灵活一些。有限制
属性和异常类型,该类型应与当前异常进行比较。都
provided type 的子类也会被计算在内。给定类型的异常是
ignored 直到达到限制,然后重新抛出它们。其他类型的异常
总是被重新抛出。SimpleLimitExceptionHandlerRethrowOnThresholdExceptionHandlerSimpleLimitExceptionHandler
的一个重要可选属性是 boolean 标志
叫。默认情况下,该限制仅计入
当前。当设置为 时,该限制将保留在
嵌套迭代(例如步骤中的一组块)。SimpleLimitExceptionHandleruseParentfalseRepeatContexttrue
听众
通常,能够接收横切关注点的其他回调是很有用的
在许多不同的迭代中。为此,Spring Batch 提供了接口。这允许用户注册实现,并在迭代期间向他们提供带有 和 的回调(如果可用)。RepeatListenerRepeatTemplateRepeatListenerRepeatContextRepeatStatus
该接口具有以下定义:RepeatListener
public interface RepeatListener {
void before(RepeatContext context);
void after(RepeatContext context, RepeatStatus result);
void open(RepeatContext context);
void onError(RepeatContext context, Throwable e);
void close(RepeatContext context);
}
and 回调出现在整个迭代之前和之后。、 和 应用于各个调用。openclosebeforeafteronErrorRepeatCallback
请注意,当有多个侦听器时,它们位于一个列表中,因此有一个
次序。在这种情况下, and 以相同的顺序调用,而 , , 和 以相反的顺序调用。openbeforeafteronErrorclose
并行处理
的实现不限于执行回调
顺序。一些 implementation 能够执行其
callback 的 Alpha 函数。为此,Spring Batch 提供了 ,它使用 Spring 策略来运行 .默认使用 ,它具有
在同一线程中执行整个迭代(与 normal 相同)。RepeatOperationsTaskExecutorRepeatTemplateTaskExecutorRepeatCallbackSynchronousTaskExecutorRepeatTemplate
声明式迭代
有时,您知道每次都要重复一些业务处理
它发生了。这方面的经典示例是消息管道的优化。
如果一批消息频繁到达,则处理它们比处理它们更有效
承担每条消息的单独交易费用。Spring Batch 提供 AOP
interceptor 将方法调用包装在对象中
目的。执行 intercepted 方法并重复
根据 中提供的 .RepeatOperationsRepeatOperationsInterceptorCompletionPolicyRepeatTemplate
-
Java
-
XML
以下示例使用 Java 配置来
对调用的方法重复服务调用(有关如何
配置 AOP 拦截器,请参阅 Spring 用户指南):processMessage
@Bean
public MyService myService() {
ProxyFactory factory = new ProxyFactory(RepeatOperations.class.getClassLoader());
factory.setInterfaces(MyService.class);
factory.setTarget(new MyService());
MyService service = (MyService) factory.getProxy();
JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut();
pointcut.setPatterns(".*processMessage.*");
RepeatOperationsInterceptor interceptor = new RepeatOperationsInterceptor();
((Advised) service).addAdvisor(new DefaultPointcutAdvisor(pointcut, interceptor));
return service;
}
下面的示例展示了使用 Spring AOP 名称空间的声明式迭代
对调用的方法重复服务调用(有关如何
配置 AOP 拦截器,请参阅 Spring 用户指南):processMessage
<aop:config>
<aop:pointcut id="transactional"
expression="execution(* com..*Service.processMessage(..))" />
<aop:advisor pointcut-ref="transactional"
advice-ref="retryAdvice" order="-1"/>
</aop:config>
<bean id="retryAdvice" class="org.spr...RepeatOperationsInterceptor"/>
前面的示例在拦截器中使用 default。更改
策略、侦听器和其他详细信息,您可以将 的实例注入拦截器中。RepeatTemplateRepeatTemplate
如果 intercepted 方法返回 ,则拦截器始终返回(因此,如果 没有有限的终点,则存在无限循环的危险)。否则,它将返回,直到截获方法的返回值为 。
此时,它将返回 。因此,业务逻辑
中,目标方法可以通过返回或引发由提供的 .voidRepeatStatus.CONTINUABLECompletionPolicyRepeatStatus.CONTINUABLEnullRepeatStatus.FINISHEDnullExceptionHandlerRepeatTemplate