Spring Batch 是一个轻量级、全面的批处理框架,旨在支持开发对企业系统日常运营至关重要的健壮批处理应用程序。 Spring Batch 建立在人们从 Spring 框架中了解的生产力、基于 POJO 的开发方法和一般易用性功能的基础上,同时使开发人员在必要时可以轻松访问和利用更高级的企业服务。
如果您正在为 Batch 应用程序寻找运行时编排工具,或者需要管理控制台来查看当前和历史执行情况,请查看 Spring Cloud Data Flow。它是一个编排工具,用于部署和执行基于数据集成的微服务,包括 Spring Batch 应用程序。
这个快速教程向您展示如何设置一个最小的项目来使用 Spring Batch 运行简单的批处理作业。
在您最喜欢的 IDE 中,创建一个新的基于 Maven 的 Java 17+ 项目并添加以下依赖项:
< dependencies >
< dependency >
< groupId >org.springframework.batch</ groupId >
< artifactId >spring-batch-core</ artifactId >
< version >${LATEST_VERSION}</ version >
</ dependency >
< dependency >
< groupId >org.hsqldb</ groupId >
< artifactId >hsqldb</ artifactId >
< version >${LATEST_VERSION}</ version >
< scope >runtime</ scope >
</ dependency >
</ dependencies >
然后,创建一个配置类来定义作业存储库将使用的数据源和事务管理器:
import javax . sql . DataSource ;
import org . springframework . context . annotation . Bean ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . jdbc . support . JdbcTransactionManager ;
import org . springframework . jdbc . datasource . embedded . EmbeddedDatabaseBuilder ;
@ Configuration
public class DataSourceConfiguration {
@ Bean
public DataSource dataSource () {
return new EmbeddedDatabaseBuilder ()
. addScript ( "/org/springframework/batch/core/schema-hsqldb.sql" )
. build ();
}
@ Bean
public JdbcTransactionManager transactionManager ( DataSource dataSource ) {
return new JdbcTransactionManager ( dataSource );
}
}
在本教程中,使用 Spring Batch 的元数据表创建并初始化嵌入式 HSQLDB 数据库。
最后,创建一个类来定义批处理作业:
import org . springframework . batch . core . Job ;
import org . springframework . batch . core . JobParameters ;
import org . springframework . batch . core . Step ;
import org . springframework . batch . core . configuration . annotation . EnableBatchProcessing ;
import org . springframework . batch . core . job . builder . JobBuilder ;
import org . springframework . batch . core . launch . JobLauncher ;
import org . springframework . batch . core . repository . JobRepository ;
import org . springframework . batch . core . step . builder . StepBuilder ;
import org . springframework . batch . repeat . RepeatStatus ;
import org . springframework . context . ApplicationContext ;
import org . springframework . context . annotation . AnnotationConfigApplicationContext ;
import org . springframework . context . annotation . Bean ;
import org . springframework . context . annotation . Configuration ;
import org . springframework . context . annotation . Import ;
import org . springframework . jdbc . support . JdbcTransactionManager ;
@ Configuration
@ EnableBatchProcessing
@ Import ( DataSourceConfiguration . class )
public class HelloWorldJobConfiguration {
@ Bean
public Step step ( JobRepository jobRepository , JdbcTransactionManager transactionManager ) {
return new StepBuilder ( "step" , jobRepository ). tasklet (( contribution , chunkContext ) -> {
System . out . println ( "Hello world!" );
return RepeatStatus . FINISHED ;
}, transactionManager ). build ();
}
@ Bean
public Job job ( JobRepository jobRepository , Step step ) {
return new JobBuilder ( "job" , jobRepository ). start ( step ). build ();
}
public static void main ( String [] args ) throws Exception {
ApplicationContext context = new AnnotationConfigApplicationContext ( HelloWorldJobConfiguration . class );
JobLauncher jobLauncher = context . getBean ( JobLauncher . class );
Job job = context . getBean ( Job . class );
jobLauncher . run ( job , new JobParameters ());
}
}
本教程中的作业由打印“Hello world!”的单个步骤组成。到标准输出。
您现在可以运行HelloWorldJobConfiguration
类的main
方法来启动作业。输出应类似于以下内容:
INFO: Finished Spring Batch infrastructure beans configuration in 8 ms.
INFO: Starting embedded database: url='jdbc:hsqldb:mem:testdb', username='sa'
INFO: No database type set, using meta data indicating: HSQL
INFO: No Micrometer observation registry found, defaulting to ObservationRegistry.NOOP
INFO: No TaskExecutor has been set, defaulting to synchronous executor.
INFO: Job: [SimpleJob: [name=job]] launched with the following parameters: [{}]
INFO: Executing step: [step]
Hello world!
INFO: Step: [step] executed in 10ms
INFO: Job: [SimpleJob: [name=job]] completed with the following parameters: [{}] and the following status: [COMPLETED] in 25ms
本指南是一个更实际的教程,展示了一个典型的 ETL 批处理作业,该作业从平面文件读取数据、转换数据并将其写入关系数据库。它是一个基于Spring Boot的Spring Batch项目。您可以在此处找到入门指南:创建批处理服务。
您可以在此处找到几个可供尝试的示例:Spring Batch Samples。
如果您有疑问或支持请求,请在 GitHub 讨论上打开新讨论或在 StackOverflow 上提出问题。
请不要在问题跟踪器上针对问题或支持请求创建问题。我们希望保留问题跟踪器专门用于错误报告和功能请求。
Spring Batch 使用 GitHub Issues 来记录错误和功能请求。如果您想提出问题,请遵循以下建议:
对于重要的错误,请创建一个测试用例或一个复制问题的项目并将其附加到问题中,如问题报告指南中详述。
请参阅我们的安全政策。
使用 Github 主页上的 URL 克隆 git 存储库:
$ git clone [email protected]:spring-projects/spring-batch.git
$ cd spring-batch
Maven 是用于 Spring Batch 的构建工具。您可以使用以下命令构建项目:
$ ./mvnw package
如果您想执行包含所有集成测试的完整构建,请运行:
$ ./mvnw verify
请注意,一些集成测试基于 Docker,因此请确保在运行完整构建之前已启动并运行 Docker。
要生成参考文档,请运行以下命令:
$ cd spring-batch-docs
$ ../mvnw antora:antora
参考文档可以在spring-batch-docs/target/anotra/site
中找到。
如果您想在 Docker 容器中构建项目,可以按以下步骤操作:
$> docker run -it --mount type=bind,source="$(pwd)",target=/spring-batch maven:3-openjdk-17 bash
#> cd spring-batch
#> ./mvnw package
这将安装您之前在容器内的主机上克隆的源代码。如果您想在容器内处理源代码的副本(对主机没有副作用),您可以按以下步骤操作:
$> docker run -it maven:3-openjdk-17 bash
#> git clone https://github.com/spring-projects/spring-batch.git
#> cd spring-batch
#> ./mvnw package
我们欢迎任何形式的贡献!您可以通过以下几种方式为该项目做出贡献:
在我们接受拉取请求之前,我们需要您签署贡献者协议。签署贡献者协议并不授予任何人对主存储库的提交权,但这确实意味着我们可以接受您的贡献,如果我们这样做,您将获得作者信用。活跃的贡献者可能会被要求加入核心团队,并被赋予合并拉取请求的能力。
请参阅我们的行为准则。
Spring Batch 是在 Apache 2.0 许可证下发布的开源软件。