配置 Job

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

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

A(通常还包括其中的任何一个)需要一个 .这 的配置通过 Java 配置进行处理。JobStepJobRepositoryJobRepositoryspring-doc.cn

前面的示例说明了由三个实例组成的 a。工作相关 构建器还可以包含有助于并行化 () 的其他元素, 声明式流控制 (),以及流定义 () 的外部化。JobStepSplitDecisionFlowspring-doc.cn

Job 接口有多种实现。但是,命名空间抽象出了配置中的差异。它有 只有三个必需的依赖项:名称、 和实例列表。 以下示例创建一个 :JobRepositoryStepfootballJobspring-doc.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 命名空间 默认引用具有 of 的存储库,其中 是合理的默认值。但是,您可以显式覆盖此默认值:idjobRepositoryspring-doc.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.cn

可重启性

执行批处理作业时的一个关键问题涉及 重新 启动。如果特定 已存在 a,则启动 a 被视为“重新启动”。理想情况下,所有作业都应该能够启动 从他们离开的地方开始,但在某些情况下这是不可能的。在这种情况下,完全由开发人员来确保创建新的 JobInstance但是,Spring Batch 确实提供了一些帮助。如果 a 不应该是 重新启动,但应始终作为 new 的一部分运行,您可以设置 restartable 属性设置为 。JobJobJobExecutionJobInstanceJobJobInstancefalsespring-doc.cn

以下示例演示如何在 Java 中将字段设置为 :restartablefalsespring-doc.cn

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

以下示例演示如何在 XML 中将字段设置为 :restartablefalsespring-doc.cn

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

换句话说,设置为 to 意味着 “this does not support being started again”。重新启动 不是 restartable 会导致 被扔掉。 以下 Junit 代码会导致引发异常:restartablefalseJobJobJobRestartExceptionspring-doc.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
}

第一次尝试为 不可重启 job 不会引起任何问题。然而,第二个 attempt 会引发 .JobExecutionJobRestartExceptionspring-doc.cn

拦截任务执行

在执行 的过程中,通知各种 可能会很有用 事件,以便可以运行自定义代码。 通过在适当的时间调用 A 来允许此操作:JobSimpleJobJobListenerspring-doc.cn

public interface JobExecutionListener {

    void beforeJob(JobExecution jobExecution);

    void afterJob(JobExecution jobExecution);
}

您可以通过在作业上设置侦听器来添加到 。JobListenersSimpleJobspring-doc.cn

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

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

以下示例演示如何将侦听器元素添加到 XML 作业定义中:spring-doc.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>

请注意,无论成功还是 失败的 .如果需要确定成功或失败,可以获取该信息 从 :afterJobJobJobExecutionspring-doc.cn

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

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

从父作业继承

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

在下面的示例中,是一个抽象定义,它只定义了 听众。() 是具体的 继承侦听器列表并合并的定义 it 替换为自己的侦听器列表,以生成具有两个侦听器和一个 () 的 a。baseJobJobJobjob1baseJobJobStepstep1spring-doc.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.cn

JobParametersValidator (作业参数验证器)

在 XML 命名空间中声明的作业或使用 的任何子类可以选择为 运行。例如,当您需要断言作业 启动其所有必需参数。有一个 可用于约束组合 简单的强制和可选参数。对于更复杂的 constraints,您可以自行实现接口。AbstractJobDefaultJobParametersValidatorspring-doc.cn

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

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

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

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

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