Método de inicio del trabajo Spring Batch

Tabla de contenido

introducción

Arranque de primavera

Inicio de prueba de unidad de primavera

Lanzamiento de API RESTful

Pasar a la versión de video


introducción

Seguido por el artículo anterior: Tablas de datos de procesamiento por lotes de Spring Batch , comprenda que Spring Batch involucra tablas de datos y luego aprenda cómo iniciar trabajos de procesamiento por lotes de Spring Batch. Estos son los tres más utilizados.

Arranque de primavera

Hasta ahora, todos los casos anteriores han utilizado las funciones nativas de Spring Boot para iniciar trabajos. Su clase principal es JobLauncherApplicationRunner. Después de que se inicia Spring Boot, el método de ejecución de esta clase se llama inmediatamente y luego la operación se delega a la ejecución de la clase SimpleJobLauncher. método para la ejecución. De forma predeterminada, Spring Boot ejecuta trabajos tan pronto como se inician. Si no desea ejecutarlo cuando se inicia Spring Boot, puede modificarlo a través de la configuración.

spring:
  batch:
    job:
      enabled: false   #false表示不启动

Inicio de prueba de unidad de primavera

Si simplemente desea verificar si la lógica de procesamiento por lotes puede ejecutarse durante el desarrollo, puede usar el método de prueba unitaria para iniciar el trabajo.

Primero introduzca dependencias de prueba de prueba de primavera

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

Crear una clase de inicio

@SpringBootApplication
@EnableBatchProcessing
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

Crear clase de prueba

package com.langfeiyes.batch._14_job_start_test;

import org.junit.jupiter.api.Test;
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest(classes = App.class)
public class StartJobTest {
    //job调度器
    @Autowired
    private JobLauncher jobLauncher;
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    @Autowired
    private StepBuilderFactory stepBuilderFactory;
    public Tasklet tasklet(){
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello SpringBatch....");
                return RepeatStatus.FINISHED;
            }
        };
    }
    public Step  step1(){
        TaskletStep step1 = stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
        return step1;
    }
    //定义作业
    public Job job(){
        Job job = jobBuilderFactory.get("start-test-job")
                .start(step1())
                .build();
        return job;
    }

    @Test
    public void testStart() throws Exception{
        //job作业启动
        //参数1:作业实例,参数2:作业运行携带参数
        jobLauncher.run(job(), new JobParameters());
    }
}

La diferencia con el inicio anterior de SpringBoot es que se adquiere el objeto JobLauncher y luego este objeto llama al método de ejecución para iniciar.

Lanzamiento de API RESTful

¿Qué debo hacer si el procesamiento por lotes no se inicia cuando se inicia SpringBoot, sino que se controla a través de solicitudes web? No es difícil, solo introduce el entorno web.

1> En primer lugar, está restringido y no se inicia con el inicio de SpringBoot

spring:
  batch:
    job:
      enabled: false   #false表示不启动

2>Introducir el entorno web

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3> Escribe la clase de inicio

@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }
}

4> Clase de configuración de escritura

package com.langfeiyes.batch._15_job_start_restful;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
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.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.core.step.tasklet.TaskletStep;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@EnableBatchProcessing
@Configuration
public class BatchConfig {
    @Autowired
    private JobBuilderFactory jobBuilderFactory;
    @Autowired
    private StepBuilderFactory stepBuilderFactory;

    @Bean
    public Tasklet tasklet(){
        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
                System.out.println("Hello SpringBatch....");
                return RepeatStatus.FINISHED;
            }
        };
    }

    @Bean
    public Step step1(){
        TaskletStep step1 = stepBuilderFactory.get("step1")
                .tasklet(tasklet())
                .build();
        return step1;
    }
    //定义作业
    @Bean
    public Job job(){
        Job job = jobBuilderFactory.get("hello-restful-job")
                .start(step1())
                .build();
        return job;
    }
}

5> Escribe la clase Controlador

package com.langfeiyes.batch._15_job_start_restful;

import org.springframework.batch.core.*;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.repository.JobExecutionAlreadyRunningException;
import org.springframework.batch.core.repository.JobInstanceAlreadyCompleteException;
import org.springframework.batch.core.repository.JobRestartException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;
import java.util.Properties;

@RestController
public class HelloController {
    @Autowired
    private JobLauncher jobLauncher;
    @Autowired
    private Job job;
    @GetMapping("/job/start")
    public ExitStatus start() throws Exception {
         //启动job作业
        JobExecution jobExet = launcher.run(job, jp);
        return jobExet.getExitStatus();
    }
}

6>Prueba

Nota: Si necesita recibir parámetros

 

1> El trabajo utiliza el incremento automático de run.id

//构造一个job对象
@Bean
public Job job(){
    return jobBuilderFactory.get("hello-restful-job")
        .start(step1())
        .incrementer(new RunIdIncrementer())
        .build();
}

 2> Cambiar el método de interfaz HelloController

@RestController
public class HelloController {
    @Autowired
    private JobLauncher launcher;
    @Autowired
    private Job job;
    @Autowired
    private JobExplorer jobExplorer;  //job 展示对象
    @GetMapping("/job/start")
    public ExitStatus startJob(String name) throws Exception {
        //启动job作业
        JobParameters jp = new JobParametersBuilder(jobExplorer)
                .getNextJobParameters(job)
                .addString("name", name)
                .toJobParameters();
        JobExecution jobExet = launcher.run(job, jp);
        return jobExet.getExitStatus();
    }
}

En este punto, este artículo ha terminado. Si quieres saber qué sucederá a continuación, escucha el siguiente capítulo para desglosarlo ~

Pasar a la versión de video

Si no es adicto a leer texto, puede cambiar a la versión de video: el marco de procesamiento por lotes eficiente de Spring Batch en la práctica

Supongo que te gusta

Origin blog.csdn.net/langfeiyes/article/details/128894550
Recomendado
Clasificación