Spring Batch là gì ?

Tổng quan

Bài viết này mình sẽ giới thiệu tới mọi người một khái niệm đó là Spring Batch. Vậy Spring Batch là gì ? Cùng tìm hiểu ở bài viết này nhé

1. Một số khái niệm cơ bản

a. Batch

  • Batch là gì ? Batch hay còn được gọi là Batch Processing, là chương trình thực hiện một loạt các bước mà không chịu sự can thiệp từ người dùng.
  • Batch có thể được dùng để lập lịch biểu và cung cấp các tài nguyên cho phép.

b. Spring Batch

Spring Batch là một Framework xử lý batch (một chuỗi các công việc). một công việc bao gồm nhiều steps và mỗi step bao gồm một nhiệm vụ là READ-PROCESS-WRITE.

c. Mybatis

MyBatis là một class persistence framework được tạo ra để hỗ trợ cho việc sử dụng SQL, dùng để lưu trữ và nâng cao khả năng liên kết

2. Cấu trúc của Spring Batch

Cấu trúc của một Spring Batch bao gồm 4 thành phần như sau:

  • JobLaucher là một Interface cho một thực thi Job thực hiện truyền tham số đầu vào .
  • Job đã được định nghĩa ở trên sẽ nhận tham số truyền vào từ JobLaucher và thực thi từng bước đã được định nghĩa trong Job.
  • Step được định nghĩa để điều khiển các cách thức hoạt động của batch processing. Các thành phần Step trong step bao gồm: Item Reader, Item Writer, Item Processor.
  • JobRepository cung cấp CRUD cho JobLaucher, Job, Step trong quá trình thực thi.

3. Ví dụ về Spring Batch với JobRepository

a. Cài đặt thư viện

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-batch'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework.batch:spring-batch-test'
}Code language: JavaScript (javascript)

Cấu hình 

Cài đặt file application.properties:

spring.batch.initialize-schema=always

Tạo một class DataSourceConfiguration để cấu hình kết nối tới cơ sở dữ liệu MySQL

DataSourceConfiguration.java

package com.example.demo.configure;

import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfiguration {
    @Bean
    public DataSource dataSource(){
        return DataSourceBuilder
                .create()
                .username("root")
                .password("123456")
                .url("jdbc:mysql://localhost:3306/demo-spring-batch")
                .build();
    }
}
Code language: JavaScript (javascript)

Cấu hình Batch bằng class BatchConfiguration.java như sau

BatchConfiguration.java

package com.example.demo.configure;

import org.springframework.batch.core.configuration.annotation.BatchConfigurer;
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.explore.JobExplorer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
@EnableBatchProcessing
@Import({DataSourceConfiguration.class})
public class BatchConfiguration implements BatchConfigurer {
    @Autowired
    private DataSource dataSource;

    @Override
    public JobRepository getJobRepository() throws Exception {
        return createNewJobRepository();
    }

    @Override
    public PlatformTransactionManager getTransactionManager() throws Exception {
        return new DataSourceTransactionManager(dataSource);
    }

    @Override
    public JobLauncher getJobLauncher() throws Exception {
        return null;
    }

    @Override
    public JobExplorer getJobExplorer() throws Exception {
        return null;
    }

    public JobRepository createNewJobRepository() throws Exception {
        JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
        factory.setDataSource(dataSource);
        factory.setTransactionManager(getTransactionManager());
        factory.afterPropertiesSet();
        return factory.getObject();
    }

    @Bean
    public PlatformTransactionManager platformTransactionManager() throws Exception {
        return getTransactionManager();
    }
    @Bean
    public JobRepository jobRepository() throws Exception {
        return getJobRepository();
    }
}
Code language: PHP (php)

Controller

Chúng ta tạo một controller có tên là DemoController để kiểm tra thử như sau

package com.example.demo.controller;

import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.batch.core.repository.JobRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class DemoController {
    @Autowired
    private JobRepository jobRepository;

    @Autowired
    private DefaultBatchConfigurer defaultBatchConfigurer;

    @GetMapping("/jobRepository")
    @ResponseBody
    public String execute() throws Exception {
        JobParametersBuilder jobParametersBuilder = new JobParametersBuilder();
        jobParametersBuilder.addString("firstParameter", "1");
        defaultBatchConfigurer.getJobRepository().createJobExecution("Quân", jobParametersBuilder.toJobParameters());
        return "<h1>Batch Success</h1>";
    }
}
Code language: JavaScript (javascript)

Vậy là xong chúng ta hãy cùng chạy thử và cảm nhận nhé ^^

Leave a Reply

Your email address will not be published. Required fields are marked *