配置 Job

有多种Job接口。然而 这些实现抽象在提供的构建器(用于 Java 配置)或 XML 后面 namespace (用于基于 XML 的配置)。以下示例显示了 Java 和 XML 配置:spring-doc.cadn.net.cn

@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
                     .start(playerLoad())
                     .next(gameLoad())
                     .next(playerSummarization())
                     .build();
}

一个Job(通常,任何Step)需要一个JobRepository.这 的配置JobRepository通过Java Configuration.spring-doc.cadn.net.cn

前面的示例说明了Job由三个Step实例。工作相关 构建器还可以包含其他有助于并行化的元素 (Split), 声明式流控制 (Decision)和流定义的外部化 (Flow).spring-doc.cadn.net.cn

有多种Job接口。但是,命名空间抽象出了配置中的差异。它有 只有三个必需的依赖项:名称、JobRepositoryStep实例。 以下示例创建一个footballJob:spring-doc.cadn.net.cn

<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 命名空间 默认为使用idjobRepository哪 是合理的默认值。但是,您可以显式覆盖此默认值:spring-doc.cadn.net.cn

<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/>).spring-doc.cadn.net.cn

可重启性

执行批处理作业时的一个关键问题涉及Job当它是 重新 启动。推出Job如果JobExecution已存在特定的JobInstance.理想情况下,所有作业都应该能够启动 从他们离开的地方开始,但在某些情况下这是不可能的。在这种情况下,完全由开发人员来确保新的JobInstance已创建。但是,Spring Batch 确实提供了一些帮助。如果Job永远不应该是 重新启动,但应始终作为新的JobInstance中,您可以设置 restartable 属性设置为false.spring-doc.cadn.net.cn

以下示例演示如何设置restartablefield 设置为false在 Java 中:spring-doc.cadn.net.cn

Java 配置
@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
                     .preventRestart()
                     ...
                     .build();
}

以下示例演示如何设置restartablefield 设置为false在 XML 中:spring-doc.cadn.net.cn

XML 配置
<job id="footballJob" restartable="false">
    ...
</job>

换句话说,设置restartablefalse意思是“这个Job不支持再次启动”。重新启动Job那不是 restartable 会导致JobRestartException自 被扔掉。 以下 Junit 代码会导致引发异常:spring-doc.cadn.net.cn

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对于不可重新启动的 job 不会引起任何问题。然而,第二个 尝试抛出JobRestartException.spring-doc.cadn.net.cn

拦截任务执行

在执行Job,收到各种 事件,以便可以运行自定义代码。SimpleJob允许通过调用JobListener在适当的时候:spring-doc.cadn.net.cn

public interface JobExecutionListener {

    void beforeJob(JobExecution jobExecution);

    void afterJob(JobExecution jobExecution);
}

您可以添加JobListeners更改为SimpleJob通过在作业上设置 listeners 来执行。spring-doc.cadn.net.cn

以下示例说明如何将侦听器方法添加到 Java 作业定义中:spring-doc.cadn.net.cn

Java 配置
@Bean
public Job footballJob(JobRepository jobRepository) {
    return new JobBuilder("footballJob", jobRepository)
                     .listener(sampleListener())
                     ...
                     .build();
}

以下示例演示如何将侦听器元素添加到 XML 作业定义中:spring-doc.cadn.net.cn

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:spring-doc.cadn.net.cn

public void afterJob(JobExecution jobExecution){
    if (jobExecution.getStatus() == BatchStatus.COMPLETED ) {
        //job success
    }
    else if (jobExecution.getStatus() == BatchStatus.FAILED) {
        //job failure
    }
}

与此接口对应的注解是:spring-doc.cadn.net.cn

从父作业继承

如果一组 Job 具有相似但不相似的 相同的配置,则定义 “parent” 可能会有所帮助Job从中得到混凝土Job实例可以继承属性。与 class 相似 继承,一个 “child”Job结合 它的元素和属性与父级的 Elements 和 Attributes 一起使用。spring-doc.cadn.net.cn

在以下示例中,baseJob是一个抽象Job定义,仅定义 听众。这Job (job1) 是具体的 继承侦听器列表的定义baseJob和合并 it 使用自己的侦听器列表来生成Job具有 2 个侦听器和 1 个Step (step1).spring-doc.cadn.net.cn

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

请参阅 从父步骤继承 有关更多详细信息的部分。spring-doc.cadn.net.cn

JobParametersValidator (作业参数验证器)

在 XML 命名空间中声明的作业或使用AbstractJob可以选择性地为 Job 参数声明一个验证器 运行。例如,当您需要断言作业 启动时,使用其所有必需参数。有一个DefaultJobParametersValidator可用于约束组合 简单的强制和可选参数。对于更复杂的 constraints,您可以自行实现接口。spring-doc.cadn.net.cn

验证器的配置通过 Java 构建器支持:spring-doc.cadn.net.cn

@Bean
public Job job1(JobRepository jobRepository) {
    return new JobBuilder("job1", jobRepository)
                     .validator(parametersValidator())
                     ...
                     .build();
}

验证器的配置是通过 XML 命名空间通过子 元素,如下例所示:spring-doc.cadn.net.cn

<job id="job1" parent="baseJob3">
    <step id="step1" parent="standaloneStep"/>
    <validator ref="parametersValidator"/>
</job>

您可以将验证器指定为引用(如前所述)或嵌套 Bean 定义在beansNamespace。spring-doc.cadn.net.cn