我使用 Spring Cloud Data Flow 和 Spring Cloud Task 成功部署了远程分区作业;安装是基于Kubernetes的,所以我在项目中加入了Spring Cloud Deployer的Kubernetes实现。
但似乎不可能将值从工作人员的步骤执行上下文传播到作业执行上下文。
worker tasklet 将一些数据写入步骤执行上下文,成功保存在“BATCH_STEP_EXECUTION_CONTEXT”表中:
@Bean
public Tasklet workerTasklet() {
return new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
ExecutionContext executionContext = chunkContext.getStepContext()
.getStepExecution()
.getExecutionContext();
Integer partitionNumber = executionContext.getInt("partitionNumber");
System.out.println("This tasklet ran partition UPD1: " + partitionNumber);
executionContext.put(RESULT_PREFIX+partitionNumber, "myResult "+partitionNumber);
return RepeatStatus.FINISHED;
}
};
}
在 Step 构建过程中添加了一个ExecutionPromotionListener :
@Bean
public StepExecutionListener promotionListener() {
ExecutionContextPromotionListener listener = new
ExecutionContextPromotionListener();
listener.setKeys(new String[] {"result0","result1","result2","result3"});
return listener;
}
@Bean
public Step workerStep() {
return this.stepBuilderFactory.get("workerStep")
.tasklet(workerTasklet())
.listener(promotionListener())
.build();
}
作业成功完成,作业被正确分区并由 4 个 Kubernetes pod 执行:
但是 BATCH_JOB_EXECUTION_CONTEXT 表中不存在预期值。
Conversley,步骤执行上下文传播适用于非云环境中的分区作业,例如使用TaskExecutorPartitionHandler。