[英]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.