Spring Batch 之 Hello World
🏷️ Spring Batch
通过 Spring Initializr 创建 Spring Batch 项目,添加如下依赖:
- Spring Batch
- H2 Database
- Spring Data JDBC
生成的 pom.xml 文件如下:
xml
<?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.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>me.liujiajia.batch</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>hello-world</name>
<description>Batch demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.gmavenplus</groupId>
<artifactId>gmavenplus-plugin</artifactId>
<version>1.13.1</version>
<executions>
<execution>
<goals>
<goal>addSources</goal>
<goal>addTestSources</goal>
<goal>generateStubs</goal>
<goal>compile</goal>
<goal>generateTestStubs</goal>
<goal>compileTests</goal>
<goal>removeStubs</goal>
<goal>removeTestStubs</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
在 HelloWorldApplication
中添加 @EnableBatchProcessing
注解,并分别创建 Step
和 Job
类型的 bean 。
java
package me.liujiajia.batch.helloworld;
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.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.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
@EnableBatchProcessing
@SpringBootApplication
public class HelloWorldApplication {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step step() {
return this.stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println("Hello, World!");
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Job job(Step step) {
return this.jobBuilderFactory.get("job")
.start(step)
.build();
}
public static void main(String[] args) {
SpringApplication.run(HelloWorldApplication.class, args);
}
}
运行日志如下:
java
已连接到目标 VM, 地址: ''127.0.0.1:63420',传输: '套接字''
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.7.5)
2022-11-23 18:20:31.731 INFO 25556 --- [ main] m.l.b.helloworld.HelloWorldApplication : Starting HelloWorldApplication using Java 19.0.1 on Senior-JiaJia with PID 25556 (D:\hello-world\target\classes started by 佳佳 in D:\hello-world)
2022-11-23 18:20:31.739 INFO 25556 --- [ main] m.l.b.helloworld.HelloWorldApplication : No active profile set, falling back to 1 default profile: "default"
2022-11-23 18:20:33.234 INFO 25556 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JDBC repositories in DEFAULT mode.
2022-11-23 18:20:33.258 INFO 25556 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 12 ms. Found 0 JDBC repository interfaces.
2022-11-23 18:20:34.278 INFO 25556 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting...
2022-11-23 18:20:34.730 INFO 25556 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
2022-11-23 18:20:35.098 INFO 25556 --- [ main] o.s.b.c.r.s.JobRepositoryFactoryBean : No database type set, using meta data indicating: H2
2022-11-23 18:20:35.400 INFO 25556 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : No TaskExecutor has been set, defaulting to synchronous executor.
2022-11-23 18:20:35.992 INFO 25556 --- [ main] m.l.b.helloworld.HelloWorldApplication : Started HelloWorldApplication in 5.204 seconds (JVM running for 7.263)
2022-11-23 18:20:35.996 INFO 25556 --- [ main] o.s.b.a.b.JobLauncherApplicationRunner : Running default command line with: []
2022-11-23 18:20:36.170 INFO 25556 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=job]] launched with the following parameters: [{}]
2022-11-23 18:20:36.299 INFO 25556 --- [ main] o.s.batch.core.job.SimpleStepHandler : Executing step: [step1]
Hello, World!
2022-11-23 18:20:36.342 INFO 25556 --- [ main] o.s.batch.core.step.AbstractStep : Step: [step1] executed in 41ms
2022-11-23 18:20:36.355 INFO 25556 --- [ main] o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=job]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 100ms
2022-11-23 18:20:36.368 INFO 25556 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated...
2022-11-23 18:20:36.379 INFO 25556 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed.
与目标 VM 断开连接, 地址为: ''127.0.0.1:63420',传输: '套接字''
进程已结束,退出代码0
参考
[1]:《Spring Batch 权威指南》 -- [美] 迈克尔·T.米内拉(Michael,T.,Minella)著