0

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

4

1 回答 1

0

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

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

于 2021-11-17T09:34:02.543 回答