สร้าง Batch Processing ด้วย Spring Batch
Batch processing เป็นการประมวลผลแบบกลุ่มหรือประมวลผลทีเดียว ซึ่งเป็นกระบวนการของ transaction ในกลุ่มหรือ batch ไม่ปฏิสัมพันธ์กับ user เมือรัน batch processing ความแตกต่างระหว่าง batch processing กับ transaction processing คือ transaction processing จะประมวลผลหนึ่ง transaction ต่อครั้งและมีปฏิสัมพันธ์กับ user ซึ่งในขณะที่ batch processing สามารถดำเนินการได้ตลอดเวลา ซึ่งเหมาะอย่างยิ่งกับการประมวลผลเมื่อสิ้นสุดรอบ (end-of-cycle processing) เช่นสำหรับ สร้างรายงานของธนาคารตอนสิ้นวัน หรือดำเนินการ payroll รายเดือนหรือรายปักษ์ และ Spring framwork ก็มี Spring Batch ที่รองรับการทำงานของ Batch processing ดัวย ในบทความนี้จะมาสร้าง Batch processing แบบง่ายเพื่อใช้งาน Spring Batch
Spring Batch
สำหรับ Spring framework ก็มี project ที่รองรับ batch processing นี้ด้วย นั้นก็คือ Spring Batch ที่ออกแบบมาให้รองรับการทำงานการประมวลผลแบบนี้โดยเฉพาะ ทำให้เราสามารถ reuse ใช้งาน function ต่างๆ ที่จำเป็นสำหรับดำเนินงานกับข้อมูลขนาดใหญ่รวมทั้ง tracing/logging, transaction management, job processing statistic, job restart และ resouce management โดยมีเทคนิคขั้นสูงที่จะจัดการกับข้อมูลขนาดใหญ่มากได้ ผ่านเทคนิค optimization และ partitioning อีกทั้งยังรองรับการ scalable ด้วย
ใน Spring Batch จะทำงานกับแหล่งของข้อมูล (data source) ได้หลากหลายทั้ง text file หรือ database โดยที่ งาน (Job) ของ batch processing จะประกอบด้วยหลายขั้นตอน (Step) แต่ละ Step มี 3 ส่วน คือ ItemReader, ItemProcess และ ItemWriter โดยที่ JobLauncher จะเป็นตัวเริ่มการทำงานของ Job โดยที่ต้องเก็บ metadata ในระหว่างการดำเนินงานไว้ที่ JobRepository
ItemReader — เป็นส่วนการอ่านข้อมูลสำหรับ Step โดยอ่านข้อมูล 1 item ต่อครั้ง
ItemProcess — เป็นส่วนของการทำ business process ของ item หลังจากอ่านข้อมูล
ItemWriter — เป็นส่วน output ของ Step โดยจะเขียนข้อมูล batch ละครั้ง
โดยสามารถศึกษารายละเอียดทั้งหมอของ Spring Batch ได้ที่ document
ใน Maven project เราสามารถเพิ่ม Spring Batch ด้วย
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
Spring Batch Project
เรามาลองสร้าง Spring Batch project ง่ายๆ สำหรับทำ batch process ที่มี 2 Step คือ
- อ่านข้อมูลจากไฟล์ CSV หลังจากนั้นแปลงข้อมูลแล้วเขียนข้อมูลลง database
- อ่านข้อมูลจาก Database แล้วเขียนข้อมูลลงไฟล์ XML
ไพล์ CSV ที่จะอ่านมีข้อมูลดังนี้ ซึ่งเป็นข้อมูลง่ายๆ สำหรับตัวอย่าง
username, userid, transaction_date, transaction_amount
julia, 1234, 31/10/2019, 10000
john, 2134, 3/12/2019, 12321
robin, 2134, 2/02/2019, 23411
สร้าง project โดยใช้ Spring Initializr เลือก Spring Batch, MySQL driver, JDBC API และ Lombok
สร้าง data model สำหรับเป็นตัวแทนข้อมูล Transaction โดยใช้ Lombok ทำให้เป็น Builder class ด้วย @Builder
และ Getter/Setter ด้วย @Data
Step 1
เป็นขั้นตอนสำหรับอ่านข้อมูลจากไฟล์ CSV ด้วย ItemReader และแปลงข้อมูลที่อ่านได้ด้วย ItemProcess หลังจากนั้น insert ข้อมูลลง database ด้วย ItemWriter
และใน ฺBatchJobConfig class ก็สร้าง Job โดย inject Step1 เข้ามากและใส่ใน flow method เพื่อให้ Job เรียก Step1 มาทำงาน และใช้ @EnableBatchProcessing
เพื่อให้ Batch processing ทำงานใน Application นี้
เมื่อ run Application นี้และตรวจสอบในฐานข้อมูลจะเห็นได้ว่ามีการ insert ข้อมูลลงไปในฐานข้อมูลเรียบร้อย ซึ่งเป็นข้อมูลที่เปลี่ยนแปลงเรียบร้อยแล้ว
Step 2
สร้าง TransactionSummary class เพื่อรับค่าที่ query จาก database และใช้เขียนไฟล์ XML
เป็นขั้นตอนสำหรับ query ข้อมูลจาก database ด้วย ItemReader ซึ่งเป็นข้อมูลสรุป และเขียนข้อมูลที่ได้ลงไฟล์ XML
เพิ่ม Step2 เข้าไปใน Batch Job configuration และใส่ใน next
method พร้อมกับเปลี่ยน Step1 ใช้ start
method
เมื่อ run Application ที่เพิ่ม Step2 เข้าไปใน Job แล้วจะได้ไฟล์ XML ที่มีข้อมูลสรุปของ transaction
<?xml version="1.0" encoding="UTF-8"?>
<summary>
<transactionSummary>
<count>3</count>
<totalAmount>1486291</totalAmount>
</transactionSummary>
</summary>
สรุป
จากที่ลองสร้าง Batch Processing ด้วย Spring Batch นั้น ในขั้นแรกจะต้องเข้าใจการทำงานของ Spring Batch เสียก่อนว่าประกอบด้วยอะไรบ้างเพื่อที่จะ config ส่วนต่างๆ ได้ถูกต้องและเป็นไปตามที่ต้องการ และจะเห็นได้ว่าใช้ Spring Batch ทำงานนั้นสะดวกมากสำหรับทำ Batch Processing