重复
RepeatTemplate (重复模板)
批处理是关于重复操作的,无论是作为简单的优化还是作为一部分
的工作。为了制定和概括重复,并提供相当于
iterator 框架,Spring Batch 具有该接口。该接口具有以下定义:RepeatOperations
RepeatOperations
public interface RepeatOperations {
RepeatStatus iterate(RepeatCallback callback) throws RepeatException;
}
回调是一个接口,如以下定义所示,允许您将 一些需要重复的业务逻辑:
public interface RepeatCallback {
RepeatStatus doInIteration(RepeatContext context) throws Exception;
}
重复执行回调,直到 implementation 确定
iteration 应该结束。这些接口中的返回值是一个枚举值,该值可以
是 或 。枚举将信息传达给重复操作的调用方,说明是否
任何工作都留下来。一般来说,的实现 should 检查并使用它作为决定结束
迭 代。任何希望向调用方发出没有工作的信号的回调
可以返回 。RepeatStatus.CONTINUABLE
RepeatStatus.FINISHED
RepeatStatus
RepeatOperations
RepeatStatus
RepeatStatus.FINISHED
最简单的通用实现是 :RepeatOperations
RepeatTemplate
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.CONTINUABLE
RepeatStatus.FINISHED
完成策略
在 中,方法中循环的终止是
由 确定,它也是 的工厂。它有责任使用当前策略来创建 a 并将其传递给迭代的每个阶段。
回调完成其 后,必须进行调用
添加到 中,要求它更新其状态(将存储在 中)。然后,它会询问策略迭代是否完成。RepeatTemplate
iterate
CompletionPolicy
RepeatContext
RepeatTemplate
RepeatContext
RepeatCallback
doInIteration
RepeatTemplate
CompletionPolicy
RepeatContext
Spring Batch 提供了一些简单的通用实现。 允许执行最多固定次数(随时强制提前完成)。CompletionPolicy
SimpleCompletionPolicy
RepeatStatus.FINISHED
对于更复杂的情况,用户可能需要实施自己的完成策略 决定。例如,阻止批处理作业执行的批处理窗口 一旦在线系统投入使用,将需要一个自定义策略。
异常处理
如果在 中引发了异常,则 会查阅
an ,它可以决定是否重新引发异常。RepeatCallback
RepeatTemplate
ExceptionHandler
下面的清单显示了接口定义:ExceptionHandler
public interface ExceptionHandler {
void handleException(RepeatContext context, Throwable throwable)
throws Throwable;
}
一个常见的用例是计算给定类型的异常数量,并在
达到 limit 时。为此, Spring Batch 提供了 和 稍微灵活一些。有限制
属性和异常类型,该类型应与当前异常进行比较。都
provided type 的子类也会被计算在内。给定类型的异常是
ignored 直到达到限制,然后重新抛出它们。其他类型的异常
总是被重新抛出。SimpleLimitExceptionHandler
RethrowOnThresholdExceptionHandler
SimpleLimitExceptionHandler
的一个重要可选属性是 boolean 标志
叫。默认情况下,该限制仅计入
当前。当设置为 时,该限制将保留在
嵌套迭代(例如步骤中的一组块)。SimpleLimitExceptionHandler
useParent
false
RepeatContext
true
听众
通常,能够接收横切关注点的其他回调是很有用的
在许多不同的迭代中。为此,Spring Batch 提供了接口。这允许用户注册实现,并在迭代期间向他们提供带有 和 的回调(如果可用)。RepeatListener
RepeatTemplate
RepeatListener
RepeatContext
RepeatStatus
该接口具有以下定义: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 回调出现在整个迭代之前和之后。、 和 应用于各个调用。open
close
before
after
onError
RepeatCallback
请注意,当有多个侦听器时,它们位于一个列表中,因此有一个
次序。在这种情况下, and 以相同的顺序调用,而 , , 和 以相反的顺序调用。open
before
after
onError
close
并行处理
的实现不限于执行回调
顺序。一些 implementation 能够执行其
callback 的 Alpha 函数。为此,Spring Batch 提供了 ,它使用 Spring 策略来运行 .默认使用 ,它具有
在同一线程中执行整个迭代(与 normal 相同)。RepeatOperations
TaskExecutorRepeatTemplate
TaskExecutor
RepeatCallback
SynchronousTaskExecutor
RepeatTemplate
声明式迭代
有时,您知道每次都要重复一些业务处理
它发生了。这方面的经典示例是消息管道的优化。
如果一批消息频繁到达,则处理它们比处理它们更有效
承担每条消息的单独交易费用。Spring Batch 提供 AOP
interceptor 将方法调用包装在对象中
目的。执行 intercepted 方法并重复
根据 中提供的 .RepeatOperations
RepeatOperationsInterceptor
CompletionPolicy
RepeatTemplate
-
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。更改
策略、侦听器和其他详细信息,您可以将 的实例注入拦截器中。RepeatTemplate
RepeatTemplate
如果 intercepted 方法返回 ,则拦截器始终返回(因此,如果 没有有限的终点,则存在无限循环的危险)。否则,它将返回,直到截获方法的返回值为 。
此时,它将返回 。因此,业务逻辑
中,目标方法可以通过返回或引发由提供的 .void
RepeatStatus.CONTINUABLE
CompletionPolicy
RepeatStatus.CONTINUABLE
null
RepeatStatus.FINISHED
null
ExceptionHandler
RepeatTemplate