Skip to content

Commit 643b7d8

Browse files
committed
Spring Batch监听器
1 parent 93e149d commit 643b7d8

File tree

11 files changed

+374
-0
lines changed

11 files changed

+374
-0
lines changed

71.spring-batch-listener/pom.xml

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.2.5.RELEASE</version>
9+
<relativePath/> <!-- lookup parent from repository -->
10+
</parent>
11+
<groupId>cc.mrbird</groupId>
12+
<artifactId>spring-batch-listener</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<name>spring-batch-listener</name>
15+
<description>Demo project for Spring Boot</description>
16+
17+
<properties>
18+
<java.version>1.8</java.version>
19+
</properties>
20+
21+
<dependencies>
22+
<dependency>
23+
<groupId>org.springframework.boot</groupId>
24+
<artifactId>spring-boot-starter-batch</artifactId>
25+
</dependency>
26+
<dependency>
27+
<groupId>mysql</groupId>
28+
<artifactId>mysql-connector-java</artifactId>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.springframework.boot</groupId>
32+
<artifactId>spring-boot-starter-jdbc</artifactId>
33+
</dependency>
34+
</dependencies>
35+
36+
<build>
37+
<plugins>
38+
<plugin>
39+
<groupId>org.springframework.boot</groupId>
40+
<artifactId>spring-boot-maven-plugin</artifactId>
41+
</plugin>
42+
</plugins>
43+
</build>
44+
45+
</project>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package cc.mrbird.batch;
2+
3+
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
4+
import org.springframework.boot.SpringApplication;
5+
import org.springframework.boot.autoconfigure.SpringBootApplication;
6+
7+
@SpringBootApplication
8+
@EnableBatchProcessing
9+
public class SpringBatchListenerApplication {
10+
11+
public static void main(String[] args) {
12+
SpringApplication.run(SpringBatchListenerApplication.class, args);
13+
}
14+
15+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package cc.mrbird.batch.job;
2+
3+
import org.springframework.batch.core.Job;
4+
import org.springframework.batch.core.JobExecution;
5+
import org.springframework.batch.core.JobExecutionListener;
6+
import org.springframework.batch.core.Step;
7+
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
8+
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
9+
import org.springframework.batch.core.listener.CompositeJobExecutionListener;
10+
import org.springframework.batch.repeat.RepeatStatus;
11+
import org.springframework.beans.factory.annotation.Autowired;
12+
import org.springframework.context.annotation.Bean;
13+
import org.springframework.stereotype.Component;
14+
15+
import java.util.Arrays;
16+
17+
/**
18+
* @author MrBird
19+
*/
20+
@Component
21+
public class CompositeJobExecutionListenerJobDemo {
22+
23+
@Autowired
24+
private JobBuilderFactory jobBuilderFactory;
25+
@Autowired
26+
private StepBuilderFactory stepBuilderFactory;
27+
28+
@Bean
29+
public Job compositeJobExecutionListenerJob() {
30+
return jobBuilderFactory.get("compositeJobExecutionListenerJob")
31+
.start(step())
32+
.listener(compositeJobExecutionListener())
33+
.build();
34+
}
35+
36+
private Step step() {
37+
return stepBuilderFactory.get("step")
38+
.tasklet((contribution, chunkContext) -> {
39+
System.out.println("执行步骤....");
40+
return RepeatStatus.FINISHED;
41+
}).build();
42+
}
43+
44+
private CompositeJobExecutionListener compositeJobExecutionListener() {
45+
CompositeJobExecutionListener listener = new CompositeJobExecutionListener();
46+
47+
// 任务监听器1
48+
JobExecutionListener jobExecutionListenerOne = new JobExecutionListener() {
49+
@Override
50+
public void beforeJob(JobExecution jobExecution) {
51+
System.out.println("任务监听器One,before job execute: " + jobExecution.getJobInstance().getJobName());
52+
}
53+
54+
@Override
55+
public void afterJob(JobExecution jobExecution) {
56+
System.out.println("任务监听器One,after job execute: " + jobExecution.getJobInstance().getJobName());
57+
}
58+
};
59+
// 任务监听器2
60+
JobExecutionListener jobExecutionListenerTwo = new JobExecutionListener() {
61+
@Override
62+
public void beforeJob(JobExecution jobExecution) {
63+
System.out.println("任务监听器Two,before job execute: " + jobExecution.getJobInstance().getJobName());
64+
}
65+
66+
@Override
67+
public void afterJob(JobExecution jobExecution) {
68+
System.out.println("任务监听器Two,after job execute: " + jobExecution.getJobInstance().getJobName());
69+
}
70+
};
71+
// 聚合
72+
listener.setListeners(Arrays.asList(jobExecutionListenerOne, jobExecutionListenerTwo));
73+
return listener;
74+
}
75+
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package cc.mrbird.batch.job;
2+
3+
import cc.mrbird.batch.listener.*;
4+
import org.springframework.batch.core.Job;
5+
import org.springframework.batch.core.Step;
6+
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
7+
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
8+
import org.springframework.batch.item.*;
9+
import org.springframework.beans.factory.annotation.Autowired;
10+
import org.springframework.context.annotation.Bean;
11+
import org.springframework.stereotype.Component;
12+
13+
import java.util.Arrays;
14+
import java.util.Iterator;
15+
import java.util.List;
16+
17+
/**
18+
* @author MrBird
19+
*/
20+
@Component
21+
public class ListenerTestJobDemo {
22+
23+
@Autowired
24+
private JobBuilderFactory jobBuilderFactory;
25+
@Autowired
26+
private StepBuilderFactory stepBuilderFactory;
27+
@Autowired
28+
private MyJobExecutionListener myJobExecutionListener;
29+
@Autowired
30+
private MyStepExecutionListener myStepExecutionListener;
31+
@Autowired
32+
private MyChunkListener myChunkListener;
33+
@Autowired
34+
private MyItemReaderListener myItemReaderListener;
35+
@Autowired
36+
private MyItemProcessListener myItemProcessListener;
37+
@Autowired
38+
private MyItemWriterListener myItemWriterListener;
39+
40+
@Bean
41+
public Job listenerTestJob() {
42+
return jobBuilderFactory.get("listenerTestJob")
43+
.start(step())
44+
.listener(myJobExecutionListener)
45+
.build();
46+
}
47+
48+
private Step step() {
49+
return stepBuilderFactory.get("step")
50+
.listener(myStepExecutionListener)
51+
.<String, String>chunk(2)
52+
.faultTolerant()
53+
.listener(myChunkListener)
54+
.reader(reader())
55+
.listener(myItemReaderListener)
56+
.processor(processor())
57+
.listener(myItemProcessListener)
58+
.writer(list -> list.forEach(System.out::println))
59+
.listener(myItemWriterListener)
60+
.build();
61+
}
62+
63+
private ItemReader<String> reader() {
64+
List<String> data = Arrays.asList("java", "c++", "javascript", "python");
65+
return new simpleReader(data);
66+
}
67+
68+
private ItemProcessor<String, String> processor() {
69+
return item -> item + " language";
70+
}
71+
}
72+
73+
class simpleReader implements ItemReader<String> {
74+
private Iterator<String> iterator;
75+
76+
public simpleReader(List<String> data) {
77+
this.iterator = data.iterator();
78+
}
79+
80+
@Override
81+
public String read() {
82+
return iterator.hasNext() ? iterator.next() : null;
83+
}
84+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package cc.mrbird.batch.listener;
2+
3+
import org.springframework.batch.core.ChunkListener;
4+
import org.springframework.batch.core.scope.context.ChunkContext;
5+
import org.springframework.stereotype.Component;
6+
7+
/**
8+
* @author MrBird
9+
*/
10+
@Component
11+
public class MyChunkListener implements ChunkListener {
12+
@Override
13+
public void beforeChunk(ChunkContext context) {
14+
System.out.println("before chunk: " + context.getStepContext().getStepName());
15+
}
16+
17+
@Override
18+
public void afterChunk(ChunkContext context) {
19+
System.out.println("after chunk: " + context.getStepContext().getStepName());
20+
}
21+
22+
@Override
23+
public void afterChunkError(ChunkContext context) {
24+
System.out.println("before chunk error: " + context.getStepContext().getStepName());
25+
}
26+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cc.mrbird.batch.listener;
2+
3+
import org.springframework.batch.core.ItemProcessListener;
4+
import org.springframework.stereotype.Component;
5+
6+
/**
7+
* @author MrBird
8+
*/
9+
@Component
10+
public class MyItemProcessListener implements ItemProcessListener<String, String> {
11+
@Override
12+
public void beforeProcess(String item) {
13+
System.out.println("before process: " + item);
14+
}
15+
16+
@Override
17+
public void afterProcess(String item, String result) {
18+
System.out.println("after process: " + item + " result: " + result);
19+
}
20+
21+
@Override
22+
public void onProcessError(String item, Exception e) {
23+
System.out.println("on process error: " + item + " , error message: " + e.getMessage());
24+
}
25+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package cc.mrbird.batch.listener;
2+
3+
import org.springframework.batch.core.ItemReadListener;
4+
import org.springframework.stereotype.Component;
5+
6+
/**
7+
* @author MrBird
8+
*/
9+
@Component
10+
public class MyItemReaderListener implements ItemReadListener<String> {
11+
@Override
12+
public void beforeRead() {
13+
System.out.println("before read");
14+
}
15+
16+
@Override
17+
public void afterRead(String item) {
18+
System.out.println("after read: " + item);
19+
}
20+
21+
@Override
22+
public void onReadError(Exception ex) {
23+
System.out.println("on read error: " + ex.getMessage());
24+
}
25+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cc.mrbird.batch.listener;
2+
3+
import org.springframework.batch.core.ItemWriteListener;
4+
import org.springframework.stereotype.Component;
5+
6+
import java.util.List;
7+
8+
/**
9+
* @author MrBird
10+
*/
11+
@Component
12+
public class MyItemWriterListener implements ItemWriteListener<String> {
13+
14+
@Override
15+
public void beforeWrite(List<? extends String> items) {
16+
System.out.println("before write: " + items);
17+
}
18+
19+
@Override
20+
public void afterWrite(List<? extends String> items) {
21+
System.out.println("after write: " + items);
22+
}
23+
24+
@Override
25+
public void onWriteError(Exception exception, List<? extends String> items) {
26+
System.out.println("on write error: " + items + " , error message: " + exception.getMessage());
27+
}
28+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package cc.mrbird.batch.listener;
2+
3+
import org.springframework.batch.core.JobExecution;
4+
import org.springframework.batch.core.JobExecutionListener;
5+
import org.springframework.stereotype.Component;
6+
7+
/**
8+
* @author MrBird
9+
*/
10+
@Component
11+
public class MyJobExecutionListener implements JobExecutionListener {
12+
13+
@Override
14+
public void beforeJob(JobExecution jobExecution) {
15+
System.out.println("before job execute: " + jobExecution.getJobInstance().getJobName());
16+
}
17+
18+
@Override
19+
public void afterJob(JobExecution jobExecution) {
20+
System.out.println("after job execute: " + jobExecution.getJobInstance().getJobName());
21+
}
22+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package cc.mrbird.batch.listener;
2+
3+
import org.springframework.batch.core.StepExecution;
4+
import org.springframework.batch.core.annotation.AfterStep;
5+
import org.springframework.batch.core.annotation.BeforeStep;
6+
import org.springframework.stereotype.Component;
7+
8+
/**
9+
* @author MrBird
10+
*/
11+
@Component
12+
public class MyStepExecutionListener {
13+
14+
@BeforeStep
15+
public void breforeStep(StepExecution stepExecution) {
16+
System.out.println("before step execute: " + stepExecution.getStepName());
17+
}
18+
19+
@AfterStep
20+
public void afterStep(StepExecution stepExecution) {
21+
System.out.println("after step execute: " + stepExecution.getStepName());
22+
}
23+
}

0 commit comments

Comments
 (0)