【问题标题】:How to run SystemCommandTasklet asynchronously如何异步运行 SystemCommandTasklet
【发布时间】: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


    【解决方案1】:

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

    添加new SimpleAsyncTaskExecutor() 确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 2011-08-19
      相关资源
      最近更新 更多