Tabla de contenido
Inicio de prueba de unidad de primavera
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