Я начал изучать Spring Boot Batch в версии 2.1.4
Я хочу запустить свою работу в планировщике, и эта работа выполняется только один раз. Я имею в виду ItemProcessor и ItemWriter запускаются только один раз. ItemReader запускается каждый раз. У кого-нибудь есть идея, что я сделал не так. В будущем я хочу изменить планировщик на Java WatchService и передать filePath в задание, но теперь параметр для filePath похож на строку в параметре функции. Это мой код:
Это мой читатель:
@Component
public class UserReaderImpl {
@StepScope
public ItemReader<UserCsvStructure> read(String filepath) {
FlatFileItemReader<UserCsvStructure> reader = new FlatFileItemReader();
reader.setLinesToSkip(1);
reader.setResource(new FileSystemResource(filepath));
reader.setLineMapper(new DefaultLineMapper<UserCsvStructure>() {
{
setLineTokenizer(new DelimitedLineTokenizer() {
{
setNames(new String[]{"firstName","lastName","email"});
}
});
setFieldSetMapper(new BeanWrapperFieldSetMapper<UserCsvStructure>() {
{
setTargetType(UserCsvStructure.class);
}
});
}
});
return reader;
}
}
Это в моем ItemProcessor
@StepScope
@Component
public class UserProcessorImpl implements ItemProcessor<UserCsvStructure, User> {
@Override
public User process(UserCsvStructure userCsvStructure) throws Exception {
return User.builder()
.email(userCsvStructure.getEmail())
.firstName(userCsvStructure.getFirstName())
.lastName(userCsvStructure.getLastName())
.build();
}
}
Это мой ItemWriter
@Component
@StepScope
public class UserWriterImpl implements ItemWriter<User>{
@Autowired
private UserRepository userRepository;
@Override
public void write(List<? extends User> list) throws Exception {
System.out.println(list);
userRepository.saveAll(list);
}
}
А это моя конфигурация
@Component
public class UserBatchCsvConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Autowired
private UserReaderImpl userReader;
@Autowired
private UserWriterImpl userWriter;
@Autowired
private UserProcessorImpl userProcessor;
public Job csvFileToDatabaseJob(UserJobCompletionNotificationListener listener, String fileName) {
return jobBuilderFactory.get("userCsvProcess")
.incrementer(new RunIdIncrementer())
.listener(listener)
.flow(csvFileToDatabaseStep(fileName))
.end()
.build();
}
private Step csvFileToDatabaseStep(String fileName) {
return stepBuilderFactory.get("userCsvProcess")
.<UserCsvStructure, User>chunk(1)
.reader(userReader.read(fileName))
.processor(userProcessor)
.writer(userWriter)
.build();
}
}
Последний класс - мой планировщик:
@Component
public class UserCsvProcessor {
@Autowired
private JobLauncher jobLauncher;
@Autowired
private UserBatchCsvConfig job;
@Autowired
private UserJobCompletionNotificationListener userJobCompletionNotificationListener;
@Scheduled(fixedDelay = 10000)
public void runJob() throws Exception {
jobLauncher.run(job.csvFileToDatabaseJob(userJobCompletionNotificationListener, "C:\\Users\\Anik\\Desktop\\angular\\test.csv"), new JobParameters());
}
}