高级元数据使用
职位注册
一个职位注册用于跟踪上下文中可用的作业,并可由
这作业操作员.它在应用环境中集中收集作业也很有用,当
它们在其他地方也有创造(例如在儿童语境中)。你也可以用自定义职位注册作已注册作业名称及其他属性的实现。
该框架仅提供一种实现,基于一个简单的
从 作业名称映射到 作业实例,MapJobregistry.
-
Java
-
XML
使用@EnableBatchProcessing一个MapJobregistry为你提供。
以下示例展示了如何配置自己的职位注册:
...
@Bean
public JobRegistry jobRegistry() throws Exception {
return new MyCustomJobRegistry();
}
...
以下示例展示了如何包含职位注册对于用XML定义的作业:
<bean id="jobRegistry" class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
这MapJobRegistrySpring Batch 足够聪明,能够为自己填满所有工作岗位
在应用的语境下。然而,如果你使用的是 的自定义实现职位注册你
需要手动填充你想通过作业操作员作的作业。
JobParametersIncrementer
大多数方法在作业操作员是
不言自明,你可以在Java文档中找到更详细的界面说明。然而,startNextInstance方法值得注意。这
方法总是从一个新的实例开始工作.
如果出现严重问题,这会非常有用作业执行以及工作需要从头重新开始。与JobLauncher(这需要新的作业参数触发新对象JobInstance),如果参数不同于
任意之前的参数集合,即startNextInstance方法JobParametersIncrementer与工作强制工作转给
新实例:
public interface JobParametersIncrementer {
JobParameters getNext(JobParameters parameters);
}
合同JobParametersIncrementer是
给定一个 JobParameters 对象,它返回了“next”作业参数通过递增其可能包含的任何必要的值来实现对象。这
策略之所以有用,是因为框架无法知道具体情况
对作业参数让它成为“下一个”
实例。例如,如果 中唯一的值作业参数是日期,下一个实例
应该被创造出来,这个价值应该增加一天还是一天
比如工作是每周的,比如说是每周的?任何情况都可以如此
帮助识别工作,
如下示例所示:
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.如果作业参数传递 为空,它可以是
假设工作此前从未举办过
因此,其初始状态可以被返回。不过,如果没有,老的
获得值,递增一后返回。
-
Java
-
XML
对于用 Java 定义的作业,你可以将递增符与工作通过增量器架构商提供了方法如下:
@Bean
public Job footballJob(JobRepository jobRepository) {
return new JobBuilder("footballJob", jobRepository)
.incrementer(sampleIncrementer())
...
.build();
}
对于用XML定义的作业,你可以将增量符与工作通过增量器属性在命名空间中,具体如下:
<job id="footballJob" incrementer="sampleIncrementer">
...
</job>
停止工作
最常见的用例之一是作业操作员优雅地停止了
工作:
Set<Long> executions = jobOperator.getRunningExecutions("sampleJob");
jobOperator.stop(executions.iterator().next());
关闭不会立即发生,因为没有强制执行的办法
立即关闭,尤其是当执行正在进行时
框架无法控制的开发代码,例如
商务服务。然而,一旦控制权恢复到......
框架,它设定了当前的状态步执行自批次状态。停止保存它,并做同样的事
对于作业执行然后结束。
处理外部中断信号
从 v6.0+ 起,Spring Batch 提供了作业执行关闭钩子你可以附加到JVM运行时
为了拦截外部中断信号并优雅地停止作业执行:
Thread springBatchHook = new JobExecutionShutdownHook(jobExecution, jobOperator);
Runtime.getRuntime().addShutdownHook(springBatchHook);
一个作业执行关闭钩子需要跟踪作业执行,并且需要引用作业操作员
这将用来阻止处决。
恢复工作
如果优雅关机没有正确执行(即JVM突然关闭),Spring Batch就不会关闭
有机会正确更新执行状态,以重启失败的作业执行。在这方面
在这种情况下,作业执行将保持在开始该状态不可重新开始。在这种情况下,是有可能的
以恢复这样的作业执行,满足作业操作员应用程序接口:
JobExecution jobExecution = ...; // get the job execution to recover
jobOperator.recover(jobExecution);
jobOperator.restart(jobExecution);
终止工作
一个作业执行失败可以是
重启(如果工作可重启)。一个状态为被遗弃的框架无法重启。
这被遗弃的状态也用于STEP中
执行时,在重启作业执行中标记为可跳过。如果
作业正在运行,遇到一个已被标记的步骤被遗弃的在之前失败的作业执行中,
进入下一步(根据作业流定义
以及步骤执行退出状态)。
如果进程死了 (击杀 -9或服务器
失败),当然,工作不是运行,而是JobRepository具有
没人告诉过,流程死了没人告诉我。你
必须手动告诉它你知道执行失败了
或者应视为已终止(将其状态更改为失败或被遗弃的).这是
这是一个商业决策,而没有自动化的方法。更改
地位失败只有在可重启且你确定重启数据有效的情况下。