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

Java 如何使用@EnableScheduling并行运行任务,java,spring,multithreading,parallel-processing,Java,Spring,Multithreading,Parallel Processing,我遵循下面的示例,使用@EnableScheduling- 这是我的密码- @EnableScheduling @Configuration public class MyJobScheduler implements SchedulingConfigurer { @Bean(destroyMethod="shutdown") public Executor taskExecutor() { return Executors.newScheduledThreadPool(5);

我遵循下面的示例,使用
@EnableScheduling
-

这是我的密码-

@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);
    }
  }
}
@EnableScheduling
@配置
公共类MyJobScheduler实现SchedulingConfigurer{
@Bean(destromethod=“shutdown”)
公共执行者任务执行者(){
返回Executors.newScheduledThreadPool(5);
}
@凌驾
公共无效配置任务(ScheduledTaskRegistrar任务注册器){
taskRegistrator.setScheduler(taskExecutor());
}
@豆子
@范围(“原型”)
公共MyJobExecutor createMyJobExecutor(){
返回新的MyJobExecutor();
}
@施工后
公共无效注册表服务(){
对于(int i=0;i<5;i++){
createMyJobExecutor();
}
}
}
公共类MyJobExecutor{
专用静态最终记录器=
LoggerFactory.getLogger(MyJobExecutor.class);
@自动连线
我的服务我的服务;
@已计划(fixedDelayString=“10000”,initialDelayString=“30000”)
public void runJob(){
试一试{
logger.info(“MyJobExecutor正在执行…”);
myService.myjobstask();
}捕获(例外e){
logger.错误(MyJobExecutor失败。“,e);
}
}
}
@使能调度
@配置
公共类MyJobScheduler2实现SchedulingConfigurer{
@Bean(destromethod=“shutdown”)
公共执行者任务执行者(){
返回Executors.newScheduledThreadPool(2);
}
@凌驾
公共无效配置任务(ScheduledTaskRegistrar任务注册器){
taskRegistrator.setScheduler(taskExecutor());
}
@豆子
@范围(“原型”)
公共MyJobExecutor 2 createMyJobExecutor(){
返回新的MyJobExecutor2();
}
@施工后
公共无效注册表服务(){
对于(int i=0;i<2;i++){
createMyJobExecutor();
}
}
}
公共类MyJobExecutor 2{
专用静态最终记录器=
LoggerFactory.getLogger(MyJobExecutor2.class);
@自动连线
myService 2 myService;
@已计划(fixedDelayString=“10000”,initialDelayString=“30000”)
public void runJob(){
试一试{
logger.info(“MyJobExecutor2正在执行…”);
myService.myjobstask();
}捕获(例外e){
logger.错误(MyJobExecutor2失败。“,e);
}
}
}
当我只配置了一个调度器MyJobScheduler时,我会得到预期数量的并行运行的作业。然而,我需要2个预定的工作。当我添加MyJobScheduler2时,以下是日志

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


我希望MyJobScheduler使用5个线程,MyJobScheduler2使用2个线程。这两个调度程序似乎都在使用同一个线程池,并且被限制为2个线程,而不是各自独立的线程池。这里会发生什么?

为什么它们要并行执行?它们被安排在每个
200ms
这不是一个长时间运行的任务,因此每个线程都可以使用相同的线程。显然,线程池每次都返回相同的线程,因为它可用。Denium-我想我希望计划的作业并行运行,以加快作业执行的整体处理速度。有没有办法同时运行这些计划的作业?我已经确保工作是线程安全的。为什么。。。显然,这项工作没有做更多的事情,而是做了一个
系统。。。为什么它要并行运行?它在开始一个新项目所需的时间内完成。。。那目的是什么。。。没有并发运行的任务,因此没有多个线程。Denium—您看到的输出是同一个线程处理来自api调用的一组消息并更新数据库。他们不是从单独执行的工作…我应该解释得更好一点之前。我想做的是让作业同时运行多个线程,这样每个线程都可以处理单独的消息集并同时进行DB更新…从而加快作业的整体执行速度。这更有意义吗?这与计划安排完全不同。你把事情搞混了。这也不是你的问题,所以我建议重写你的问题。