【问题标题】:Unable to launch Asyc Job In Spring Batch无法在 Spring Batch 中启动异步作业
【发布时间】:2018-01-15 12:26:58
【问题描述】:

我想做一个可以异步调用 Spring Batch 的 rest 服务,这样我就可以一次启动作业,它可以在后台运行,并且可以关闭 HTTP 连接。

我正在使用 JobOperator 启动具有以下配置的作业:

@Bean
    public JobLauncher jobLauncher() {
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setJobRepository(jobRepository);
        SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
        simpleAsyncTaskExecutor.setConcurrencyLimit(10);
        jobLauncher.setTaskExecutor(simpleAsyncTaskExecutor);
        return jobLauncher;
    }


    @Bean
    public JobOperator jobOperator() {
        SimpleJobOperator jobOperator = new SimpleJobOperator();
        jobOperator.setJobExplorer(jobExplorer);
        jobOperator.setJobLauncher(jobLauncher());
        jobOperator.setJobRegistry(jobRegistry);
        jobOperator.setJobRepository(jobRepository);
        return  jobOperator;
    };

使用上述配置,我无法按我想要的方式启动作业。 Here 我读到我们可以在不同的线程中启动作业,但没有观察到。知道为什么会观察到这种行为吗?

【问题讨论】:

  • 到底发生了什么?您的 REST 服务是否等到 Job 完成?由于您的配置对于异步 JobLauncher 似乎是正确的。
  • 是的,它等待作业完成,然后返回响应。
  • 您是否尝试过在您的 REST 控制器以及工作中步骤的读取器、处理器或写入器中添加带有 currentThread 的日志?这将帮助您更好地理解。我在我的项目中有相同的配置,它工作得很好。
  • 是的,我试过了。似乎它们在同一个线程上执行。 Spring启动时,我看到一条日志:No TaskExecutor has been set,默认为同步执行器。
  • 有趣的是,我得到了相同的日志,上面写着没有设置 TaskExecutor。但它仍然根据我配置的SimpleAsyncTaskExecutor 为作业创建新线程。

标签: java spring spring-mvc spring-batch


【解决方案1】:

终于,我得到了解决方案。问题出在 bean 的声明中。 JobLauncher bean 被 Spring Batch 的默认实现覆盖。我做了以下重命名,它按预期工作:

@Bean
public SimpleJobLauncher simpleJobLauncher() {
    SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);
    jobLauncher.setTaskExecutor(simpleAsyncTaskExecutor());
    return jobLauncher;
}

public SimpleAsyncTaskExecutor simpleAsyncTaskExecutor() {
    SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
    simpleAsyncTaskExecutor.setConcurrencyLimit(10);
    return simpleAsyncTaskExecutor;
}

@Bean
public JobOperator jobOperator() {
    SimpleJobOperator jobOperator = new SimpleJobOperator();
    jobOperator.setJobLauncher(simpleJobLauncher());
    jobOperator.setJobExplorer(jobExplorer);
    jobOperator.setJobRegistry(jobRegistry);
    jobOperator.setJobRepository(jobRepository);
    return  jobOperator;
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2015-12-05
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多