gpt4 book ai didi

java - 动态调度任务的异步执行

转载 作者:行者123 更新时间:2023-11-30 05:51:30 30 4
gpt4 key购买 nike

基于一组配置,我的任务是实例化一个计划任务列表,这些任务将基于 CronTrigger 每 x 分钟执行一次。实现的草稿版本与此类似:

for(Config cfg:configs){
Runnable task=()->doSomething(cfg);
taskScheduler.schedule(task,new CronTrigger("0 0/"+cfg.getScheduledTimeInMinutes()+" * * * *"));
}

taskScheduler 是一个 bean,在当前类中 Autowiring ,并在配置类中定义为:

    @Bean
public TaskScheduler taskScheduler() {
return new ConcurrentTaskScheduler();
}

到目前为止,一切都很好。所有配置都会导致在计划的时间使用不同的参数执行相同的方法。问题在于,当 doSomething() 方法需要更多时间才能完成,而下一个计划任务应该触发时,或者同时计划了多个任务时。在这种情况下,执行不是异步的,每个任务都会等待前一个任务完成。是否可以实现这些定时任务的并发执行?我正在使用 Java 8 和 Spring Boot 2.0。

最佳答案

好吧,这一切都很好,您错过了一件小事,或者让我们对 Spring 环境中计划任务的执行有一些了解:

添加这个(到你的@Configuration注释类)将解决你的问题:

@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5); // 5 is arbitrary, change it to suit you
}

默认情况下,所有计划任务都使用 1 个线程来执行。如果您需要更多控制,那么您必须定义调度程序线程池。查找文档。

或者更好的方法:

@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(100);
taskScheduler.initialize();
taskRegistrar.setTaskScheduler(taskScheduler);
}
}

关于java - 动态调度任务的异步执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53832180/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com