Spring Batch批量處理數據實現(xiàn)方式
Spring Batch批量處理數據
Spring Batch 是一個由 Pivotal Software(原 SpringSource,現(xiàn)屬于 VMware)開發(fā)的批處理框架,它是 Spring 框架的一部分,主要用于創(chuàng)建高效、健壯的批量數據處理應用。
Spring Batch 設計用于處理大量的記錄,例如在夜間處理或定期運行的數據加載、轉換和整合操作。
Spring Batch的主要特性包括:
- 事務管理:支持事務邊界內的數據處理,確保數據完整性。
- 并發(fā)處理:允許并行處理數據,提高處理速度。
- 重試機制:當出現(xiàn)故障時,可以配置重試策略以重新處理失敗的記錄。
- 跳過機制:能夠跳過某些失敗的記錄而不中斷整個批處理作業(yè)。
- 持久化狀態(tài)管理:使用
JobRepository來跟蹤作業(yè)的狀態(tài),即使在系統(tǒng)重啟后也能恢復作業(yè)。 - 分片/分區(qū):可以將數據集分割成小塊,并在多個處理器上并行處理。
- 遠程執(zhí)行:支持跨機器的作業(yè)執(zhí)行。
- 監(jiān)控和日志:提供詳細的日志記錄和作業(yè)執(zhí)行的監(jiān)控能力。
Spring Batch的架構包括以下幾個核心組件:
- Job:這是批處理作業(yè)的最高級別抽象,可以包含一個或多個步驟。
- Step:是批處理作業(yè)中的一個邏輯單元,可以是任務步驟(如讀取、處理、寫入數據)或決策步驟。
- ItemReader:負責從數據源讀取數據項。
- ItemProcessor:對讀取的數據項進行處理。
- ItemWriter:將處理后的數據寫入目標數據源。
- JobLauncher:負責啟動和執(zhí)行作業(yè)。
- JobRepository:管理作業(yè)的元數據和狀態(tài),通常與數據庫交互。
Spring Batch 不是一個調度框架,它專注于批處理作業(yè)的實現(xiàn)細節(jié),通常需要與其他調度框架(如 Quartz 或 Cron)結合使用,以便控制作業(yè)何時啟動。由于其高度的可配置性和靈活性,Spring Batch 成為了企業(yè)級批處理應用的首選框架之一。
在Spring Boot項目中集成Spring Batch涉及幾個關鍵步驟,下面舉個例子,說明如何設置一個基本的Spring Batch環(huán)境:
1. 添加依賴
首先,在pom.xml文件中添加Spring Batch和Spring Boot Starter Batch的依賴:
<dependencies>
<!-- Spring Batch -->
<dependency>
<groupId>org.springframework.batch</groupId>
<artifactId>spring-batch-core</artifactId>
<version>4.x.y.RELEASE</version> <!-- 使用最新穩(wěn)定版 -->
</dependency>
<!-- Spring Boot Starter Batch -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<!-- 數據庫連接池 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 數據庫驅動 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 如果使用H2作為內存數據庫 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
</dependencies>
2. 配置數據源和JobRepository
Spring Batch需要一個數據源來存儲作業(yè)元數據和狀態(tài)。
這通常通過application.properties或application.yml文件配置:
spring.datasource.url=jdbc:mysql://localhost:3306/batchdb spring.datasource.username=batchuser spring.datasource.password=batchpassword spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # Spring Batch配置 spring.batch.job.enabled=false # 設置為false,避免在啟動時自動執(zhí)行任何job
3. 創(chuàng)建Job和Step
定義一個Job,并為其創(chuàng)建一個或多個Step。
這通常通過一個@Configuration類和@EnableBatchProcessing注解完成:
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job importUserJob() {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(importUserDataStep())
.end()
.build();
}
@Bean
public Step importUserDataStep() {
return stepBuilderFactory.get("importUserDataStep")
.<User, User>chunk(10)
.reader(userItemReader(null))
.processor(userItemProcessor())
.writer(userItemWriter())
.build();
}
}
4. 實現(xiàn)ItemReader, ItemProcessor, 和 ItemWriter
在上面的示例中,importUserDataStep()使用chunk-oriented步驟,這意味著它將數據分批處理。
你需要實現(xiàn)ItemReader, ItemProcessor, 和 ItemWriter來分別讀取、處理和寫入數據:
@Bean
public FlatFileItemReader<User> userItemReader(Resource resource) {
DefaultLineMapper<User> lineMapper = new DefaultLineMapper<>();
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("firstName", "lastName");
BeanWrapperFieldSetMapper<User> fieldSetMapper = new BeanWrapperFieldSetMapper<>();
fieldSetMapper.setTargetType(User.class);
lineMapper.setLineTokenizer(tokenizer);
lineMapper.setFieldSetMapper(fieldSetMapper);
FlatFileItemReader<User> itemReader = new FlatFileItemReader<>();
itemReader.setResource(resource);
itemReader.setLinesToSkip(1); // 跳過標題行
itemReader.setLineMapper(lineMapper);
return itemReader;
}
@Bean
public ItemProcessor<User, User> userItemProcessor() {
return new ItemProcessor<User, User>() {
@Override
public User process(User item) throws Exception {
item.setFirstName(item.getFirstName().toUpperCase());
return item;
}
};
}
@Bean
public JpaPagingItemWriter<User> userItemWriter(JpaItemWriterBuilder<User> builder) {
return builder
.entityManagerFactory(entityManagerFactory)
.build();
}
5. 啟動Job
在你的主類中,你可以注入JobLauncher和Job,然后調用它們來啟動作業(yè):
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job importUserJob;
// 在適當的地方調用
jobLauncher.run(importUserJob, new JobParametersBuilder().addLong("time", System.currentTimeMillis()).toJobParameters());
總結
以上步驟會幫助你在一個Spring Boot項目中集成Spring Batch。請注意,實際的配置可能需要根據你的具體需求和環(huán)境進行調整。
這些僅為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java 多線程并發(fā)編程_動力節(jié)點Java學院整理
這篇文章主要介紹了Java 多線程并發(fā)編程的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-05-05
springboot實現(xiàn)的https單向認證和雙向認證(java生成證書)
springboot https單向認證和雙向認證,本文主要介紹了springboot實現(xiàn)的https單向認證和雙向認證,具有一定的參考價值,感興趣的可以了解一下2024-04-04
SpringMVC @GetMapping注解路徑沖突問題解決
MD5對密碼進行加密存儲是常見的一種加密方式,本文主要介紹了Java雙重MD5加密實現(xiàn)安全登錄,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-07-07
SpringMVC跨服務器上傳文件中出現(xiàn)405錯誤的解決
這篇文章主要介紹了SpringMVC跨服務器上傳文件中出現(xiàn)405錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09
mybatis 使用jdbc.properties文件設置不起作用的解決方法
這篇文章主要介紹了mybatis 使用jdbc.properties文件設置不起作用的解決方法,需要的朋友可以參考下2018-03-03

