gpt4 book ai didi

java - Spring Batch 在 Spring Boot 中完成作业后发送响应

转载 作者:行者123 更新时间:2023-12-02 10:46:17 24 4
gpt4 key购买 nike

我必须上传 CSV,将其转换为 Java 对象,然后保存在数据库中。我使用 Spring Boot 和 Spring Batch 来实现此目的。我已经完成了多个教程。在分析这些之后,Spring Batch Job 似乎作为在作业完成之前发送到客户端的响应异步运行。但我需要在作业执行完成后向客户端发送响应。可以做吗?请帮助解决这个问题。谢谢我的 Controller 代码如下:

@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();
}

}

最佳答案

it seems Spring Batch Job run asynchronously as response sent to client before job completion

如果作业启动器配置了异步任务执行器,则情况如此。如果作业启动器使用同步任务执行器(这是默认的),则作业将被执行直到完成。但在这种情况下,Web 客户端将等待作业完成,这可能是您不希望发生的情况(更多详细信息: https://docs.spring.io/spring-batch/4.0.x/reference/html/job.html#runningJobsFromWebContainer )。

I need to send response to client after job execution completed

如果您的作业执行时间足够快,可以接受作为 Web 请求的执行时间,那么您可以使用(默认)同步任务执行器。在这种情况下,您可以在作业完成后发送响应。但如前所述,对于长时间运行的作业,不建议这样做,因为 http 请求可能会在作业完成之前超时。

尝试使用org.springframework.web.context.request.async.DeferredResult(或类似的方法)将是一个丑陋的黑客,因为它不能解决问题。因此,我没有看到适合您的用例的可行选项。

关于java - Spring Batch 在 Spring Boot 中完成作业后发送响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52550350/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com