【发布时间】: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());,那么它会失败并且不会记录任何错误。
【问题讨论】:
标签: spring spring-boot spring-batch spring-batch-tasklet