分离分开,异步执行。之前都是在一个线程中去执行。 Split可以并发的执行多个Flow或Step
asynchronously
package cn.tedu.boot41.config;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.job.builder.FlowBuilder;
import org.springframework.batch.core.job.flow.Flow;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
/**
* jobSplit异步。
*/
@Configuration
@EnableBatchProcessing
public class JobSplitDemo {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Flow jobSplitFlow1() {
return new FlowBuilder<Flow>("jobSplitFlow1")
.start(stepBuilderFactory.get("jobSplitStep1")
.tasklet(tasklet()).build()).build();
}
public Flow jobSplitFlow2() {
return new FlowBuilder<Flow>("jobSplitFlow2")
.start(stepBuilderFactory.get("jobSplitStep2").tasklet(tasklet()).build())
.next(stepBuilderFactory.get("jobSplitStep3").tasklet(tasklet()).build())
.build();
}
private Tasklet tasklet() {
return new PrintTasklet();
}
private class PrintTasklet implements Tasklet {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println(String.format("%s has been executed on thread %s",
chunkContext.getStepContext().getStepName()
, Thread.currentThread().getName()));
return RepeatStatus.FINISHED;
}
}
@Bean
public Job splitJob (){
return jobBuilderFactory.get("splitJob")
.start(jobSplitFlow1())
// 用一个简单的异步处理器
.split(new SimpleAsyncTaskExecutor()).add(jobSplitFlow2())
.end()
.build();
}
}
读写的情况就不太适合,与状态无关的。