Spring Batch學習筆記(一)


Spring Batch簡介

	Spring Batch提供了可重復使用的功能,用來處理大量數據。包括記錄、跟蹤,事務管理,作業處理統計,作業重啟,跳過和資源管理。
此外還提供了更高級的技術服務和功能,通過優化和分區技術實現極高容量和高性能的批處理作業。

Spring Batch使用場景

(1)一般的批處理程序
·從數據庫,文件或者隊列中讀取大量數據
·處理讀取到的數據
·將處理完成的數據保存到文件,數據庫
(2)業務場景
·定期提交批處理
·並發批處理,並行處理Job
·分階段的企業消息驅動處理
·大規模並行批處理
·失敗后手動或預定重啟
·依賴步驟的順序處理
·部分處理,跳過記錄
·整批交易,適用於批量較小或現有存儲過程/腳本的情況

Spring Batch主要組成部分

·JobRepository,用來注冊job的容器
·JobLauncher,用來啟動job的接口
·Job,實際執行的任務,包含一個或多個Step
·Step,step包含ItemReader、ItemProcessor和ItemWriter
·ItemReader,用來讀取數據的接口
·ItemProcessor,用來處理數據的接口
·ItemWriter,用來輸出數據的接口
以上Spring Batch的主要組成部分只需要注冊成Spring的Bean即可。批處理的配置類上需要使用@EnabelBatchProcessing。

代碼

(1)監聽器JobListener
	@Component
	public class JobListener implements JobExecutionListener{
		@Override
		public void beforeJob(JobExecution jobExecution){
			// Job執行前需要執行的操作
		}
		
		@Override
		public void afterJob(JobExecution jobExecution){
			// Job執行完成后需要執行的操作
		}
	}
(2)配置類DataBatchConfiguration
	@Configuration
	@EnableBatchProcessing
	public class DataBatchConfiguration{
		// 用於構建Job
		@Resource
		private JobBuilderFactory jobBuilderFactory;
		
		// 用於構建Step
		@Resource
		private StepBuilderFactory stepBuilderFactory;
		
		// 監聽器
		@Resource
		private JobListener jobListener;
		
		// ItemReader(使用的其中一種讀取方式)
		@Autowired
		private RepositoryItemReader readerData;
		
		// ItemWriter
		@Autowired
		private ItemReader writerData;
		
		// Job
		@Bean
		public Job dataHandleJob(){
			return jobBuilderFactory.get("dataHandleJob").incrementer(new RunIdIncrementer()).start(getDataStep())
				.listener(jobListener).build();
		}
		
		// Step
		// User:要處理的對象
		@Bean
		public Step getTDistSellOut() {
		return stepBuilderFactory.get("getData").<User, User>chunk(10000) // 一次commit數據的數量
				.faultTolerant().retryLimit(3)
				.retry(Exception.class)
				.skipLimit(100)											 // 發生異常時,允許重試的次數
				.skip(Exception.class)
				.reader(readerData)									     // reader
				.writer(writerData).build();							 // writer
		}
	}
(3)讀取類ReaderStep
   @Component
   public class ReaderStep{
   	@Resource
   	private EntityManagerFactory emf;
   	
   	@Autowired
   	private UserRepository userRepository;
   	
   	@Bean RepositoryItemReader<User> readerData(){
   		// 排序map(讀取數據按照ID進行正序排列)
   		Map<String,Sort.Direction> map = new HashMap<>();
   		map.put("id",sort.Direction.ASC);
   		// SQL語句所需參數LIST
   		List<String> params = new ArrayList<>();
   		params.add("2019-03-20");
   		RepositoryItemReader<User> repositoryItemReader = new new RepositoryItemReader<>();
   		// Set Repository
   		repositoryItemReader.setRepository(userRepository);
   		// Set PageSize(沒有會報錯)
   		repositoryItemReader.setPageSize(5);
   		// Set Repository Method
   		repositoryItemReader.setMethodName("findByDateLike");
   		// Set 參數List
   		repositoryItemReader.setArguments(params);
   		// Set 排序Map
   		repositoryItemReader.setSort(map);
   		return repositoryItemReader;
   	}
   }
(4)寫出類WriterStep
	@Component
	public class WriterStep {
		@Resource
		private UserRepository userRepository;

		@Bean
		public RepositoryItemWriter<User> writerData(){
			RepositoryItemWriter<User> repositoryItemWriter = new RepositoryItemWriter<>();
			repositoryItemWriter.setRepository(userRepository);
			repositoryItemWriter.setMethodName("save");
			return repositoryItemWriter;
		}
	}

參考網址

https://www.cnblogs.com/ealenxie/p/9647703.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM