728x90
Getting Started | Creating a Batch Service (spring.io)
basically we have a "JOB" to process.
Inside "JOB" there are 3 steps. Reader, Processor , Writer
package io.javabrains.ipldashboard.data;
import java.time.LocalDate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.batch.item.ItemProcessor;
import io.javabrains.ipldashboard.model.Match;
public class MatchDataProcessor implements ItemProcessor<MatchInput, Match> {
private static final Logger log = LoggerFactory.getLogger(MatchDataProcessor.class);
@Override
public Match process(final MatchInput matchInput) throws Exception {
Match match = new Match();
match.setId(Long.parseLong(matchInput.getId()));
match.setCity(matchInput.getCity());
match.setDate(LocalDate.parse(matchInput.getDate()));
match.setPlayerOfMatch(matchInput.getPlayer_of_match());
match.setVenue(matchInput.getVenue());
String firstInningsTeam, secondInningsTeam;
if ("bat".equals(matchInput.getToss_decision()))
{
firstInningsTeam = matchInput.getToss_winner();
secondInningsTeam = matchInput.getToss_winner().equals(matchInput.getTeam1())
? matchInput.getTeam2() : matchInput.getTeam1();
}
else
{
secondInningsTeam = matchInput.getToss_winner();
firstInningsTeam = matchInput.getToss_winner().equals(matchInput.getTeam1())
? matchInput.getTeam2() : matchInput.getTeam1();
}
match.setTeam1(firstInningsTeam);
match.setTeam2(secondInningsTeam);
match.setTossWinner(matchInput.getToss_winner());
match.setTossDecision(matchInput.getToss_decision());
match.setResult(matchInput.getResult());
match.setResultMargin(matchInput.getResult_margin());
match.setUmpire1(matchInput.getUmpire1());
match.setUmpire2(matchInput.getUmpire2());
return match;
}
}
First we implement "process" step. here MatchInput is raw csv file from kaggle and we wanted to process it and output as "Match" java class.
package io.javabrains.ipldashboard.data;
import javax.sql.DataSource;
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.batch.item.database.BeanPropertyItemSqlParameterSourceProvider;
import org.springframework.batch.item.database.JdbcBatchItemWriter;
import org.springframework.batch.item.database.builder.JdbcBatchItemWriterBuilder;
import org.springframework.batch.item.file.FlatFileItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import io.javabrains.ipldashboard.model.Match;
@Configuration
@EnableBatchProcessing
public class BatchConfig {
private final String[] FIELD_NAMES = new String[] {
"id","city","date","player_of_match","venue","neutral_venue","team1","team2","toss_winner","toss_decision","winner","result","result_margin","eliminator","method","umpire1","umpire2"
};
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public FlatFileItemReader<MatchInput> reader() {
return new FlatFileItemReaderBuilder<MatchInput>().name("MatchItemReader")
.resource(new ClassPathResource("/match-data/match-data.csv")).delimited()
.names(FIELD_NAMES)
.fieldSetMapper(new BeanWrapperFieldSetMapper<MatchInput>() {
{
setTargetType(MatchInput.class);
}
}).build();
}
@Bean
public MatchDataProcessor processor() {
return new MatchDataProcessor();
}
@Bean
public JdbcBatchItemWriter<Match> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Match>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("INSERT INTO match (id,city,date,player_of_match,venue,team1,team2,toss_winner,toss_decision,match_winner,result,result_margin,umpire1,umpire2) "+
" VALUES (:id,:city,:date,:playerOfMatch,:venue,:team1,:team2,:tossWinner,:tossDecision,:matchWinner,:result,:resultMargin,:umpire1,:umpire2)")
.dataSource(dataSource).build();
}
@Bean
public Job importUserJob(JobCompletionNotificationListener listener, Step step1) {
return jobBuilderFactory.get("importUserJob")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(step1)
.end()
.build();
}
@Bean
public Step step1(JdbcBatchItemWriter<Match> writer) {
return stepBuilderFactory.get("step1")
.<MatchInput, Match> chunk(10)
.reader(reader())
.processor(processor())
.writer(writer)
.build();
}
}
here in step1 method we read 10 rows from our csv file and process it make it to Match.class format and writer we just print it on console.
728x90
'WEB > Spring Batch' 카테고리의 다른 글
스프링 배치 실행 - Flow (0) | 2023.03.03 |
---|---|
스프링 배치 실행 - Step (0) | 2023.02.28 |
스프링 배치 실행 - Job (0) | 2023.02.23 |
스프링 배치 도메인 이해 (0) | 2023.02.17 |
스프링 배치 소개 + 시작 (0) | 2023.02.16 |