Batch

本节将详细介绍 Spring Cloud Task 与 Spring 的集成 批。 跟踪作业执行与任务之间的关联执行以及通过 Spring Cloud Deployer 进行远程分区,均在本节中介绍。spring-doc.cadn.net.cn

9. 将作业执行与执行作业的任务相关联

Spring Boot 提供了在 über-jar 中执行批处理作业的工具。Spring Boot 对此功能的支持允许开发人员执行多个批处理作业在该执行中。Spring Cloud Task 提供了将执行的执行(作业执行)与任务的执行相关联的能力,以便可以追溯到 其他。spring-doc.cadn.net.cn

Spring Cloud Task 通过使用TaskBatchExecutionListener. 默认情况下,此侦听器在任何同时具有 Spring Batch 作业配置的上下文中自动配置(通过具有类型为Job定义在上下文中)和spring-cloud-task-batchjar 在类路径上。侦听器被注入到所有满足这些条件的作业中。spring-doc.cadn.net.cn

9.1. 重写 TaskBatchExecutionListener

要防止侦听器被注入到当前上下文中的任何批处理作业中,您可以使用标准 Spring Boot 机制禁用自动配置。spring-doc.cadn.net.cn

要仅将侦听器注入上下文中的特定作业,请覆盖batchTaskExecutionListenerBeanPostProcessor并提供作业 Bean ID 列表,如以下示例中所示:在以下示例中:spring-doc.cadn.net.cn

public TaskBatchExecutionListenerBeanPostProcessor batchTaskExecutionListenerBeanPostProcessor() {
    TaskBatchExecutionListenerBeanPostProcessor postProcessor =
        new TaskBatchExecutionListenerBeanPostProcessor();

    postProcessor.setJobNames(Arrays.asList(new String[] {"job1", "job2"}));

    return postProcessor;
}
您可以在 Spring Cloud 的示例模块中找到示例批处理应用程序任务项目,在这里

10. 远程分区

Spring Cloud Deployer 提供了用于启动基于 Spring Boot 的应用程序的工具大多数云基础设施。 这DeployerPartitionHandlerDeployerStepExecutionHandler将工作器步骤执行的启动委托给 SpringCloud Deployer。spring-doc.cadn.net.cn

要配置DeployerStepExecutionHandler,您必须提供Resource表示要执行的 Spring Boot über-jar,一个TaskLauncher和一个JobExplorer. 您可以配置任何环境属性以及最大数量要同时执行的工作人员、轮询结果的时间间隔(默认为 10秒)和超时(默认为 -1 或无超时)。以下示例演示如何配置此PartitionHandler可能看起来:spring-doc.cadn.net.cn

@Bean
public PartitionHandler partitionHandler(TaskLauncher taskLauncher,
        JobExplorer jobExplorer) throws Exception {

    MavenProperties mavenProperties = new MavenProperties();
    mavenProperties.setRemoteRepositories(new HashMap<>(Collections.singletonMap("springRepo",
        new MavenProperties.RemoteRepository(repository))));

    Resource resource =
        MavenResource.parse(String.format("%s:%s:%s",
                "io.spring.cloud",
                "partitioned-batch-job",
                "1.1.0.RELEASE"), mavenProperties);

    DeployerPartitionHandler partitionHandler =
        new DeployerPartitionHandler(taskLauncher, jobExplorer, resource, "workerStep");

    List<String> commandLineArgs = new ArrayList<>(3);
    commandLineArgs.add("--spring.profiles.active=worker");
    commandLineArgs.add("--spring.cloud.task.initialize.enable=false");
    commandLineArgs.add("--spring.batch.initializer.enabled=false");

    partitionHandler.setCommandLineArgsProvider(
        new PassThroughCommandLineArgsProvider(commandLineArgs));
    partitionHandler.setEnvironmentVariablesProvider(new NoOpEnvironmentVariablesProvider());
    partitionHandler.setMaxWorkers(2);
    partitionHandler.setApplicationName("PartitionedBatchJobTask");

    return partitionHandler;
}
将环境变量传递给分区时,每个分区可能位于具有不同环境设置的不同机器上。因此,您应该只传递那些需要的环境变量。

请注意,在上面的示例中,我们将最大工作线程数设置为 2。设置最大工作线程数可确定应同时运行的最大分区数量。spring-doc.cadn.net.cn

Resource被执行的 Spring Boot über-jar 应具有DeployerStepExecutionHandler配置为CommandLineRunner在当前上下文中。前面示例中枚举的存储库应该是über-jar 所在的远程存储库。管理器和工作程序都应具有可见性进入用作作业存储库和任务存储库的同一数据存储。一旦底层基础设施已引导 Spring Boot jar,并且 Spring Boot 已启动了DeployerStepExecutionHandler,步骤处理程序执行请求的Step. 以下示例显示如何配置DeployerStepExecutionHandler:spring-doc.cadn.net.cn

@Bean
public DeployerStepExecutionHandler stepExecutionHandler(JobExplorer jobExplorer) {
    DeployerStepExecutionHandler handler =
        new DeployerStepExecutionHandler(this.context, jobExplorer, this.jobRepository);

    return handler;
}
您可以在Spring Cloud Task 项目的 samples 模块中找到示例远程分区应用程序,在这里

10.1. 关于为 Kubernetes 平台开发批量分区应用程序的注意事项

  • 在 Kubernetes 平台上部署分区应用程序时,必须使用以下依赖项:spring-doc.cadn.net.cn

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-deployer-kubernetes</artifactId>
    </dependency>
  • 任务应用程序及其分区的应用程序名称需要遵循以下正则表达式模式:[a-z0-9]([-a-z0-9]*[a-z0-9]). 否则,将引发异常。spring-doc.cadn.net.cn

10.2. 关于为 Cloud Foundry 平台开发批量分区应用程序的注意事项

  • 在 Cloud Foundry 平台上部署分区应用程序时,您必须使用 Spring Cloud Foundry Deployer 的以下依赖项:spring-doc.cadn.net.cn

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-deployer-cloudfoundry</artifactId>
    </dependency>
    <dependency>
        <groupId>io.projectreactor</groupId>
        <artifactId>reactor-core</artifactId>
        <version>3.1.5.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.projectreactor.ipc</groupId>
        <artifactId>reactor-netty</artifactId>
        <version>0.7.5.RELEASE</version>
    </dependency>
  • 配置分区处理程序时,Cloud Foundry 部署 需要建立环境变量,以便分区处理程序 可以启动分区。以下列表显示了所需的环境 变量:spring-doc.cadn.net.cn

分区任务的部署环境变量集示例,其中 使用mysql数据库服务可能类似于以下内容:spring-doc.cadn.net.cn

spring_cloud_deployer_cloudfoundry_url=https://api.local.pcfdev.io
spring_cloud_deployer_cloudfoundry_org=pcfdev-org
spring_cloud_deployer_cloudfoundry_space=pcfdev-space
spring_cloud_deployer_cloudfoundry_domain=local.pcfdev.io
spring_cloud_deployer_cloudfoundry_username=admin
spring_cloud_deployer_cloudfoundry_password=admin
spring_cloud_deployer_cloudfoundry_services=mysql
spring_cloud_deployer_cloudfoundry_taskTimeout=300
使用 PCF-Dev 时,还需要以下环境变量:spring_cloud_deployer_cloudfoundry_skipSslValidation=true

11. 批量信息性消息

Spring Cloud Task 为批处理作业提供了发出信息性消息的能力。这 “Spring Batch Events”部分详细介绍了此功能。spring-doc.cadn.net.cn

12. 批处理作业退出代码

前所述,Spring Cloud 任务 应用程序支持记录任务执行的退出代码的功能。但是,在 在任务中运行 Spring Batch Job 的情况,无论 Batch Job 如何 执行完成,使用默认值时任务结果始终为零 批处理/启动行为。请记住,任务是启动应用程序,并且退出代码 从任务返回的应用程序与启动应用程序相同。 重写此行为并允许任务在 批处理作业返回 BatchStatusFAILED设置spring.cloud.task.batch.fail-on-job-failuretrue.然后是退出代码 可以是 1(默认值)或基于指定ExitCodeGenerator)spring-doc.cadn.net.cn

此功能使用新的CommandLineRunner取代 Spring 提供的那个 靴子。默认情况下,它配置为相同的顺序。但是,如果您想自定义 的顺序CommandLineRunner运行时,您可以通过设置spring.cloud.task.batch.commandLineRunnerOrder财产。要让您的任务返回 根据批处理作业执行的结果退出代码,需要编写自己的CommandLineRunner.spring-doc.cadn.net.cn