javascript
Spring Batch 入门教程
Spring Batch 入門教程
Spring Batch用于健壯地執行批處理工作的框架。本文通過實戰方式介紹Spring Batch,聚焦案例代碼方式進行闡述。
當前版本4.1,支持Spring 5 和 java 8 或以上版本。也遵循JSR-352批處理規范。這里詳細說明了其應用場景。
核心概念及流程
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-JzF9semt-1649329280783)(http://docs.spring.io/spring-batch/reference/html/images/spring-batch-reference-model.png)]
Spring batch 遵循作業倉庫(job repository)執行調度工作并負責與批處理作業進行交互的傳統批處理架構。job可以有多個步驟,每個步驟一般遵循讀數據、處理數據以及寫數據順序。spring batch框架幫助我們處理大量的繁重工作————特別是底層對job的持久化工作等。
示例需求
這里我們處理一個簡單示例,從csv文件中遷移一些財務數據至xml文件。輸入文件結構很簡單,每行包括一個事物,包括姓名、用戶id、發生日期以及金額:
username, userid, transaction_date, transaction_amount devendra, 1234, 31/10/2015, 10000 john, 2134, 3/12/2015, 12321 robin, 2134, 2/02/2015, 23411gradle 依賴
dependencies {compile group: 'org.apache.poi', name: 'poi', version: '4.0.1'compile group: 'org.apache.poi', name: 'poi-ooxml', version: '4.0.1'compile group: 'com.google.guava', name: 'guava', version: '23.0'compile 'org.springframework:spring-oxm'implementation 'org.springframework.boot:spring-boot-starter-batch'compileOnly 'org.projectlombok:lombok'annotationProcessor 'org.projectlombok:lombok'runtimeOnly 'mysql:mysql-connector-java'compile "org.springframework:spring-jdbc"testImplementation 'org.springframework.boot:spring-boot-starter-test'testImplementation 'org.springframework.batch:spring-batch-test' }schema 初始化
spring batch 通過數據庫持久化job及step執行狀態。因此首先需要初始化spring batch的數據庫腳本。spring-batch-core.jar的orgspringframeworkatchcore路徑下有所有支持數據的腳本。我們拷貝schema-mysql.sql至resouces目錄下,然后在application.properties中配置數據源并啟動初始化腳本屬性:
spring.datasource.username= spring.datasource.password= spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://192.168.0.12:3306/batch-db?useUnicode=true&characterEncoding=utf8&serverTimezone=UTCspring.datasource.initialization-mode=always spring.datasource.platform=mysqlspring.datasource.initialization-mode 是spring boot中啟用執行schema.sql 和 data.sql;示例中使用mysql,所以也需要指定spring.datasource.platform。
從csv文件讀數據
首先配置cvsFileItemReader,從csv文件讀數據并轉換為Transation對象:
@Setter @Getter @ToString @XmlRootElement(name = "transactionRecord") public class Transaction {private String username;private int userId;private Date transactionDate;private double amount; }為了實現轉換,需要定義RecordFieldSetMapper類:
public class RecordFieldSetMapper implements FieldSetMapper<Transaction> {private static String dateFormat = "d/MM/yyyy";@Overridepublic Transaction mapFieldSet(FieldSet fieldSet) {Transaction transaction = new Transaction();transaction.setUsername(fieldSet.readString("username"));transaction.setUserId(fieldSet.readInt(1));transaction.setAmount(fieldSet.readDouble(3));String dateString = fieldSet.readString(2);transaction.setTransactionDate( Date.from(LocalDate.parse(dateString,DateTimeFormatter.ofPattern(dateFormat)).atStartOfDay(ZoneId.systemDefault()).toInstant()));return transaction;} }使用ItemProcessor處理數據
現在我們創建處理器,一般用于處理或轉換讀取的數據。為了演示,這里沒有做任何實際處理。
public class CustomItemProcessor implements ItemProcessor<Transaction, Transaction> {public Transaction process(Transaction item) {return item;} }spring batch 配置
下面配置spring batch,整合step和job:
@Configuration @EnableBatchProcessing public class FinancialBatchConfiguration {private final JobBuilderFactory jobs;private final StepBuilderFactory steps;@Value("input/record.csv")private Resource inputCsv;@Value("file:xml/output.xml")private Resource outputXml;@Autowiredpublic FinancialBatchConfiguration(JobBuilderFactory jobs, StepBuilderFactory steps) {this.jobs = jobs;this.steps = steps;}@Beanprotected Step step1(ItemReader<Transaction> reader,ItemProcessor<Transaction, Transaction> processor,ItemWriter<Transaction> writer) {return steps.get("step1").<Transaction, Transaction> chunk(10).reader(reader).processor(processor).writer(writer).build();}@Bean(name = "firstBatchJob")public Job job(@Qualifier("step1") Step step1) {return jobs.get("firstBatchJob").start(step1).build();}@Beanpublic ItemReader<Transaction> itemReader() throws UnexpectedInputException, ParseException {FlatFileItemReader<Transaction> reader = new FlatFileItemReader<>();DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();String[] tokens = { "username", "userid", "transactiondate", "amount" };tokenizer.setNames(tokens);reader.setResource(inputCsv);DefaultLineMapper<Transaction> lineMapper = new DefaultLineMapper<>();lineMapper.setLineTokenizer(tokenizer);lineMapper.setFieldSetMapper(new RecordFieldSetMapper());reader.setLineMapper(lineMapper);reader.setLinesToSkip(1);return reader;}@Beanpublic ItemProcessor<Transaction, Transaction> itemProcessor() {return new CustomItemProcessor();}@Beanpublic ItemWriter<Transaction> itemWriter(Marshaller marshaller){StaxEventItemWriter<Transaction> itemWriter = new StaxEventItemWriter<>();itemWriter.setMarshaller(marshaller);itemWriter.setRootTagName("transactionRecord");itemWriter.setResource(outputXml);return itemWriter;}@Beanpublic Marshaller marshaller() {Jaxb2Marshaller marshaller = new Jaxb2Marshaller();marshaller.setClassesToBeBound(Transaction.class);return marshaller;} }我們看到itemReader()定義 ItemReader,itemWriter定義ItemWriter,ItemProcessor定義轉換器bean。通過StepBuilderFactory創建step,JobBuilderFactory創建job。
spring batch執行job
spring boot 默認對自動運行job,運維每次job運行都在數據庫持久化運行參數,如果不設置參數,則job只能運行一次。因此我們需要禁用自動運行job功能,然后手動啟動并執行job。
禁用自動執行job
在application.properties 中增加屬性并設置為false。
spring.batch.job.enabled=false運行job
@SpringBootApplication public class JpaToExcelApplication implements CommandLineRunner {@Autowiredprivate JobLauncher jobLauncher;@Autowired@Qualifier("firstBatchJob")private Job job;public static void main(String[] args) {SpringApplication.run(JpaToExcelApplication.class, args);}@Overridepublic void run(String... args) throws Exception {callFinacialBatch();}private void callFinacialBatch() throws Exception{jobLauncher.run(job, new JobParametersBuilder().addLong("date", LocalDateTime.now().getLong(ChronoField.MICRO_OF_DAY)).toJobParameters());} }spring batch 支持多種方式執行job,命令行方式、定時任務方式、web方式。為了演示方便,這里采用命令行方式執行。callFinacialBatch方法給job指定了參數,為了每次運行時參數值不同,可以讓job執行多次。執行成功后讀者可以查看數據庫表記錄,也可以看到生成的xml文件。
總結
本文通過一個簡單示例給你一個基本的spring batch入門。包括如何初始化spring batch schema腳本,自定義讀數據、處理數據以及寫數據等。
。
總結
以上是生活随笔為你收集整理的Spring Batch 入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大厂首发:springcloud菜鸟教程
- 下一篇: Spring AOP教程(作者原创)