一、Batch是什麼?
Spring Batch是一款成熟穩定的批處理框架。它利用Java實現了大型、複雜批處理作業處理機制。它允許開發人員構建批處理應用程序,從而更加容易地執行、過濾、排序和轉換大量數據。Batch不僅適合大數據處理,同時也可以在調度及監控方面提供幫助。Spring Batch支持大多數的主流資料庫,同時它還提供了強大的與spring生態系統集成的能力。
以下是簡單的代碼示例:
public class BatchConfiguration {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleJob() {
return jobBuilderFactory.get("simpleJob")
.start(step1())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("Hello, world!");
return RepeatStatus.FINISHED;
}).build();
}
}
二、Batch核心概念
1. Job
在Spring Batch中,A Job是任務的頂級容器。它由一組Steps組成,定義了一個完整的、可獨立執行的工作流程。
2. Step
在Spring Batch中,Step代表Job執行過程中的單個步驟。Step包含了一組處理步驟和決策,每個步驟中可以有一個Tasklet或一個Chunk。
3. Tasklet
Tasklet是一個獨立的單元,可以執行一個事務。通常情況下,Tasklet可以完成一些批處理初始化工作、數據清理、文件複製或發送郵件等獨立任務。
4. Chunk
Chunk指的是一次批處理中每次讀取的一組數據,如從資料庫中讀取一批數據,然後逐一進行處理操作,處理完了再進行下一次讀取操作。處理完成後,事務提交或回滾。Chunk事務通常適用於處理大規模數據時,可以減少內存的使用。
5. ItemReader
ItemReader負責從數據源中讀取數據,並且將數據傳遞給ItemProcessor進行處理。
6. ItemProcessor
ItemProcessor用來處理讀取到的數據,可以根據需要進行數據轉換或過濾等操作。
7. ItemWriter
ItemWriter用來將處理後的數據寫入目標數據源中。
8. JobRepository
JobRepository是一個持久化的、線程安全的Repository,它用來存儲Job的狀態信息,以及每個Step的執行狀態信息。
三、使用Spring Batch實現批處理作業
1. 實現步驟
使用Spring Batch實現批處理作業的步驟如下:
1) 創建Job
在創建Job之前,需要先定義JobRepository和JobBuilderFactory。然後通過JobBuilderFactory創建Job。
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private JobRepository jobRepository;
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.repository(jobRepository)
.start(step())
.build();
}
2) 創建Step
在創建Step之前,需要先定義StepBuilderFactory。然後通過StepBuilderFactory創建Step。
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Step step() {
return stepBuilderFactory.get("step")
.chunk(5)
.reader(reader())
.processor(processor())
.writer(writer())
.build();
}
3) 創建ItemReader
在創建ItemReader之前,需要先定義DataSource,並使用JdbcCursorItemReader從數據源中獲取數據。
@Autowired
private DataSource dataSource;
@Bean
public ItemReader reader() {
JdbcCursorItemReader reader = new JdbcCursorItemReader();
reader.setDataSource(dataSource);
reader.setSql("select name from person");
reader.setRowMapper((rs, rowNum) -> rs.getString("name"));
return reader;
}
4) 創建ItemProcessor
在創建ItemProcessor之前,需要定義ItemProcessor並實現process()方法。
@Bean
public ItemProcessor processor() {
return name -> "Hello, " + name + "!";
}
5) 創建ItemWriter
在創建ItemWriter之前,需要定義寫入目標數據源。
@Autowired
private SomeRepository someRepository;
@Bean
public ItemWriter writer() {
return items -> someRepository.saveAll(items);
}
6) 運行Job
在創建完Job之後,可以直接運行Job。
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
public void run() throws Exception {
JobParameters jobParameters = new JobParametersBuilder()
.addString("jobId", String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(job, jobParameters);
}
2. 執行結果
執行上述代碼後,將會輸出以下結果:
Hello, Tom!
Hello, Jerry!
Hello, Mary!
Hello, John!
Hello, Bob!
四、總結
Spring Batch是一個成熟穩定的批處理框架,它由Job、Step、Tasklet、Chunk、ItemReader、ItemProcessor、ItemWriter和JobRepository等核心概念組成。使用Spring Batch可以幫助我們更加容易地執行、過濾、排序和轉換大量數據,並且它還提供了強大的與spring生態系統集成的能力。
原創文章,作者:RADCA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/334961.html
微信掃一掃
支付寶掃一掃