如何使用@EnableScheduling并行运行任务

时间:2017-07-20 03:09:17

标签: java spring multithreading parallel-processing

我按照此处的示例使用@EnableScheduling并行运行任务 - from this tutorial

这是我的代码 -

@EnableScheduling
@Configuration
public class MyJobScheduler implements SchedulingConfigurer {

  @Bean(destroyMethod="shutdown")
  public Executor taskExecutor() {
    return Executors.newScheduledThreadPool(5);
  }

  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.setScheduler(taskExecutor());
  }

  @Bean
  @Scope("prototype")
  public MyJobExecutor createMyJobExecutor() {
    return new MyJobExecutor();
  }

  @PostConstruct
  public void registerServices() {
    for (int i = 0; i < 5; i++) {
        createMyJobExecutor();
    }
  }
}


public class MyJobExecutor {
private static final Logger logger = 
  LoggerFactory.getLogger(MyJobExecutor.class);

  @Autowired
  MyService myService;

  @Scheduled(fixedDelayString = "10000", initialDelayString = "30000")
  public void runJob() {
    try {
        logger.info("MyJobExecutor executing...");
        myService.myJobTask();
    } catch (Exception e) {
        logger.error(MyJobExecutor failed.", e);
    }
  }
}


@EnableScheduling
@Configuration
public class MyJobScheduler2 implements SchedulingConfigurer {

  @Bean(destroyMethod="shutdown")
  public Executor taskExecutor() {
    return Executors.newScheduledThreadPool(2);
  }

  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.setScheduler(taskExecutor());
  }

  @Bean
  @Scope("prototype")
  public MyJobExecutor2 createMyJobExecutor() {
    return new MyJobExecutor2();
  }

  @PostConstruct
  public void registerServices() {
    for (int i = 0; i < 2; i++) {
        createMyJobExecutor();
    }
  }
}

public class MyJobExecutor2 {
  private static final Logger logger = 
LoggerFactory.getLogger(MyJobExecutor2.class);

  @Autowired
  MyService2 myService;

  @Scheduled(fixedDelayString = "10000", initialDelayString = "30000")
  public void runJob() {
    try {
        logger.info("MyJobExecutor2 executing...");
        myService.myJobTask();
    } catch (Exception e) {
        logger.error(MyJobExecutor2 failed.", e);
    }
  }
}

当我只配置了一个调度程序MyJobScheduler时,我获得了并行运行的预期作业数。但是,我需要2个预定的工作。当我添加MyJobScheduler2时,这里是日志......

  

21:03:25.291 [pool-2-thread-1] INFO c.t.m.e.s.e.p.p.MyJobExecutor2 - MyJobExecutor2正在执行...
  21:03:25.459 [pool-2-thread-2] INFO c.t.m.e.s.e.p.p.MyJobExecutor2 - MyJobExecutor2正在执行...
  21:03:25.537 [pool-2-thread-1] INFO c.t.m.e.s.e.p.p.MyJobExecutor - MyJobExecutor正在执行...
  21:03:25.680 [pool-2-thread-2] INFO c.t.m.e.s.e.p.p.MyJobExecutor - MyJobExecutor正在执行......

我期待MyJobScheduler使用5个线程,MyJobScheduler2使用2个线程。看起来这两个调度程序都使用相同的线程池并限制为2个线程,而不是获得自己独立的线程池。这可以发生什么?

0 个答案:

没有答案
相关问题