Spring Batch-如何并行运行多个作业

时间:2019-07-11 13:16:00

标签: spring-batch

我在BatchScheduler中有多个计划的作业,该作业在特定时间运行。简单的内置JobLauncher,它是同步的。本质上是最初使用的。 现在,我想并行运行作业,以便没有任何作业可以等待其他作业完成。

我尝试在不同的工作上使用@Async批注,但没有成功。

我还尝试为每个作业创建不同的JobLauncher对象,但是它也没有用。

然后,我尝试设置jobLauncher.setTaskExecutor(new SimpleAsyncTaskExecutor())。 但这没有用。

我也尝试过@Bean

public JobLauncher jobLauncher() {
    final SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
    jobLauncher.setJobRepository(jobRepository);
    final SimpleAsyncTaskExecutor simpleAsyncTaskExecutor = new SimpleAsyncTaskExecutor();
    jobLauncher.setTaskExecutor(simpleAsyncTaskExecutor);
    return jobLauncher;
 }

我尝试了在不同的stackoverflow答案中给出的所有组合,但是没有用。

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

实际: 但这也没有用。

就像我检查批处理表中批处理作业的开始时间一样。一项作业完成后,作业开始。

预期: 作业应并行运行。

1 个答案:

答案 0 :(得分:0)

此配置对我有用:

import org.springframework.batch.core.configuration.annotation.DefaultBatchConfigurer;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.launch.support.SimpleJobLauncher;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;


@Configuration
public class TaskExecutorBatchConfigurer extends DefaultBatchConfigurer {

	@Bean
	public ThreadPoolTaskScheduler batchTaskScheduler() {
		ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
		threadPoolTaskScheduler.setPoolSize(10);
		threadPoolTaskScheduler.afterPropertiesSet();
		return threadPoolTaskScheduler;
	}
	

	@Override
	protected JobLauncher createJobLauncher() throws Exception {
		SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
		jobLauncher.setJobRepository(super.getJobRepository());
		jobLauncher.setTaskExecutor(batchTaskScheduler());
		jobLauncher.afterPropertiesSet();
		return jobLauncher;
	}
}