Spring Boot - บริการแบทช์
คุณสามารถสร้างไฟล์ JAR ที่ปฏิบัติการได้และเรียกใช้แอปพลิเคชัน Spring Boot โดยใช้คำสั่ง Maven หรือ Gradle ดังที่แสดงด้านล่าง -
สำหรับ Maven คุณสามารถใช้คำสั่งด้านล่าง -
mvn clean install
หลังจาก“ BUILD SUCCESS” คุณจะพบไฟล์ JAR ภายใต้ไดเร็กทอรีเป้าหมาย
สำหรับ Gradle คุณสามารถใช้คำสั่งดังภาพ -
gradle clean build
หลังจาก“ BUILD SUCCESSFUL” คุณจะพบไฟล์ JAR ภายใต้ไดเร็กทอรี build / libs
รันไฟล์ JAR โดยใช้คำสั่งที่ให้ไว้ที่นี่ -
java –jar <JARFILE>
ตอนนี้แอปพลิเคชันได้เริ่มต้นบนพอร์ต Tomcat 8080 ดังที่แสดง
ตอนนี้กด URL http://localhost:8080/ ในเว็บเบราว์เซอร์ของคุณและเชื่อมต่อเว็บซ็อกเก็ตแล้วส่งคำทักทายและรับข้อความ
Batch Service เป็นกระบวนการในการดำเนินการมากกว่าหนึ่งคำสั่งในงานเดียว ในบทนี้คุณจะได้เรียนรู้วิธีสร้าง batch service ในแอปพลิเคชัน Spring Boot
ให้เราพิจารณาตัวอย่างที่เราจะบันทึกเนื้อหาไฟล์ CSV ลงใน HSQLDB
ในการสร้างโปรแกรม Batch Service เราจำเป็นต้องเพิ่มการพึ่งพา Spring Boot Starter Batch และการพึ่งพา HSQLDB ในไฟล์คอนฟิกูเรชันบิลด์ของเรา
ผู้ใช้ Maven สามารถเพิ่มการอ้างอิงต่อไปนี้ในไฟล์ pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</dependency>
ผู้ใช้ Gradle สามารถเพิ่มการอ้างอิงต่อไปนี้ในไฟล์ build.gradle
compile("org.springframework.boot:spring-boot-starter-batch")
compile("org.hsqldb:hsqldb")
ตอนนี้เพิ่มไฟล์ข้อมูล CSV อย่างง่ายภายใต้ทรัพยากร classpath - src / main / resources และตั้งชื่อไฟล์เป็น file.csv ดังที่แสดง -
William,John
Mike, Sebastian
Lawarance, Lime
จากนั้นเขียนสคริปต์ SQL สำหรับ HSQLDB - ภายใต้ไดเรกทอรีทรัพยากร classpath - request_fail_hystrix_timeout
DROP TABLE USERS IF EXISTS;
CREATE TABLE USERS (
user_id BIGINT IDENTITY NOT NULL PRIMARY KEY,
first_name VARCHAR(20),
last_name VARCHAR(20)
);
สร้างคลาส POJO สำหรับ USERS model ดังที่แสดง -
package com.tutorialspoint.batchservicedemo;
public class User {
private String lastName;
private String firstName;
public User() {
}
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "firstName: " + firstName + ", lastName: " + lastName;
}
}
ตอนนี้ให้สร้างโปรเซสเซอร์กลางเพื่อดำเนินการหลังจากอ่านข้อมูลจากไฟล์ CSV และก่อนที่จะเขียนข้อมูลลงใน SQL
package com.tutorialspoint.batchservicedemo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
public class UserItemProcessor implements ItemProcessor<User, User> {
private static final Logger log = LoggerFactory.getLogger(UserItemProcessor.class);
@Override
public User process(final User user) throws Exception {
final String firstName = user.getFirstName().toUpperCase();
final String lastName = user.getLastName().toUpperCase();
final User transformedPerson = new User(firstName, lastName);
log.info("Converting (" + user + ") into (" + transformedPerson + ")");
return transformedPerson;
}
}
ให้เราสร้างไฟล์การกำหนดค่า Batch เพื่ออ่านข้อมูลจาก CSV และเขียนลงในไฟล์ SQL ดังที่แสดงด้านล่าง เราจำเป็นต้องเพิ่มคำอธิบายประกอบ @EnableBatchProcessing ในไฟล์คลาสคอนฟิกูเรชัน คำอธิบายประกอบ @EnableBatchProcessing ใช้เพื่อเปิดใช้งานการดำเนินการแบตช์สำหรับแอปพลิเคชัน Spring Boot ของคุณ
package com.tutorialspoint.batchservicedemo;
import javax.sql.DataSource;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.support.RunIdIncrementer;
import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
public DataSource dataSource;
@Bean
public FlatFileItemReader<User> reader() {
FlatFileItemReader<User> reader = new FlatFileItemReader<User>();
reader.setResource(new ClassPathResource("file.csv"));
reader.setLineMapper(new DefaultLineMapper<User>() {
{
setLineTokenizer(new DelimitedLineTokenizer() {
{
setNames(new String[] { "firstName", "lastName" });
}
});
setFieldSetMapper(new BeanWrapperFieldSetMapper<User>() {
{
setTargetType(User.class);
}
});
}
});
return reader;
}
@Bean
public UserItemProcessor processor() {
return new UserItemProcessor();
}
@Bean
public JdbcBatchItemWriter<User> writer() {
JdbcBatchItemWriter<User> writer = new JdbcBatchItemWriter<User>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<User>());
writer.setSql("INSERT INTO USERS (first_name, last_name) VALUES (:firstName, :lastName)");
writer.setDataSource(dataSource);
return writer;
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener) {
return jobBuilderFactory.get("importUserJob").incrementer(
new RunIdIncrementer()).listener(listener).flow(step1()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<User, User>chunk(10).reader(reader()).processor(processor()).writer(writer()).build();
}
}
reader() วิธีการใช้เพื่ออ่านข้อมูลจากไฟล์ CSV และวิธีการเขียน () ใช้เพื่อเขียนข้อมูลลงใน SQL
ต่อไปเราจะต้องเขียนคลาส Listener การแจ้งเตือนงานเสร็จสิ้น - ใช้ในการแจ้งเตือนหลังจากงานเสร็จสิ้น
package com.tutorialspoint.batchservicedemo;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.core.BatchStatus;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.listener.JobExecutionListenerSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Component;
@Component
public class JobCompletionNotificationListener extends JobExecutionListenerSupport {
private static final Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);
private final JdbcTemplate jdbcTemplate;
@Autowired
public JobCompletionNotificationListener(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("!!! JOB FINISHED !! It's time to verify the results!!");
List<User> results = jdbcTemplate.query(
"SELECT first_name, last_name FROM USERS", new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int row) throws SQLException {
return new User(rs.getString(1), rs.getString(2));
}
});
for (User person : results) {
log.info("Found <" + person + "> in the database.");
}
}
}
}
ตอนนี้สร้างไฟล์ JAR ที่ปฏิบัติการได้และเรียกใช้แอปพลิเคชัน Spring Boot โดยใช้คำสั่ง Maven หรือ Gradle ต่อไปนี้
สำหรับ Maven ให้ใช้คำสั่งดังภาพ -
mvn clean install
หลังจาก“ BUILD SUCCESS” คุณจะพบไฟล์ JAR ภายใต้ไดเร็กทอรีเป้าหมาย
สำหรับ Gradle คุณสามารถใช้คำสั่งดังภาพ -
gradle clean build
หลังจาก“ BUILD SUCCESSFUL” คุณจะพบไฟล์ JAR ภายใต้ไดเร็กทอรี build / libs
รันไฟล์ JAR โดยใช้คำสั่งที่ให้ไว้ที่นี่ -
java –jar <JARFILE>
คุณสามารถดูผลลัพธ์ในหน้าต่างคอนโซลดังที่แสดง -