配置作业
有多种实现Job
接口。 然而 这些实现被抽象化在提供的构建器(用于 Java 配置)或 XML命名空间(用于基于 XML 的配置)后面。以下示例显示了 Java 和 XML 配置:
-
Java
-
XML
@Bean
public Job footballJob(JobRepository jobRepository) {
return new JobBuilder("footballJob", jobRepository)
.start(playerLoad())
.next(gameLoad())
.next(playerSummarization())
.build();
}
一个Job
(并且,通常,任何Step
在其中)需要一个JobRepository
. 这 配置JobRepository
通过Java Configuration
.
前面的示例说明了Job
由三个组成Step
实例。 与作业相关的构建器还可以包含有助于并行化的其他元素(Split
), 声明式流控制 (Decision
)和流定义的外部化(Flow
).
有多种实现Job
接口。 但是,命名空间抽象化了配置中的差异。它有只有三个必需的依赖项:一个名称、JobRepository
,以及Step
实例。 以下示例创建了一个footballJob
:
<job id="footballJob">
<step id="playerload" parent="s1" next="gameLoad"/>
<step id="gameLoad" parent="s2" next="playerSummarization"/>
<step id="playerSummarization" parent="s3"/>
</job>
前面的示例使用父 Bean 定义来创建步骤。请参阅有关步骤配置部分,了解内联声明特定步骤详细信息时的更多选项。XML 命名空间默认情况下使用id
之jobRepository
哪 是一个合理的默认值。但是,您可以显式覆盖此默认值:
<job id="footballJob" job-repository="specialRepository">
<step id="playerload" parent="s1" next="gameLoad"/>
<step id="gameLoad" parent="s3" next="playerSummarization"/>
<step id="playerSummarization" parent="s3"/>
</job>
除了步骤之外,作业配置还可以包含其他元素这些元素有助于并行化 (<split>
), 声明式流控制 (<decision>
),以及流定义的外部化 (<flow/>
).
可重启性
执行批处理作业时的一个关键问题涉及Job
当它是 重新 启动。 启动Job
如果JobExecution
已经存在,用于特定的JobInstance
. 理想情况下,所有作业都应该能够启动从他们离开的地方开始,但在某些情况下这是不可能的。在这种情况下,完全由开发人员来确保新的JobInstance
被创建。但是,Spring Batch 确实提供了一些帮助。如果Job
永远不应该重新启动,但应始终作为新JobInstance
,您可以将restartable 属性设置为false
.
-
Java
-
XML
以下示例演示如何设置restartable
字段设置为false
在 Java 中:
@Bean
public Job footballJob(JobRepository jobRepository) {
return new JobBuilder("footballJob", jobRepository)
.preventRestart()
...
.build();
}
以下示例演示如何设置restartable
字段设置为false
在 XML 中:
<job id="footballJob" restartable="false">
...
</job>
换句话说,将restartable
自false
意思是“这Job
不支持重新启动“。重新启动Job
也就是说,不是restartable 会导致JobRestartException
自 被抛出。以下 Junit 代码导致抛出异常:
Job job = new SimpleJob();
job.setRestartable(false);
JobParameters jobParameters = new JobParameters();
JobExecution firstExecution = jobRepository.createJobExecution(job, jobParameters);
jobRepository.saveOrUpdate(firstExecution);
try {
jobRepository.createJobExecution(job, jobParameters);
fail();
}
catch (JobRestartException e) {
// expected
}
第一次尝试创建JobExecution
对于不可重启的作业不会导致任何问题。但是,第二次尝试会抛出JobRestartException
.
拦截作业执行
在执行过程中Job
,在其生命周期中收到各种事件的通知可能会很有用,以便可以运行自定义代码。SimpleJob
通过调用JobListener
在适当的时候:
public interface JobExecutionListener {
void beforeJob(JobExecution jobExecution);
void afterJob(JobExecution jobExecution);
}
您可以添加JobListeners
设置为SimpleJob
通过在作业上设置侦听器。
-
Java
-
XML
以下示例显示了如何将侦听器方法添加到 Java 作业定义中:
@Bean
public Job footballJob(JobRepository jobRepository) {
return new JobBuilder("footballJob", jobRepository)
.listener(sampleListener())
...
.build();
}
以下示例显示了如何将侦听器元素添加到 XML 作业定义中:
<job id="footballJob">
<step id="playerload" parent="s1" next="gameLoad"/>
<step id="gameLoad" parent="s2" next="playerSummarization"/>
<step id="playerSummarization" parent="s3"/>
<listeners>
<listener ref="sampleListener"/>
</listeners>
</job>
请注意,afterJob
方法被调用,无论成功还是失败Job
. 如果您需要确定成功或失败,您可以从JobExecution
:
public void afterJob(JobExecution jobExecution){
if (jobExecution.getStatus() == BatchStatus.COMPLETED ) {
//job success
}
else if (jobExecution.getStatus() == BatchStatus.FAILED) {
//job failure
}
}
与此接口对应的注释是:
-
@BeforeJob
-
@AfterJob
从父作业继承
如果一组作业共享相似但不
相同的配置,定义“父级”可能会有所帮助Job
混凝土从中Job
实例可以继承属性。与class相似
Java 中的继承,一个“子”Job
结合 其元素和属性与父级的元素和属性。
在以下示例中,baseJob
是一个摘要Job
仅定义列表的定义
听众。这Job
(job1
)是混凝土
从以下位置继承侦听器列表的定义baseJob
和合并
它与自己的侦听器列表一起生成一个Job
有两个听众和一个Step
(step1
).
<job id="baseJob" abstract="true">
<listeners>
<listener ref="listenerOne"/>
</listeners>
</job>
<job id="job1" parent="baseJob">
<step id="step1" parent="standaloneStep"/>
<listeners merge="true">
<listener ref="listenerTwo"/>
</listeners>
</job>
有关更多详细信息,请参阅从父步骤继承部分。
作业参数验证器
在 XML 命名空间中声明的作业或使用AbstractJob
可以选择为
运行。例如,当您需要断言作业时,这很有用
以所有必需参数开头。有一个DefaultJobParametersValidator
可用于约束组合
简单的强制参数和可选参数。对于更复杂的
constraints,您可以自己实现接口。
-
Java
-
XML
验证器的配置通过 Java 构建器支持:
@Bean
public Job job1(JobRepository jobRepository) {
return new JobBuilder("job1", jobRepository)
.validator(parametersValidator())
...
.build();
}
验证器的配置通过子项的 XML 命名空间支持 元素,如以下示例所示:
<job id="job1" parent="baseJob3">
<step id="step1" parent="standaloneStep"/>
<validator ref="parametersValidator"/>
</job>
您可以将验证器指定为引用(如前面所示)或嵌套 Bean
定义beans
Namespace。