日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Batch 入门教程

發布時間:2023/12/2 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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, 23411

gradle 依賴

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=mysql

spring.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 入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。