Tích hợp Spring Batch vào Spring Boot để đọc dữ liệu từ file CSV và lưu vào Database.
1. Thêm Dependencies
Chắc chắn đã thêm các dependency cần thiết vào pom.xml
:
<dependencies>
<!-- ... các dependency khác ... -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- ... -->
</dependencies>
2. Tạo Model và Repository
Tạo model User
và repository UserRepository
nếu bạn chưa có:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String username;
private String address;
// getters và setters
}
public interface UserRepository extends JpaRepository<User, Long> {
}
3. Tạo Cấu Hình Spring Batch
@Configuration
@EnableBatchProcessing
public class BatchConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private UserRepository userRepository;
// Các Bean cấu hình khác
}
4. Tạo ItemReader, ItemProcessor và ItemWriter
Chúng ta đã thảo luận chi tiết về việc tạo các component này trong các câu trả lời trước, nên tôi sẽ không lặp lại ở đây.
5. Tạo Step và Job
Bổ sung vào BatchConfig
:
@Bean
public Step step1(JpaItemWriter<User> writer) {
return stepBuilderFactory.get("step1")
.<User, User> chunk(10)
.reader(reader())
.processor(new UserItemProcessor())
.writer(writer)
.build();
}
@Bean
public Job importUserJob(Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.flow(step1)
.end()
.build();
}
6. Kích hoạt Job
CommandLineRunner
hoặc các phương pháp kích hoạt khác cho Spring Batch, bạn có thể đặt chúng trong bất kỳ lớp @Component
nào. Chẳng hạn, bạn có thể tạo một lớp mới có tên BatchJobLauncher
hoặc tương tự:
username,address
john,123 Main St
jane,456 Elm St
doe,789 Oak St
@Component
public class BatchJobLauncher implements CommandLineRunner {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private Job job;
@Override
public void run(String... args) throws Exception {
JobParameters params = new JobParametersBuilder()
.addString("JobID", String.valueOf(System.currentTimeMillis()))
.toJobParameters();
jobLauncher.run(job, params);
}
}