Learn to create Spring batch job (with multiple steps) with Java configuration. It uses Spring Boot 2, Spring batch 4 and H2 database to execute batch job.
Table of Contents Project Structure Maven Dependencies Add Tasklets Spring Batch Configuration Demo
Project Structure
In this project, we will create a simple job with 2 step tasks and execute the job to observe the logs. Job execution flow will be –
- Start job
- Execute task one
- Execute task two
- Finish job
Maven Dependencies
We need to include
spring-boot-starter-batch
dependency. Spring batch relies on job repository which is persistent data store. So we need one DB as well. I am using H2 (in-memory database) which integrates well with spring batch. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd; <modelVersion>4.0.0</ modelVersion > < groupId >com.howtodoinjava</ groupId > < artifactId >App</ artifactId > < version >0.0.1-SNAPSHOT</ version > < packaging >jar</ packaging > < name >App</ name > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >2.0.3.RELEASE</ version > </ parent > < properties > < project.build.sourceEncoding >UTF-8</ project.build.sourceEncoding > </ properties > < dependencies > < dependency > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-batch</ artifactId > </ dependency > < dependency > < groupId >com.h2database</ groupId > < artifactId >h2</ artifactId > < scope >runtime</ scope > </ dependency > </ dependencies > < build > < plugins > < plugin > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-maven-plugin</ artifactId > </ plugin > </ plugins > </ build > < repositories > < repository > < id >repository.spring.release</ id > < name >Spring GA Repository</ name > </ repository > </ repositories > </ project > |
Add Tasklets
The first step is to create few tasks which will be run in some sequence to form a job. In Spring batch, they are implemented as
Tasklet
.import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; public class MyTaskOne implements Tasklet { public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println( "MyTaskOne start.." ); // ... your code System.out.println( "MyTaskOne done.." ); return RepeatStatus.FINISHED; } } |
import org.springframework.batch.core.StepContribution; import org.springframework.batch.core.scope.context.ChunkContext; import org.springframework.batch.core.step.tasklet.Tasklet; import org.springframework.batch.repeat.RepeatStatus; public class MyTaskTwo implements Tasklet { public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { System.out.println( "MyTaskTwo start.." ); // ... your code System.out.println( "MyTaskTwo done.." ); return RepeatStatus.FINISHED; } } |
Spring Batch Configuration
This is major step where you define all the job related configurations and it’s execution logic.
package com.howtodoinjava.demo.config; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; 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.launch.support.RunIdIncrementer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.howtodoinjava.demo.tasks.MyTaskOne; import com.howtodoinjava.demo.tasks.MyTaskTwo; @Configuration @EnableBatchProcessing public class BatchConfig { @Autowired private JobBuilderFactory jobs; @Autowired private StepBuilderFactory steps; @Bean public Step stepOne(){ return steps.get( "stepOne" ) .tasklet( new MyTaskOne()) .build(); } @Bean public Step stepTwo(){ return steps.get( "stepTwo" ) .tasklet( new MyTaskTwo()) .build(); } @Bean public Job demoJob(){ return jobs.get( "demoJob" ) .incrementer( new RunIdIncrementer()) .start(stepOne()) .next(stepTwo()) .build(); } } |
Demo
Now our simple job
'demoJob'
is configured and ready to be executed. I am using CommandLineRunner
interface to execute the job automatically, with JobLauncher
, when the application is fully started.package com.howtodoinjava.demo; import org.springframework.batch.core.Job; import org.springframework.batch.core.JobParameters; import org.springframework.batch.core.JobParametersBuilder; import org.springframework.batch.core.launch.JobLauncher; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class App implements CommandLineRunner { @Autowired JobLauncher jobLauncher; @Autowired Job job; public static void main(String[] args) { SpringApplication.run(App. class , args); } @Override public void run(String... args) throws Exception { JobParameters params = new JobParametersBuilder() .addString( "JobID" , String.valueOf(System.currentTimeMillis())) .toJobParameters(); jobLauncher.run(job, params); } } |
Notice the console logs.
o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=demoJob]] launched with the following parameters: [{JobID= 1530697766768 }] o.s.batch.core.job.SimpleStepHandler : Executing step: [stepOne] MyTaskOne start.. MyTaskOne done.. o.s.batch.core.job.SimpleStepHandler : Executing step: [stepTwo] MyTaskTwo start.. MyTaskTwo done.. o.s.b.c.l.support.SimpleJobLauncher : Job: [SimpleJob: [name=demoJob]] completed with the following parameters: [{JobID= 1530697766768 }] and the following status: [COMPLETED] |
Reference:Spring also automatically run batch jobs configured. To disable auto-run of jobs, you need to usespring.batch.job.enabled
property in application.properties file.
application.properties spring.batch.job.enabled=
false
- HowToDoInJava.com - Spring Batch Multiple Steps
- StackOverflow - Spring Batch - Running Specific Job using @Qualifier
- StackOverflow - Spring Batch - Auto Create / Initialize Batch Table
- StackOverflow - Spring Batch - Get Parameter Inside Step
0 komentar: