Spring Batch - 并行运行多个作业

标签 spring parallel-processing spring-integration spring-batch

我是 Spring Batch 的新手,不知道如何做到这一点..

基本上,我有一个 spring 文件轮询器,它每 N 分钟运行一次,以在某个目录中查找具有某些名称(例如:A.txt 和 B.txt)的文件。在任何时刻,该目录中最多可以有 2 个文件(A 和 B)。通过Spring Batch Job,这两个文件将被处理并持久化到2个不同的数据库表中。

这些文件有些相似,因此使用相同的处理器/编写器。

现在按照我设置的方式,每个轮询周期 1 个文件都会被拾取并运行作业。

假设目录中有 2 个文件(A.txt 和 B.txt),有没有办法创建 2 个作业,以便两个作业可以并行运行?

最佳答案

有非常好的方法可以使用 Spring 以异步模式运行作业,这只是如何配置 JobLauncher 的问题。 JobLauncher 有一个 taskExecutor 属性,并且可以根据分配给该属性的实现来激活异步执行。

您可以找到 Spring 可以提供的所有 TaskExecutor 类型,并根据您的需求选择完成批处理异步作业的最佳方法。 Task Executors Types in Spring

例如,SimpleAsyncTaskExecutor 是一个任务执行器,它将在任何调用上创建一个新的Thread,如果执行频率很高,则可能会产生性能问题。另一方面,还有一些 TaskExecutors 类型提供池化功能,以便重用资源并最大限度地提高系统效率。

这是一个如何配置ThreadPoolTask​​Executor的小示例:

A) 配置ThreadPoolTask​​Executor Bean

@Bean
    public ThreadPoolTaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
    taskExecutor.setCorePoolSize(15);
    taskExecutor.setMaxPoolSize(20);
    taskExecutor.setQueueCapacity(30);
    return taskExecutor;
}

B) 配置 JobLauncher Bean

   @Bean
    public JobLauncher jobLauncher(ThreadPoolTaskExecutor taskExecutor, JobRepository jobRepository){
        SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
        jobLauncher.setTaskExecutor(taskExecutor);
        jobLauncher.setJobRepository(jobRepository);
        return jobLauncher;
    }

C) 注入(inject)您的 JobLauncherJobs 配置

@Autowired
private JobLauncher jobLauncher;

@Autowired
@Qualifier("job1-file-A")
private Job job1;

@Autowired
@Qualifier("job2-file-B")
private Job job2;

D)安排作业

@Scheduled(cron = "*/1 * * * * *")
public void run1(){
    Map<String, JobParameter> confMap = new HashMap<>();
    confMap.put("time", new JobParameter(System.currentTimeMillis()));
    JobParameters jobParameters = new JobParameters(confMap);
    try {
        jobLauncher.run(job1, jobParameters);
    }catch (Exception ex){
        logger.error(ex.getMessage());
    }

}

@Scheduled(cron = "*/1 * * * * *")
public void run2(){
    Map<String, JobParameter> confMap = new HashMap<>();
    confMap.put("time", new JobParameter(System.currentTimeMillis()));
    JobParameters jobParameters = new JobParameters(confMap);
    try {
        jobLauncher.run(job2, jobParameters);
    }catch (Exception ex){
        logger.error(ex.getMessage());
    }

}

E) 最后在 SpringBoot 类上 @EnableBatchProcessing@EnableScheduling

@EnableBatchProcessing
@EnableScheduling
@SpringBootApplication
public class MyBatchApp {

关于Spring Batch - 并行运行多个作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45718888/

相关文章:

algorithm - 首次出现并行字符串匹配算法

arrays - MPI 可以收集、减少、发送或接收 Fortran 派生类型吗?

java - 如何在没有储物柜的情况下通过配置使用 WatchServiceDirectoryScanner

java - spring中如何从jsp中调用controller类

java - Spring Boot - Tomcat JNDI 在服务 bean 中失败

matlab - 并行池不识别全局变量

java - Spring 集成 sftp :inbound-channel-adapter delete-remote-files=false

java - Websphere MQ 持久主题超时

java - 为 CORS 配置 Spring

java - Hibernate、Spring 和外键