如何异步运行 SystemCommandTasklet

Posted

技术标签:

【中文标题】如何异步运行 SystemCommandTasklet【英文标题】:How to run SystemCommandTasklet asynchronously 【发布时间】: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());,那么它会失败并且不会记录任何错误。

【问题讨论】:

【参考方案1】:

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

添加new SimpleAsyncTaskExecutor() 确实有效。

【讨论】:

以上是关于如何异步运行 SystemCommandTasklet的主要内容,如果未能解决你的问题,请参考以下文章

如何在主异步循环内的同步子进程内运行多个异步循环?

如何在 C++ 中运行异步增强功能?

如何使用调度库运行异步函数?

如何使 SqlDataReader.ReadAsync() 异步运行?

如何使 SqlDataReader.ReadAsync() 异步运行?

如何使用不同的参数异步运行很多函数?