Tích hợp Spring Batch vào Spring Boot để đọc dữ liệu từ file CSV và lưu vào Database.

·

2 min read

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ó:

User.java

@Entity
public class User {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String username;
  private String address;
  // getters và setters
}

UserRepository.java

public interface UserRepository extends JpaRepository<User, Long> {
}

3. Tạo Cấu Hình Spring Batch

BatchConfig.java

@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);
    }
}