4. 批量
本节更详细地介绍了 Spring Cloud Task 与 Spring 的集成 批。跟踪任务执行与其所在任务之间的关联 通过 Spring Cloud Deployer 执行和远程分区包含在 本节。
4.1. 将任务执行与执行任务相关联
Spring Boot 提供了在 über-jar 中执行批处理作业的工具。 Spring Boot 对此功能的支持允许开发人员执行多个批处理作业 在该执行中。Spring Cloud Task 提供了关联执行 任务执行(任务执行)的 Job,以便可以追溯到 其他。
Spring Cloud Task 通过使用 .
默认情况下,
此侦听器在同时具有 Spring Batch Job 的任何上下文中自动配置
配置(通过在上下文中定义 Bean 类型)和 Classpath 上的 jar。侦听器被注入到所有作业中
满足这些条件。TaskBatchExecutionListener
Job
spring-cloud-task-batch
4.1.1. 覆盖 TaskBatchExecutionListener
为了防止侦听器被注入到当前 context,您可以使用标准 Spring Boot 机制禁用自动配置。
要仅将侦听器注入到上下文中的特定作业中,请覆盖 并提供作业 bean ID 的列表,如下所示
在以下示例中:batchTaskExecutionListenerBeanPostProcessor
public TaskBatchExecutionListenerBeanPostProcessor batchTaskExecutionListenerBeanPostProcessor() {
TaskBatchExecutionListenerBeanPostProcessor postProcessor =
new TaskBatchExecutionListenerBeanPostProcessor();
postProcessor.setJobNames(Arrays.asList(new String[] {"job1", "job2"}));
return postProcessor;
}
您可以在 Spring Cloud 的 samples 模块中找到示例批处理应用程序 Task Project,请点击这里。 |
4.2. 远程分区
Spring Cloud Deployer 提供了在
大多数云基础设施。和 将 worker 步骤执行的启动委托给 Spring
云部署程序。DeployerPartitionHandler
DeployerStepExecutionHandler
要配置 ,必须提供表示要执行的 Spring Boot über-jar、a 和 a 。您可以配置任何环境属性以及
worker 中,轮询结果的间隔(默认为 10
秒)和 timeout (默认为 -1 或无 timeout)。以下示例显示了如何操作
配置此项可能如下所示:DeployerStepExecutionHandler
Resource
TaskLauncher
JobExplorer
PartitionHandler
@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。 设置最大工作线程数可建立最大 应该一次运行的分区。
要执行的 this 应是一个 Spring Boot über-jar,并在当前上下文中配置为 a 。
前面示例中列举的存储库应该是
über-jar 所在的位置。经理和工作人员都应该具有可见性
添加到用作作业存储库和任务存储库的同一数据存储中。一旦
底层基础设施已经引导了 Spring Boot jar,而 Spring Boot 已经
启动了 ,步骤处理程序将执行请求的 .以下示例显示如何配置 :Resource
DeployerStepExecutionHandler
CommandLineRunner
DeployerStepExecutionHandler
Step
DeployerStepExecutionHandler
@Bean
public DeployerStepExecutionHandler stepExecutionHandler(JobExplorer jobExplorer) {
DeployerStepExecutionHandler handler =
new DeployerStepExecutionHandler(this.context, jobExplorer, this.jobRepository);
return handler;
}
您可以在 Spring Cloud Task 项目。 |
4.2.1. 为 Kubernetes 平台开发 Batch 分区应用程序的注意事项
-
在 Kubernetes 平台上部署分区应用时,您必须使用以下 Spring Cloud Kubernetes Deployer 的依赖项:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-deployer-kubernetes</artifactId> </dependency>
-
任务应用程序及其分区的应用程序名称需要遵循 以下正则表达式模式:. 否则,将引发异常。
[a-z0-9]([-a-z0-9]*[a-z0-9])
4.2.2. 为 Cloud Foundry Platform 开发批量分区应用程序的注意事项
-
在 Cloud Foundry 平台上部署分区应用程序时,您必须使用 Spring Cloud Foundry Deployer 的以下依赖项:
<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 Deployment 需要建立环境变量,以便 Partition 处理程序 可以启动分区。以下列表显示了所需的环境 变量:
-
spring_cloud_deployer_cloudfoundry_url
-
spring_cloud_deployer_cloudfoundry_org
-
spring_cloud_deployer_cloudfoundry_space
-
spring_cloud_deployer_cloudfoundry_domain
-
spring_cloud_deployer_cloudfoundry_username
-
spring_cloud_deployer_cloudfoundry_password
-
spring_cloud_deployer_cloudfoundry_services
-
spring_cloud_deployer_cloudfoundry_taskTimeout
-
分区任务的部署环境变量集示例,其中
使用数据库服务可能类似于以下内容:mysql
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
|
4.3. 批量信息性消息
Spring Cloud Task 为批处理作业提供了发出信息性消息的能力。这 “ Spring Batch 事件”部分详细介绍了此功能。
4.4. 批处理作业退出代码
如前所述, Spring Cloud 任务
应用程序支持记录任务执行的退出代码的功能。然而,在
在任务中运行 Spring Batch Job 的情况,无论 Batch Job 如何
执行完成,则使用默认
批处理/引导行为。请记住,任务是启动应用程序,并且退出代码
从任务返回的 API 与 Boot 应用程序相同。
要覆盖此行为并允许任务在
批处理作业返回 BatchStatus ,设置为 。然后退出代码
可以是 1(默认值)或基于指定的 ExitCodeGenerator
FAILED
spring.cloud.task.batch.fail-on-job-failure
true
)
此功能使用一个新的 new 来替换 Spring 提供的
靴子。默认情况下,它使用相同的顺序进行配置。但是,如果您想自定义
的运行顺序,您可以通过设置属性来设置其顺序。要让您的任务返回
退出代码,您需要编写自己的 .CommandLineRunner
CommandLineRunner
spring.cloud.task.batch.commandLineRunnerOrder
CommandLineRunner