我按照此处的示例使用@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个线程,而不是获得自己独立的线程池。这可以发生什么?