Мне нужно загрузить CSV, преобразовать его в Java Object и затем сохранить в базе данных.Я использую Spring Boot с Spring Batch для достижения этой цели.Я прошел несколько уроков.После их анализа кажется, что Spring Batch Job выполняется асинхронно как ответ, отправленный клиенту до завершения задания.Но мне нужно отправить ответ клиенту после выполнения задания.Возможно ли это сделать?Пожалуйста, помогите решить эту проблему.Спасибо, мой код контроллера выглядит следующим образом:
@RestController
public class AppRestCtrl {
Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@PostMapping("/processFile")
public ResponseEntity convertCsvToObject(@RequestParam("fileData") MultipartFile file) throws Exception {
final Path rootLocation = Paths.get("uploads");
if(!Files.exists(rootLocation)) {
Files.createDirectories(rootLocation);
}
if(file.isEmpty()) {
return ResponseEntity.badRequest().body("Empty File Not Allowed");
}
if(!file.getOriginalFilename().contains(".csv")) {
return ResponseEntity.badRequest().body("File is Invalid!");
}
Files.deleteIfExists(rootLocation.resolve(file.getOriginalFilename()));
Files.copy(file.getInputStream(), rootLocation.resolve(file.getOriginalFilename()));
try {
JobParameters jobParameters = new JobParametersBuilder().addLong("time", System.currentTimeMillis())
.toJobParameters();
jobLauncher.run(job, jobParameters);
} catch (Exception e) {
logger.info(e.getMessage());
return ResponseEntity.ok("Batch Process Started Successfully!");
}
}
Пакетный файл конфигурации:
@Configuration
public class BatchConfig {
@Autowired
public JobBuilderFactory jobBuilderFactory;
@Autowired
public StepBuilderFactory stepBuilderFactory;
@Bean
public Job job() {
return jobBuilderFactory.get("job").incrementer(new RunIdIncrementer()).listener(new Listener())
.flow(step1()).end().build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1").<ObjectNode, JsonNode>chunk(1)
.reader(Reader.reader("uploads\\students.csv"))
.processor(new Processor()).writer(new Writer()).build();
}
}