我想使用 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());
,那么它会失败而不会记录任何错误。