如何异步 运行 SystemCommandTasklet

How to run SystemCommandTasklet asynchronously

我想 运行 使用 Spring 批处理的 shell 脚本,让批处理控制作业 ID 和状态。但是我不希望我的应用程序 wait/hang 直到 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;
    }

当我运行上面的代码时,batch/application等待直到'command'完成。 如果我添加 jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor()); 那么它会失败并且没有记录任何错误。

我的代码的不同部分有问题。

添加 new SimpleAsyncTaskExecutor() 实际上有效。