如何将一个简单的字符串传递给Spring批处理作业
问题描述:
我有一个复杂的作业流程,其中有3个独立的作业构建到JobStep中,然后从作业调用JobStep。这些JobSteps中将有四个将从调用作业并行运行。如何将一个简单的字符串传递给Spring批处理作业
我需要将一个字符串作为参数传递给它们。
一定程度的简化代码:
我主要如下所示:
public static void main(String[] args) {
SpringApplication.run(SomeApplication.class, args);
}
其中JobSteps的样子
@Bean
public JobStep jobStep1(<snip>){
<snip for clarity>
JobStep jobStep = new JobStep() ;
jobStep.setJob(jobs.get(jobName)
.incrementer(new RunIdIncrementer()).listener(listener)
.start(Flow1)
.next(Flow2)
.next(Flow3)
.end().build());
jobStep.setJobRepository(jobRepository);
jobStep.setJobLauncher(jobLauncher);
return jobStep;
}
运行,其余看起来像
的最高职位@Bean
public Job parentJob(<snip>) {
Flow childJobFlow = new FlowBuilder<SimpleFlow>("childJob").start(job1).build();
Flow childJobFlow2 = new FlowBuilder<SimpleFlow>("childJob2").start(job2).build();
FlowBuilder<SimpleFlow> builder = new FlowBuilder<SimpleFlow>("jobFlow");
Flow jobFLow = builder.split(new SimpleAsyncTaskExecutor()).add(childJobFlow,childJobFlow2).build();
return jobs.get("parentJob")
.incrementer(new RunIdIncrementer()).listener(listener)
.start(jobFLow)
.end().build();
}
我需要每个JobStep来获得不同的字符串。
答
我能够完成Nghia Do使用分区程序在他的评论中提出的建议。通过分区程序,我可以将字符串推送到上下文,然后在@Before Step中检索它。
在我ItemReader我:
@BeforeStep
public void beforeStep(StepExecution stepExecution) throws Exception {
this.stepExecution = stepExecution.getExecutionContext();
this.keyString = stepExecution.getString("keyString");
}
的Paritioner
@Override
public Map<String, ExecutionContext> partition(int gridSize) {
Map<String, ExecutionContext> partitionMap = new HashMap<String, ExecutionContext>();
List<String> codes = getCodes();
for (String code : codes)
{
ExecutionContext context = new ExecutionContext();
context.put("keyString", code);
partitionMap.put(code, context);
}
return partitionMap;
}
getCodes只是一个占位符的功能,现在是返回测试字符串列表。最终它将取代更有用的东西。
private List<String> getCodes() {
ArrayList<String> result = new ArrayList<String>();
result.add("One");
result.add("Two");
result.add("Three");
result.add("Four");
result.add("Five");
result.add("Six");
result.add("Seven");
return result;
}
然后让我不得不做出一个主一步,叫我现有的步骤步骤:
@Bean
public Step masterStep(@Value("#{proccessFilesStep}") Step readFilesStep) {
return stepBuilders.get("masterStep")
.partitioner(readFilesStep)
.partitioner("proccessFilesStep", partitioner())
.taskExecutor(taskExecutor())
.build();
}
而且stepBuilders是:
@Autowired
private StepBuilderFactory stepBuilders;
不得不像20个不同的例子上合并获得所有peices的网络,所以我将它们全部放在下一个需要它的人的答案中。
请看看Partitioner。您可以使用它将数据传递给Step –