高级元数据使用

职位注册

一个职位注册用于跟踪上下文中可用的作业,并可由 这作业操作员.它在应用环境中集中收集作业也很有用,当 它们在其他地方也有创造(例如在儿童语境中)。你也可以用自定义职位注册作已注册作业名称及其他属性的实现。 该框架仅提供一种实现,基于一个简单的 从 作业名称映射到 作业实例,MapJobregistry.spring-doc.cadn.net.cn

使用@EnableBatchProcessing一个MapJobregistry为你提供。 以下示例展示了如何配置自己的职位注册:spring-doc.cadn.net.cn

...
@Bean
public JobRegistry jobRegistry() throws Exception {
	return new MyCustomJobRegistry();
}
...

以下示例展示了如何包含职位注册对于用XML定义的作业:spring-doc.cadn.net.cn

<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />

MapJobRegistrySpring Batch 足够聪明,能够为自己填满所有工作岗位 在应用的语境下。然而,如果你使用的是 的自定义实现职位注册你 需要手动填充你想通过作业操作员作的作业。spring-doc.cadn.net.cn

JobParametersIncrementer

大多数方法在作业操作员是 不言自明,你可以在Java文档中找到更详细的界面说明。然而,startNextInstance方法值得注意。这 方法总是从一个新的实例开始工作. 如果出现严重问题,这会非常有用作业执行以及工作需要从头重新开始。与JobLauncher(这需要新的作业参数触发新对象JobInstance),如果参数不同于 任意之前的参数集合,即startNextInstance方法JobParametersIncrementer工作强制工作转给 新实例:spring-doc.cadn.net.cn

public interface JobParametersIncrementer {

    JobParameters getNext(JobParameters parameters);

}

合同JobParametersIncrementer是 给定一个 JobParameters 对象,它返回了“next”作业参数通过递增其可能包含的任何必要的值来实现对象。这 策略之所以有用,是因为框架无法知道具体情况 对作业参数让它成为“下一个” 实例。例如,如果 中唯一的值作业参数是日期,下一个实例 应该被创造出来,这个价值应该增加一天还是一天 比如工作是每周的,比如说是每周的?任何情况都可以如此 帮助识别工作, 如下示例所示:spring-doc.cadn.net.cn

public class SampleIncrementer implements JobParametersIncrementer {

    public JobParameters getNext(JobParameters parameters) {
        if (parameters==null || parameters.isEmpty()) {
            return new JobParametersBuilder().addLong("run.id", 1L).toJobParameters();
        }
        long id = parameters.getLong("run.id",1L) + 1;
        return new JobParametersBuilder().addLong("run.id", id).toJobParameters();
    }
}

在这个例子中,键为run.id习惯于 区分JobInstances.如果作业参数传递 为空,它可以是 假设工作此前从未举办过 因此,其初始状态可以被返回。不过,如果没有,老的 获得值,递增一后返回。spring-doc.cadn.net.cn

对于用 Java 定义的作业,你可以将递增符与工作通过增量器架构商提供了方法如下:spring-doc.cadn.net.cn

@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
    				 .incrementer(sampleIncrementer())
    				 ...
                     .build();
}

对于用XML定义的作业,你可以将增量符与工作通过增量器属性在命名空间中,具体如下:spring-doc.cadn.net.cn

<job id="footballJob" incrementer="sampleIncrementer">
    ...
</job>

停止工作

最常见的用例之一是作业操作员优雅地停止了 工作:spring-doc.cadn.net.cn

Set<Long> executions = jobOperator.getRunningExecutions("sampleJob");
jobOperator.stop(executions.iterator().next());

关闭不会立即发生,因为没有强制执行的办法 立即关闭,尤其是当执行正在进行时 框架无法控制的开发代码,例如 商务服务。然而,一旦控制权恢复到...... 框架,它设定了当前的状态步执行批次状态。停止保存它,并做同样的事 对于作业执行然后结束。spring-doc.cadn.net.cn

处理外部中断信号

从 v6.0+ 起,Spring Batch 提供了作业执行关闭钩子你可以附加到JVM运行时 为了拦截外部中断信号并优雅地停止作业执行:spring-doc.cadn.net.cn

Thread springBatchHook = new JobExecutionShutdownHook(jobExecution, jobOperator);
Runtime.getRuntime().addShutdownHook(springBatchHook);

一个作业执行关闭钩子需要跟踪作业执行,并且需要引用作业操作员 这将用来阻止处决。spring-doc.cadn.net.cn

恢复工作

如果优雅关机没有正确执行(即JVM突然关闭),Spring Batch就不会关闭 有机会正确更新执行状态,以重启失败的作业执行。在这方面 在这种情况下,作业执行将保持在开始该状态不可重新开始。在这种情况下,是有可能的 以恢复这样的作业执行,满足作业操作员应用程序接口:spring-doc.cadn.net.cn

JobExecution jobExecution = ...; // get the job execution to recover
jobOperator.recover(jobExecution);
jobOperator.restart(jobExecution);

终止工作

一个作业执行失败可以是 重启(如果工作可重启)。一个状态为被遗弃的框架无法重启。 这被遗弃的状态也用于STEP中 执行时,在重启作业执行中标记为可跳过。如果 作业正在运行,遇到一个已被标记的步骤被遗弃的在之前失败的作业执行中, 进入下一步(根据作业流定义 以及步骤执行退出状态)。spring-doc.cadn.net.cn

如果进程死了 (击杀 -9或服务器 失败),当然,工作不是运行,而是JobRepository具有 没人告诉过,流程死了没人告诉我。你 必须手动告诉它你知道执行失败了 或者应视为已终止(将其状态更改为失败被遗弃的).这是 这是一个商业决策,而没有自动化的方法。更改 地位失败只有在可重启且你确定重启数据有效的情况下。spring-doc.cadn.net.cn