运行作业

启动批处理作业至少需要两件事:Job要启动,并JobLauncher.两者都可以包含在同一个 上下文或不同的上下文。例如,如果您从 命令行,则为每个Job.因此,每个 工作有自己的JobLauncher.但是,如果 您从一个 Web 容器中运行,该容器位于HttpRequest,通常有一个JobLauncher(配置为异步作业 launching),多个请求调用以启动其作业。spring-doc.cadn.net.cn

从命令行运行作业

如果要从企业运行作业 调度程序,命令行是主接口。这是因为 大多数调度器(Quartz 除外,除非使用NativeJob)直接与作系统配合使用 进程,主要从 shell 脚本开始。有很多种方法。 启动 shell 脚本之外的 Java 进程,例如 Perl、Ruby 或 甚至构建工具,例如 Ant 或 Maven。然而,由于大多数人 熟悉 shell 脚本,本示例重点介绍它们。spring-doc.cadn.net.cn

The CommandLineJobRunner

因为启动作业的脚本必须启动一个 Java Virtual Machine,需要有一个类,其中main行动方法 作为主要入口点。Spring Batch 提供了一个实现 用于此目的:CommandLineJobRunner.注意 这只是引导应用程序的一种方法。有 启动 Java 进程的多种方式,而此类绝不应该是 被视为确定的。这CommandLineJobRunner执行四项任务:spring-doc.cadn.net.cn

所有这些任务都只需传入参数即可完成。 下表描述了所需的参数:spring-doc.cadn.net.cn

表 1.CommandLineJobRunner 参数

jobPathspring-doc.cadn.net.cn

用于 创建一个ApplicationContext.此文件 应包含运行完整Job.spring-doc.cadn.net.cn

jobNamespring-doc.cadn.net.cn

要运行的作业的名称。spring-doc.cadn.net.cn

必须传入这些参数,路径在前,名称在后。所有参数 这些被认为是作业参数后,将转换为JobParameters对象 并且必须采用name=value.spring-doc.cadn.net.cn

以下示例显示了作为作业参数传递给Java中定义的作业的日期:spring-doc.cadn.net.cn

<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay schedule.date=2007-05-05,java.time.LocalDate

以下示例显示了作为作业参数传递给 XML 中定义的作业的日期:spring-doc.cadn.net.cn

<bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay schedule.date=2007-05-05,java.time.LocalDate

默认情况下,CommandLineJobRunner使用DefaultJobParametersConverter隐式转换 键/值对来标识作业参数。但是,您可以显式指定 哪些作业参数是标识的,哪些不是通过后缀它们来识别的truefalse分别。spring-doc.cadn.net.cn

在以下示例中,schedule.date是标识作业参数,而vendor.id莫:spring-doc.cadn.net.cn

<bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay \
                                 schedule.date=2007-05-05,java.time.LocalDate,true \
                                 vendor.id=123,java.lang.Long,false
<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay \
                                 schedule.date=2007-05-05,java.time.LocalDate,true \
                                 vendor.id=123,java.lang.Long,false

您可以使用自定义JobParametersConverter.spring-doc.cadn.net.cn

在大多数情况下,您希望使用清单来声明您的main类在罐子里。然而 为简单起见,直接使用该类。此示例使用EndOfDayBatch 的领域语言中的示例。第一个 参数是io.spring.EndOfDayJobConfiguration,这是完全限定的类名 到包含作业的配置类。第二个参数endOfDay代表 作业名称。最后一个论点schedule.date=2007-05-05,java.time.LocalDate,被转换 变成一个JobParameter类型的对象java.time.LocalDate.spring-doc.cadn.net.cn

以下示例显示了endOfDay在 Java 中:spring-doc.cadn.net.cn

@Configuration
@EnableBatchProcessing
public class EndOfDayJobConfiguration {

    @Bean
    public Job endOfDay(JobRepository jobRepository, Step step1) {
        return new JobBuilder("endOfDay", jobRepository)
    				.start(step1)
    				.build();
    }

    @Bean
    public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
        return new StepBuilder("step1", jobRepository)
    				.tasklet((contribution, chunkContext) -> null, transactionManager)
    				.build();
    }
}

在大多数情况下,您希望使用清单来声明您的main类在罐子里。然而 为简单起见,直接使用该类。此示例使用EndOfDayBatch 的领域语言中的示例。第一个 参数是endOfDayJob.xml,这是包含Job.第二个参数endOfDay,表示作业名称。最后一个论点schedule.date=2007-05-05,java.time.LocalDate,被转换为JobParameter类型的对象java.time.LocalDate.spring-doc.cadn.net.cn

以下示例显示了endOfDay在 XML 中:spring-doc.cadn.net.cn

<job id="endOfDay">
    <step id="step1" parent="simpleStep" />
</job>

<!-- Launcher details removed for clarity -->
<beans:bean id="jobLauncher"
         class="org.springframework.batch.core.launch.support.TaskExecutorJobLauncher" />

前面的示例过于简单化,因为对 一般情况下,在 Spring Batch 中运行批处理作业,但它用于显示两个主要的 的要求CommandLineJobRunner:JobJobLauncher.spring-doc.cadn.net.cn

退出代码

从命令行启动批处理作业时,企业 经常使用调度程序。大多数调度程序都相当愚蠢,只能工作 在过程层面。这意味着他们只知道一些 作系统进程(例如它们调用的 shell 脚本)。 在这种情况下,与调度程序通信的唯一方法 关于作业的成功或失败是通过返回代码。一个 返回代码是进程返回给调度程序的数字 以指示运行结果。在最简单的情况下,0 是 成功,1 是失败。但是,可能还有更复杂的 方案,例如“如果作业 A 返回 4,则启动作业 B,如果返回 5,则启动 下班 C。这种类型的行为是在调度程序级别配置的, 但重要的是,像 Spring Batch 这样的处理框架 提供一种返回退出代码的数字表示形式的方法 对于特定的批处理作业。在 Spring Batch 中,这是封装的 在ExitStatus,其中涵盖了更多 详情见第 5 章。为了讨论退出代码,该 唯一需要知道的重要事情是ExitStatus具有 Exit Code 属性,该属性为 由框架(或开发人员)设置,并作为JobExecutionJobLauncher.这CommandLineJobRunner转换此字符串值 通过使用ExitCodeMapper接口:spring-doc.cadn.net.cn

public interface ExitCodeMapper {

    public int intValue(String exitCode);

}

基本契约ExitCodeMapper是,给定一个字符串出口 code,将返回一个数字表示。默认值 作业运行器使用的实现是SimpleJvmExitCodeMapper返回 0 表示完成,1 表示通用错误,2 表示任何作业 运行器错误,例如无法找到Job在提供的上下文中。如果还有的话 复杂度高于上述三个值,需要自定义 实现ExitCodeMapper接口 必须提供。因为CommandLineJobRunner是创建 一ApplicationContext因此,不可能 'wired together',任何需要覆盖的值都必须是 自动接线。这意味着,如果实现ExitCodeMapperBeanFactory, 在创建上下文后,它将注入到运行器中。都 需要这样做才能提供您自己的ExitCodeMapper是声明实现 作为根级 Bean,并确保它是ApplicationContext由 跑步者。spring-doc.cadn.net.cn

从 Web 容器内运行作业

从历史上看,脱机处理(例如批处理作业)一直是 如前所述,从命令行启动。但是,有 在许多情况下,从HttpRequest是 更好的选择。许多此类用例包括报告、临时作业 运行和 Web 应用程序支持。因为批处理作业(根据定义) 长期运行,最关心的是推出 异步作业:spring-doc.cadn.net.cn

来自 Web 容器的异步作业Starters序列
图 1.来自 Web 容器的异步作业Starters序列

本例中的控制器是 Spring MVC 控制器。请参阅 Spring Framework 参考指南,了解有关 Spring MVC 的更多信息。 控制器启动一个Job通过使用JobLauncher已配置为异步启动,该 立即返回一个JobExecution.这Job可能仍在运行。然而,这个 非阻塞行为允许控制器立即返回,这 在处理HttpRequest.以下列表 显示了一个示例:spring-doc.cadn.net.cn

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}