[英]Sent Response after Spring Batch completed Job in Spring Boot
我必须上传CSV,将其转换为Java对象,然后在数据库中保留。 我正在使用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();
}
}
似乎Spring Batch Job作为作业完成前发送给客户端的响应异步运行
如果作业启动器配置了异步任务执行器,则为true。 如果作业启动器使用同步任务执行器(默认设置),则作业将一直执行到完成为止。 但是在这种情况下,Web客户端将等待直到作业完成,这可能是您不想发生的事情(更多详细信息, 请参见: https : //docs.spring.io/spring-batch/4.0.x/ reference / html / job.html#runningJobsFromWebContainer )。
作业执行完成后,我需要向客户发送回复
如果您的作业执行时间足够快,可以被接受为Web请求的执行时间,那么您可以使用(默认)同步任务执行器。 在这种情况下,您可以在作业完成后发送响应。 但是如前所述,不建议长时间运行的作业,因为http请求可能在作业完成之前超时。
尝试使用org.springframework.web.context.request.async.DeferredResult
(或类似方法)会很丑陋,因为它不能解决问题。 因此,我认为您的用例没有可行的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.