How it Works
- We can define the Size of Jobreader and Job Processor. In other words the no of records to be processed could be set using Jobreader and job processor
- We dont have control over Jobwriter. Jobreader and JobProcessor honors chunk size
SimpleJobReader.java
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.NonTransientResourceException;
import org.springframework.batch.item.ParseException;
import org.springframework.batch.item.UnexpectedInputException;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
@Component
public class SimpleJobReader implements ItemReader<Integer> {
List<Integer> arrNum = Arrays.asList(1,2,3,4,5,6,7,8,9);
int chunkSize = 3;
int index = 0;
@Override
public Integer read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
System.out.println("Inside Job Reader");
if(index < arrNum.size()){
int num = arrNum.get(index);
index++;
return num;
}
index = 0;
return null;
}
}
SimpleJobProcessor.java
import org.springframework.batch.item.ItemProcessor;
import org.springframework.stereotype.Component;
@Component
public class SimpleJobProcessor implements ItemProcessor<Integer, Long> {
@Override
public Long process(Integer item) throws Exception {
System.out.println("Inside Job Processor");
return Long.valueOf(item);
}
}
SimpleJobWriter.java
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;
import org.springframework.stereotype.Component;
@Component
public class SimpleJobWriter implements ItemWriter<Long> {
@Override
public void write(Chunk<? extends Long> items) throws Exception {
System.out.println("Inside Job Writer");
items.getItems().forEach(System.out::println);
}
}
SimpleJobWriter.java
@Configuration
public class BatchConfig {
@Autowired
ItemReader simpleJobReader;
@Autowired
ItemWriter simpleJobWriter;
@Autowired
ItemProcessor simpleJobProcessor;
@Bean
public Job job(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new JobBuilder("job", jobRepository)
.incrementer(new RunIdIncrementer())
.start(simpleTaskletStep(jobRepository, transactionManager))
.next(simpleChunkStep(jobRepository, transactionManager))
.build();
}
@Bean
public Step simpleChunkStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
StepBuilder stepBuilderOne = new StepBuilder("Chunk Oriented Step", jobRepository);
return stepBuilderOne
.chunk(3, transactionManager)
.reader(simpleJobReader)
.processor(simpleJobProcessor)
.writer(simpleJobWriter)
.build();
}
@Bean
public Step simpleTaskletStep(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
StepBuilder stepBuilderOne = new StepBuilder("Tasklet Oriented Step", jobRepository);
return stepBuilderOne
.tasklet(simpleTaskLet(), transactionManager)
.build();
}
@Bean
public Tasklet simpleTaskLet(){
return (StepContribution contribution, ChunkContext chunkContext) -> {
return RepeatStatus.FINISHED;
};
}
}
Output
Inside Job Reader Inside Job Reader Inside Job Reader Inside Job Processor Inside Job Processor Inside Job Processor Inside Job Writer 1 2 3 Inside Job Reader Inside Job Reader Inside Job Reader Inside Job Processor Inside Job Processor Inside Job Processor Inside Job Writer 4 5 6 Inside Job Reader Inside Job Reader Inside Job Reader Inside Job Processor Inside Job Processor Inside Job Processor Inside Job Writer 7 8 9 Inside Job Reader