重复

重复模板

批处理涉及重复作,既可以作为简单的优化,也可以作为部分 一份工作。为了策略化和泛化重复,并提供一个 迭代框架中,Spring Batch 具有重复作接口。这重复作接口定义如下:spring-doc.cadn.net.cn

public interface RepeatOperations {

    RepeatStatus iterate(RepeatCallback callback) throws RepeatException;

}

回调是一种接口,如下定义所示,可以让你插入 以下是一些商业逻辑需要重复:spring-doc.cadn.net.cn

public interface RepeatCallback {

    RepeatStatus doInIteration(RepeatContext context) throws Exception;

}

回调会反复执行,直到实现确定 迭代应该结束。这些接口中的返回值是一个枚举值,可以 要么是重复状态。持续重复状态。已结束.一个重复状态枚举向重复作的调用者传递关于 任何工作都还在。一般来说,的实现重复作应该检查一下重复状态并以此作为终止 迭 代。任何想要向来电者传递无工作信号的回拨仍然存在 可以回归重复状态。已结束.spring-doc.cadn.net.cn

最简单的通用实现重复作重复模板:spring-doc.cadn.net.cn

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;
    }

});

在前面的例子中,我们返回重复状态。持续,以证明存在 还有更多工作要做。回调也可以返回重复状态。已结束, 以向 打电话说没有工作剩下。某些迭代可以通过 这些都是回调工作中内在的考量。其他的则是 对于回调而言,是无限循环,完成决策为 委托给外部政策,如前述示例所示。spring-doc.cadn.net.cn

重复语境

该方法参数重复回访重复语境.很多回访都会忽视 背景。不过,如果有必要,你可以把它当作属性包来存放瞬移者 迭代期间的数据。在迭代方法返回,上下文 已经不存在了。spring-doc.cadn.net.cn

如果存在嵌套迭代进行中,则重复语境有父级背景。这 父上下文有时用于存储需要共享的数据 呼号迭代.例如,如果你想计算 的数量 在迭代中发生的事件,并在后续调用中记住该事件。spring-doc.cadn.net.cn

重复状态

重复状态是Spring Batch用来表示处理是否具有 完成。它有两种可能重复状态值:spring-doc.cadn.net.cn

表1。RepeatStatus 属性

spring-doc.cadn.net.cn

描述spring-doc.cadn.net.cn

连续性spring-doc.cadn.net.cn

还有更多工作要做。spring-doc.cadn.net.cn

完成spring-doc.cadn.net.cn

不应再重复。spring-doc.cadn.net.cn

你可以合并重复状态通过使用并且()方法重复状态.这样做的效果是对 持续标记。换句话说,如果任一状态完成,结果为完成.spring-doc.cadn.net.cn

完工政策

在一个重复模板,即环路在迭代方法是 由完成政策,同时也是重复语境.这重复模板有责任利用当前政策创建重复语境然后传递给重复回访在迭代的每个阶段。 回调完成后doInIteration重复模板必须做出决定 前往完成政策要求它更新状态(该状态将存储在重复语境).然后它会询问策略迭代是否完成。spring-doc.cadn.net.cn

Spring Batch 提供了一些简单的通用实现完成政策.SimpleCompletionPolicy允许执行最多固定次数(其中重复状态。已结束强制提前完成。spring-doc.cadn.net.cn

对于更复杂的用户,可能需要实现自己的完成策略 决定。例如,一个阻止批处理作业执行的批处理窗口 一旦在线系统投入使用,就需要定制保单。spring-doc.cadn.net.cn

异常处理

如果在重复回访重复模板咨询 一异常处理程序,可以决定是否重新抛出该例外。spring-doc.cadn.net.cn

以下列表显示了异常处理程序界面定义:spring-doc.cadn.net.cn

public interface ExceptionHandler {

    void handleException(RepeatContext context, Throwable throwable)
        throws Throwable;

}

一个常见的用例是统计某一类型的异常数量,并在 已达到极限。为此,春季批次提供了SimpleLimitExceptionHandler以及稍微灵活一些的RethrowOnThresholdExceptionHandler.这SimpleLimitExceptionHandler存在极限 属性和一个应与当前例外进行比较的例外类型。都 所提供类型的子类也被计入。给定类型的例外情况有 在达到极限之前,会被忽略,然后再被重新投掷。其他类型的例外 总是被重新投掷。spring-doc.cadn.net.cn

一个重要的可选性质SimpleLimitExceptionHandler是布尔旗 叫useParent.是的false默认情况下,限制仅考虑在 当前重复语境.当设置为true,在兄弟上下文中,该极限保持在 嵌套迭代(例如步骤内的一组块)。spring-doc.cadn.net.cn

听众

通常,能够接收额外的回调以应对交叉切入问题是有用的 在多个不同的版本中。为此,春季批次提供了重复聆听者接口。这重复模板允许用户注册重复聆听者实现,并且它们会通过重复语境重复状态在迭代过程中有的话。spring-doc.cadn.net.cn

重复聆听者接口定义如下:spring-doc.cadn.net.cn

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);
}

打开关闭回调出现在整个迭代之前和之后。以前,onError请针对个人重复回访调用。spring-doc.cadn.net.cn

注意,当有多个监听者时,他们属于列表,因此存在 次序。在这种情况下,打开以前,onError关闭按相反顺序命名。spring-doc.cadn.net.cn

并行处理

实现重复作不局限于执行回调 顺序。有些实现能够执行 并行回调。为此,春季批次提供了TaskExecutorRepeatTemplate,使用了Spring任务执行者运行重复回访.默认情况下使用同步任务执行器,其效果为 在同一线程中执行整个迭代(与正常线程相同)重复模板).spring-doc.cadn.net.cn

声明式迭代

有时候,有些业务流程你知道每次都想重复 这种事会发生。其中的经典例子是消息管道的优化。 如果一批消息频繁到达,处理它们比 为每条消息承担单独交易的成本。春季批次提供了AOP 将方法调用包裹在重复作此目的的对象 目的。这重复行动拦截机执行截获的方法并重复 根据完成政策在提供的重复模板.spring-doc.cadn.net.cn

以下示例使用 Java 配置 重复对一个名为 的方法的服务调用processMessage(关于如何作的更多细节 配置AOP拦截器,详见Spring用户指南):spring-doc.cadn.net.cn

@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 命名空间 重复对一个名为 的方法的服务调用processMessage(关于如何作的更多细节 配置AOP拦截器,详见Spring用户指南):spring-doc.cadn.net.cn

<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"/>

前面的例子使用默认值重复模板在拦截机内部。改变 策略、监听者和其他细节,你可以注入一个实例重复模板进入拦截机。spring-doc.cadn.net.cn

如果截获的方法返回无效拦截器总是返回重复状态。持续(因此,如果完成政策没有有限的终点)。否则,它会返回重复状态。持续直到截获方法的返回值为. 到那时,它还会回来重复状态。已结束.因此,业务逻辑 目标方法内可以通过返回来表示不再需要做功或者通过抛出一个例外,该异常被异常处理程序在提供的重复模板.spring-doc.cadn.net.cn