如何异步运行 SystemCommandTasklet
Posted
技术标签:
【中文标题】如何异步运行 SystemCommandTasklet【英文标题】:How to run SystemCommandTasklet asynchronously 【发布时间】:2021-12-25 22:46:58 【问题描述】:我想使用 Spring Batch 运行一个 shell 脚本并让批处理控制作业 ID 和状态。但我不希望我的应用等待/挂起,直到这个 shell 脚本 (SystemCommandTasklet) 完成。
@Override
@Bean(name = "myJobLauncher")
public SimpleJobLauncher getJobLauncher() throws Exception
SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
jobLauncher.setJobRepository(getJobRepository());
//jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
jobLauncher.afterPropertiesSet();
return jobLauncher;
@Bean
public Step myStep(Tasklet tasklet)
return this.stepBuilderFactory.get("myStep")
.listener(tasklet)
.tasklet(tasklet)
.build();
@Bean
@StepScope
public SystemCommandTasklet systemCommandTasklet(@Value("#jobParameters['dir']") String dir,
@Value("#jobParameters['command']") String command)
SystemCommandTasklet tasklet = new SystemCommandTasklet();
tasklet.setWorkingDirectory(dir);
tasklet.setCommand(command);
tasklet.setTimeout(100000);
return tasklet;
当我运行上面的代码时,批处理/应用程序会等到“命令”完成。
如果我添加jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor());
,那么它会失败并且不会记录任何错误。
【问题讨论】:
【参考方案1】:我的代码的不同部分有问题。
添加new SimpleAsyncTaskExecutor()
确实有效。
【讨论】:
以上是关于如何异步运行 SystemCommandTasklet的主要内容,如果未能解决你的问题,请参考以下文章
如何使 SqlDataReader.ReadAsync() 异步运行?