I’m using Spring Batch is my project and I am reading csv file and splitting it to multiple files using Employee Role and making the use of Classifier
and ClassifierCompositeItemWriter
. I’ve make the use if MultiResourceItemWriterBuilder
to build the object and create a multiple files once the itemCountLimitPerResource
is reached.
Now when I’m creating multiple files provided in resource, I also need to create control/audit file for it. This will mostly be an empty file. In the below screen shot code created 7 csv file, so I also to create 7 control/audit files. How can we leaverage the code?
MyConfig.java
package com.example;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder;
import org.springframework.batch.item.file.builder.MultiResourceItemWriterBuilder;
import org.springframework.batch.item.file.mapping.DefaultLineMapper;
import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
import org.springframework.batch.item.file.transform.PassThroughLineAggregator;
import org.springframework.batch.item.support.ClassifierCompositeItemWriter;
import org.springframework.batch.item.support.builder.ClassifierCompositeItemWriterBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.classify.Classifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import java.time.LocalDate;
@Configuration
public class MyJobConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public FlatFileItemReader<Employee> itemReader() {
DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
tokenizer.setNames("empId", "firstName", "lastName", "role");
DefaultLineMapper<Employee> employeeLineMapper = new DefaultLineMapper<>();
employeeLineMapper.setLineTokenizer(tokenizer);
employeeLineMapper.setFieldSetMapper(new EmployeeFieldSetMapper());
employeeLineMapper.afterPropertiesSet();
return new FlatFileItemReaderBuilder<Employee>()
.name("flatFileReader")
.linesToSkip(1)
.resource(new ClassPathResource("employee.csv"))
.lineMapper(employeeLineMapper)
.build();
}
@Bean
public ClassifierCompositeItemWriter<Employee> classifierCompositeItemWriter() throws Exception {
Classifier<Employee, ItemWriter<? super Employee>> classifier =
new EmployeeClassifier(
javaDeveloperItemWriter(),
pythonDeveloperItemWriter(),
cloudDeveloperItemWriter());
return new ClassifierCompositeItemWriterBuilder<Employee>()
.classifier(classifier)
.build();
}
@Bean
public ItemWriter<Employee> javaDeveloperItemWriter() {
FlatFileItemWriter<Employee> itemWriter = new FlatFileItemWriterBuilder<Employee>()
.lineAggregator(new PassThroughLineAggregator<>())
.name("itemsWriter")
.build();
return new MultiResourceItemWriterBuilder<Employee>()
.name("javaDeveloperItemWriter")
.delegate(itemWriter)
.resource(new FileSystemResource("AAA01.CPP.CA."+ LocalDate.now()))
.itemCountLimitPerResource(2)
.resourceSuffixCreator(index -> "-S1.V" + index+".K1.P1.data.csv")
.build();
}
@Bean
public ItemWriter<Employee> pythonDeveloperItemWriter() {
FlatFileItemWriter<Employee> itemWriter = new FlatFileItemWriterBuilder<Employee>()
.lineAggregator(new PassThroughLineAggregator<>())
.name("itemsWriter")
.build();
return new MultiResourceItemWriterBuilder<Employee>()
.name("pythonDeveloperItemWriter")
.delegate(itemWriter)
.resource(new FileSystemResource("AAA02.CPP.CA."+ LocalDate.now()))
.itemCountLimitPerResource(2)
.resourceSuffixCreator(index -> "-S1.V" + index+".K1.P1.data.csv")
.build();
}
@Bean
public ItemWriter<Employee> cloudDeveloperItemWriter() {
FlatFileItemWriter<Employee> itemWriter = new FlatFileItemWriterBuilder<Employee>()
.lineAggregator(new PassThroughLineAggregator<>())
.name("itemsWriter")
.build();
return new MultiResourceItemWriterBuilder<Employee>()
.name("cloudDeveloperItemWriter")
.delegate(itemWriter)
.resource(new FileSystemResource("AAA03.CPP.CA."+ LocalDate.now()))
.itemCountLimitPerResource(2)
.resourceSuffixCreator(index -> "-S1.V" + index+".K1.P1.data.csv")
.build();
}
@Bean
public Step step() throws Exception {
return stepBuilderFactory.get("step")
.<Employee, Employee>chunk(1)
.reader(itemReader())
.writer(classifierCompositeItemWriter())
.build();
}
@Bean
public Job job() throws Exception {
return jobBuilderFactory.get("job")
.start(step())
.build();
}
}
EmployeeClassifier.java
package com.example;
import org.springframework.batch.item.ItemWriter;
import org.springframework.classify.Classifier;
import lombok.Setter;
@Setter
public class EmployeeClassifier implements Classifier<Employee, ItemWriter<? super Employee>> {
private static final long serialVersionUID = 1L;
private ItemWriter<Employee> javaDeveloperFileItemWriter;
private ItemWriter<Employee> pythonDeveloperFileItemWriter;
private ItemWriter<Employee> cloudDeveloperFileItemWriter;
public EmployeeClassifier() {
}
public EmployeeClassifier(ItemWriter<Employee> javaDeveloperFileItemWriter,
ItemWriter<Employee> pythonDeveloperFileItemWriter,
ItemWriter<Employee> cloudDeveloperFileItemWriter) {
this.javaDeveloperFileItemWriter = javaDeveloperFileItemWriter;
this.pythonDeveloperFileItemWriter = pythonDeveloperFileItemWriter;
this.cloudDeveloperFileItemWriter = cloudDeveloperFileItemWriter;
}
@Override
public ItemWriter<? super Employee> classify(Employee employee) {
if(employee.getRole().equals("Java Developer")){
return javaDeveloperFileItemWriter;
}
else if(employee.getRole().equals("Python Developer")){
return pythonDeveloperFileItemWriter;
}
return cloudDeveloperFileItemWriter;
}
}