spring batch
2020-04-27 本文已影响0人
刘小刀tina
1. job对象 满足条件判断的方执行step
@Configuration
@EnableBatchProcessing
public class JobDemo {
@Autowired
private JobBuilderFactory jobBuilderFactory ;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job jobDemoJob(){
// return jobBuilderFactory.get("jobDemoJob")
// .start(jobDemoStep1())
// .next(jobDemoStep2())
// .next(jobDemoStep3())
// .build();
/**
* 满足条件判断的方执行step
*/
return jobBuilderFactory.get("jobDemoJob")
.start(jobDemoStep1())
.on("COMPLETED").to(jobDemoStep2())
.from(jobDemoStep2()).on("COMPLETED").to(jobDemoStep3())
.from(jobDemoStep3()).end()
.build();
}
@Bean
public Step jobDemoStep1() {
return stepBuilderFactory.get("jobDemoStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("第一个step名称为:jobDemoStep1");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step jobDemoStep2() {
return stepBuilderFactory.get("jobDemoStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("第一个step名称为:jobDemoStep2");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step jobDemoStep3() {
return stepBuilderFactory.get("jobDemoStep3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("第一个step名称为:jobDemoStep3");
return RepeatStatus.FINISHED;
}
}).build();
}
}
2. flow对象
/**
* @program: demo-spring-batch
* @description
* 创建flow对象,将 step步骤封装起来
* @author: tina.liu
* @create: 2020-04-27 16:33
**/
@Configuration
@EnableBatchProcessing
public class flow {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* 创建step对象
* @return
*/
@Bean
public Step step1(){
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤ste1");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step step2(){
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤step2");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step step3(){
return stepBuilderFactory.get("step3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤step3");
return RepeatStatus.FINISHED;
}
}).build();
}
/**
* 创建 Flow对象
* @return
*/
@Bean
public Flow flowDemo(){
return new FlowBuilder<Flow>("flowDemo")
.start(step1())
.next(step2())
.build();
}
@Bean
public Job flowDemoJob(){
return jobBuilderFactory.get("flowDemoJob")
.start(flowDemo())
.next(step3())
.end()
.build();
}
}
3. split 并发执行
@Configuration
@EnableBatchProcessing
public class SplitDemo {
@Autowired
private JobBuilderFactory jobBuilderFactory ;
@Autowired
private StepBuilderFactory stepBuilderFactory ;
/**
* 创建 3个step对象
*/
@Bean
public Step splitDemoStep1(){
return stepBuilderFactory.get("splitDemoStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("打印名字为:splitDemoStep1");
return null;
}
}).build();
}
@Bean
public Step splitDemoStep2(){
return stepBuilderFactory.get("splitDemoStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("打印名字为:splitDemoStep2");
return null;
}
}).build();
}
@Bean
public Step splitDemoStep3(){
return stepBuilderFactory.get("splitDemoStep3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("打印名字为:splitDemoStep3");
return null;
}
}).build();
}
/**
* 创建两个flow
*/
@Bean
public Flow splitDemoFlow1(){
return new FlowBuilder<Flow>("splitDemoFlow1")
.start(splitDemoStep1())
.build();
}
@Bean
public Flow splitDemoFlow2(){
return new FlowBuilder<Flow>("splitDemoFlow2")
.start(splitDemoStep2())
.next(splitDemoStep3())
.build();
}
/**
* 创建一个job对象
*/
@Bean
public Job splitDemoJob(){
return jobBuilderFactory.get("splitDemoJob")
.start(splitDemoFlow1())
.split(new SimpleAsyncTaskExecutor()).add(splitDemoFlow2())
.end()
.build();
}
}
4. decide 决策器
@Configuration
@EnableBatchProcessing
public class DeciderDemo {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
* 创建三个step
*/
@Bean
public Step deciderDemoStep1(){
return stepBuilderFactory.get("deciderDemoStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤deciderDemoStep1");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step deciderDemoStep2(){
return stepBuilderFactory.get("deciderDemoStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤deciderDemoStep2"+":even");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step deciderDemoStep3(){
return stepBuilderFactory.get("deciderDemoStep3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤deciderDemoStep3"+"odd");
return RepeatStatus.FINISHED;
}
}).build();
}
/**
* 创建一个决策器decider
*/
@Bean
public JobExecutionDecider deciderDemoDecider1(){
return new MyDecider();
}
@Bean
public Job deciderDemoJob1(){
return jobBuilderFactory.get("deciderDemoJob1")
.start(deciderDemoStep1())
.next(deciderDemoDecider1())
.from(deciderDemoDecider1()).on("even").to(deciderDemoStep2())
.from(deciderDemoDecider1()).on("odd").to(deciderDemoStep3())
.from(deciderDemoStep3()).on("*").to(deciderDemoDecider1())
.end()
.build();
}
}
//创建一个决策起MyDecider类
class MyDecider implements JobExecutionDecider {
private int count=1;
@Override
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
count++;
if( count%2 == 0){
return new FlowExecutionStatus("even") ;
}else {
return new FlowExecutionStatus("odd") ;
}
}
}
5. job 嵌套
ps 须在配置文件中指明父job
spring.batch.job.names=parentJobDemoJob
子job 1
@Configuration
@EnableBatchProcessing
public class ChildJob1 {
@Autowired
private JobBuilderFactory jobBuilderFactory ;
@Autowired
private StepBuilderFactory stepBuilderFactory ;
/**
*创建step
* @return
*/
@Bean
public Step childJob1Step1(){
return stepBuilderFactory.get("childJob1Step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤 -》childJob1Step1");
return RepeatStatus.FINISHED;
}
}).build();
}
/**
* 创建job
* @return
*/
@Bean(value = "childJob1Job")
public Job childJob1Job(){
return jobBuilderFactory.get("childJob1Job")
.start(childJob1Step1())
.build();
}
}
========================================================
子job 2
@EnableBatchProcessing
@Configuration
public class ChildJob2 {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
/**
*创建step
* @return
*/
@Bean
public Step childJob2Step1(){
return stepBuilderFactory.get("childJob2Step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤 -》childJob2Step1");
return RepeatStatus.FINISHED;
}
}).build();
}
/**
*创建step
* @return
*/
@Bean
public Step childJob2Step2(){
return stepBuilderFactory.get("childJob2Step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("步骤 -》childJob2Step2");
return RepeatStatus.FINISHED;
}
}).build();
}
/**
* 创建job
* @return
*/
@Bean(value = "childJob2Job")
public Job childJob2Job(){
return jobBuilderFactory.get("childJob2Job")
.start(childJob2Step1())
.next(childJob2Step2())
.build();
}
}
========================================================
父job
@Configuration
@EnableBatchProcessing
public class ParentJob
{
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
@Qualifier(value = "childJob1Job")
private Job childJob1Job; //子job1
@Autowired
@Qualifier(value = "childJob2Job")
private Job childJob2Job; //子job2
@Autowired
JobLauncher jobLauncher ; //job的启动器
/**
* 创建父job
* @param repository
* @param transactionManager
* @return
*/
@Bean
public Job parentJobDemoJob(JobRepository repository, PlatformTransactionManager transactionManager){
return jobBuilderFactory.get("parentJobDemoJob")
.start(childJob1ss(repository,transactionManager))
.next(childJob2ss(repository,transactionManager))
.build();
}
/**
* 将子Job 返回类型转变为step ,用到job启动器,事务管理器,和持久化
* @param repository
* @param transactionManager
* @return
*/
@Bean
public Step childJob2ss(JobRepository repository, PlatformTransactionManager transactionManager) {
return new JobStepBuilder(new StepBuilder("childJob2"))
.job((Job) childJob2Job)
.launcher(jobLauncher)
.repository(repository)
.transactionManager(transactionManager)
.build();
}
/**
* 将子Job 返回类型转变为step ,用到job启动器,事务管理器,和持久化
* @return
*/
@Bean
public Step childJob1ss(JobRepository repository, PlatformTransactionManager transactionManager) {
return new JobStepBuilder(new StepBuilder("childJob1"))
.job((Job) childJob1Job)
.launcher(jobLauncher)
.repository(repository)
.transactionManager(transactionManager)
.build();
}
}
========================================================