一、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