在默认的情况下任务的调用并不是异步执行的。

这会导致前端会返回 500 服务器错误,因为一个任务的执行时间可能会超过几分钟。


如上面的图片显示的错误,API 返回了超时。

解决办法

可以配置 Batch 批量程序采取异步执行的方式。

Spring RestController 的代码不需要改变,还是使用 JobLauncher 来运行的。

代码如下:

        JobParameters jobParameters = new JobParametersBuilder().addDate("timestamp", new Date()).toJobParameters();

JobExecution jobExecution = jobLauncher.run(cloudSyncJob, jobParameters);
logger.debug("JOB ID - [{}]", jobExecution.getJobId());

需要修改的地方是你的 Batch 配置类。

需要增加下面这段代码。

    /**
* Config to async run Batch Jobs
*
* @param jobRepository
* @return
*/
@Bean
public SimpleJobLauncher simpleJobLauncher(JobRepository jobRepository) {
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(jobRepository);
jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
return jobLauncher;
}

这里面最关键的一句话就是:

​jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());​


上面的这段代码是最关键的部分。