Spring Batch入门
This commit is contained in:
parent
05b411ba68
commit
82c9fc3832
|
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>2.2.5.RELEASE</version>
|
||||
<relativePath/> <!-- lookup parent from repository -->
|
||||
</parent>
|
||||
<groupId>cc.mrbird</groupId>
|
||||
<artifactId>spring-batch-start</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<name>spring-batch-start</name>
|
||||
<description>Demo project for Spring Boot</description>
|
||||
|
||||
<properties>
|
||||
<java.version>1.8</java.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-batch</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>mysql</groupId>
|
||||
<artifactId>mysql-connector-java</artifactId>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-jdbc</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
package cc.mrbird.batch;
|
||||
|
||||
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableBatchProcessing
|
||||
public class SpringBatchStartApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SpringBatchStartApplication.class, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
package cc.mrbird.batch.decider;
|
||||
|
||||
import org.springframework.batch.core.JobExecution;
|
||||
import org.springframework.batch.core.StepExecution;
|
||||
import org.springframework.batch.core.job.flow.FlowExecutionStatus;
|
||||
import org.springframework.batch.core.job.flow.JobExecutionDecider;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.time.DayOfWeek;
|
||||
import java.time.LocalDate;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class MyDecider implements JobExecutionDecider {
|
||||
@Override
|
||||
public FlowExecutionStatus decide(JobExecution jobExecution, StepExecution stepExecution) {
|
||||
LocalDate now = LocalDate.now();
|
||||
DayOfWeek dayOfWeek = now.getDayOfWeek();
|
||||
|
||||
if (dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY) {
|
||||
return new FlowExecutionStatus("weekend");
|
||||
} else {
|
||||
return new FlowExecutionStatus("workingDay");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
package cc.mrbird.batch.job;
|
||||
|
||||
import cc.mrbird.batch.decider.MyDecider;
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
|
||||
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
|
||||
import org.springframework.batch.repeat.RepeatStatus;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class DeciderJobDemo {
|
||||
@Autowired
|
||||
private JobBuilderFactory jobBuilderFactory;
|
||||
@Autowired
|
||||
private StepBuilderFactory stepBuilderFactory;
|
||||
@Autowired
|
||||
private MyDecider myDecider;
|
||||
|
||||
@Bean
|
||||
public Job deciderJob() {
|
||||
return jobBuilderFactory.get("deciderJob")
|
||||
.start(step1())
|
||||
.next(myDecider)
|
||||
.from(myDecider).on("weekend").to(step2())
|
||||
.from(myDecider).on("workingDay").to(step3())
|
||||
.from(step3()).on("*").to(step4())
|
||||
.end()
|
||||
.build();
|
||||
}
|
||||
|
||||
private Step step1() {
|
||||
return stepBuilderFactory.get("step1")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤一操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step2() {
|
||||
return stepBuilderFactory.get("step2")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤二操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step3() {
|
||||
return stepBuilderFactory.get("step3")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤三操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
|
||||
private Step step4() {
|
||||
return stepBuilderFactory.get("step4")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤四操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
package cc.mrbird.batch.job;
|
||||
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
|
||||
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
|
||||
import org.springframework.batch.repeat.RepeatStatus;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class FirstJobDemo {
|
||||
|
||||
@Autowired
|
||||
private JobBuilderFactory jobBuilderFactory;
|
||||
@Autowired
|
||||
private StepBuilderFactory stepBuilderFactory;
|
||||
|
||||
@Bean
|
||||
public Job firstJob() {
|
||||
return jobBuilderFactory.get("firstJob")
|
||||
.start(step())
|
||||
.build();
|
||||
}
|
||||
|
||||
private Step step() {
|
||||
return stepBuilderFactory.get("step")
|
||||
.tasklet((contribution, chunkContext) -> {
|
||||
System.out.println("执行步骤....");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,66 @@
|
|||
package cc.mrbird.batch.job;
|
||||
|
||||
import org.springframework.batch.core.ExitStatus;
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
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.repeat.RepeatStatus;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class FlowJobDemo {
|
||||
|
||||
@Autowired
|
||||
private JobBuilderFactory jobBuilderFactory;
|
||||
@Autowired
|
||||
private StepBuilderFactory stepBuilderFactory;
|
||||
|
||||
@Bean
|
||||
public Job flowJob() {
|
||||
return jobBuilderFactory.get("flowJob")
|
||||
.start(flow())
|
||||
.next(step3())
|
||||
.end()
|
||||
.build();
|
||||
}
|
||||
|
||||
private Step step1() {
|
||||
return stepBuilderFactory.get("step1")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤一操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step2() {
|
||||
return stepBuilderFactory.get("step2")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤二操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step3() {
|
||||
return stepBuilderFactory.get("step3")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤三操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
// 创建一个flow对象,包含若干个step
|
||||
private Flow flow() {
|
||||
return new FlowBuilder<Flow>("flow")
|
||||
.start(step1())
|
||||
.next(step2())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,63 @@
|
|||
package cc.mrbird.batch.job;
|
||||
|
||||
import org.springframework.batch.core.ExitStatus;
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
|
||||
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
|
||||
import org.springframework.batch.repeat.RepeatStatus;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class MultiStepJobDemo {
|
||||
|
||||
@Autowired
|
||||
private JobBuilderFactory jobBuilderFactory;
|
||||
@Autowired
|
||||
private StepBuilderFactory stepBuilderFactory;
|
||||
|
||||
@Bean
|
||||
public Job multiStepJob() {
|
||||
// return jobBuilderFactory.get("multiStepJob")
|
||||
// .start(step1())
|
||||
// .next(step2())
|
||||
// .next(step3())
|
||||
// .build();
|
||||
return jobBuilderFactory.get("multiStepJob2")
|
||||
.start(step1())
|
||||
.on(ExitStatus.COMPLETED.getExitCode()).to(step2())
|
||||
.from(step2())
|
||||
.on(ExitStatus.COMPLETED.getExitCode()).to(step3())
|
||||
.from(step3()).end()
|
||||
.build();
|
||||
}
|
||||
|
||||
private Step step1() {
|
||||
return stepBuilderFactory.get("step1")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤一操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step2() {
|
||||
return stepBuilderFactory.get("step2")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤二操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step3() {
|
||||
return stepBuilderFactory.get("step3")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤三操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
package cc.mrbird.batch.job;
|
||||
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
|
||||
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
|
||||
import org.springframework.batch.core.launch.JobLauncher;
|
||||
import org.springframework.batch.core.repository.JobRepository;
|
||||
import org.springframework.batch.core.step.builder.JobStepBuilder;
|
||||
import org.springframework.batch.core.step.builder.StepBuilder;
|
||||
import org.springframework.batch.repeat.RepeatStatus;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.transaction.PlatformTransactionManager;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class NestedJobDemo {
|
||||
|
||||
@Autowired
|
||||
private JobBuilderFactory jobBuilderFactory;
|
||||
@Autowired
|
||||
private StepBuilderFactory stepBuilderFactory;
|
||||
@Autowired
|
||||
private JobLauncher jobLauncher;
|
||||
@Autowired
|
||||
private JobRepository jobRepository;
|
||||
@Autowired
|
||||
private PlatformTransactionManager platformTransactionManager;
|
||||
|
||||
// 父任务
|
||||
@Bean
|
||||
public Job parentJob() {
|
||||
return jobBuilderFactory.get("parentJob")
|
||||
.start(childJobOneStep())
|
||||
.next(childJobTwoStep())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
// 将任务转换为特殊的步骤
|
||||
private Step childJobOneStep() {
|
||||
return new JobStepBuilder(new StepBuilder("childJobOneStep"))
|
||||
.job(childJobOne())
|
||||
.launcher(jobLauncher)
|
||||
.repository(jobRepository)
|
||||
.transactionManager(platformTransactionManager)
|
||||
.build();
|
||||
}
|
||||
|
||||
// 将任务转换为特殊的步骤
|
||||
private Step childJobTwoStep() {
|
||||
return new JobStepBuilder(new StepBuilder("childJobTwoStep"))
|
||||
.job(childJobTwo())
|
||||
.launcher(jobLauncher)
|
||||
.repository(jobRepository)
|
||||
.transactionManager(platformTransactionManager)
|
||||
.build();
|
||||
}
|
||||
|
||||
// 子任务一
|
||||
private Job childJobOne() {
|
||||
return jobBuilderFactory.get("childJobOne")
|
||||
.start(
|
||||
stepBuilderFactory.get("childJobOneStep")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("子任务一执行步骤。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build()
|
||||
).build();
|
||||
}
|
||||
|
||||
// 子任务二
|
||||
private Job childJobTwo() {
|
||||
return jobBuilderFactory.get("childJobTwo")
|
||||
.start(
|
||||
stepBuilderFactory.get("childJobTwoStep")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("子任务二执行步骤。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build()
|
||||
).build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,72 @@
|
|||
package cc.mrbird.batch.job;
|
||||
|
||||
import org.springframework.batch.core.Job;
|
||||
import org.springframework.batch.core.Step;
|
||||
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.repeat.RepeatStatus;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.core.task.SimpleAsyncTaskExecutor;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @author MrBird
|
||||
*/
|
||||
@Component
|
||||
public class SplitJobDemo {
|
||||
|
||||
@Autowired
|
||||
private JobBuilderFactory jobBuilderFactory;
|
||||
@Autowired
|
||||
private StepBuilderFactory stepBuilderFactory;
|
||||
|
||||
@Bean
|
||||
public Job splitJob() {
|
||||
return jobBuilderFactory.get("splitJob")
|
||||
.start(flow1())
|
||||
.split(new SimpleAsyncTaskExecutor()).add(flow2())
|
||||
.end()
|
||||
.build();
|
||||
|
||||
}
|
||||
|
||||
private Step step1() {
|
||||
return stepBuilderFactory.get("step1")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤一操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step2() {
|
||||
return stepBuilderFactory.get("step2")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤二操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Step step3() {
|
||||
return stepBuilderFactory.get("step3")
|
||||
.tasklet((stepContribution, chunkContext) -> {
|
||||
System.out.println("执行步骤三操作。。。");
|
||||
return RepeatStatus.FINISHED;
|
||||
}).build();
|
||||
}
|
||||
|
||||
private Flow flow1() {
|
||||
return new FlowBuilder<Flow>("flow1")
|
||||
.start(step1())
|
||||
.next(step2())
|
||||
.build();
|
||||
}
|
||||
|
||||
private Flow flow2() {
|
||||
return new FlowBuilder<Flow>("flow2")
|
||||
.start(step3())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
spring:
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://127.0.0.1:3306/springbatch
|
||||
username: root
|
||||
password: 123456
|
||||
Loading…
Reference in New Issue