fro*_*roi 64 java spring scheduled-tasks
我有几个用@Scheduled注释的方法(fixedDelay = 10000).
在应用程序上下文中,我有这个注释驱动设置:
<task:annotation-driven />
Run Code Online (Sandbox Code Playgroud)
问题是,有时一些方法执行会延迟几秒甚至几分钟.
我假设即使方法需要一段时间才能完成执行,其他方法仍然会执行.所以我不明白延迟.
有没有办法可以减少甚至消除延迟?
G. *_*cki 56
为了完整起见,下面的代码显示了使用java config配置调度程序的最简单方法:
@Configuration
@EnableScheduling
public class SpringConfiguration {
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
...
Run Code Online (Sandbox Code Playgroud)
当需要更多控制时,@Configuration
可以实现一个类SchedulingConfigurer
.
L.B*_*utz 37
您还可以在应用程序属性文件中设置一个增加池大小的属性:
spring.task.scheduling.pool.size=10
似乎自 Spring Boot 2.1.0 以来就存在。
Sot*_*lis 26
注释的方法@Scheduled
意味着在某个时刻在不同的线程上单独运行.
如果您没有TaskScheduler
在配置中提供,Spring将使用
Executors.newSingleThreadScheduledExecutor();
Run Code Online (Sandbox Code Playgroud)
返回一个ScheduledExecutorService
在单个线程上运行的.因此,如果您有多个@Scheduled
方法,虽然它们已被调度,但它们每个都需要等待线程完成执行上一个任务.随着队列填满的速度快于排空,您可能会继续变得越来越大.
确保使用适当数量的线程配置调度环境.
小智 10
您可以使用:
@Bean()
public ThreadPoolTaskScheduler taskScheduler(){
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(2);
return taskScheduler;
}
Run Code Online (Sandbox Code Playgroud)
该@EnableScheduling注释提供了关键信息,以及如何解决它:
默认情况下,将搜索关联的调度程序定义:上下文中唯一的 TaskScheduler bean,或否则名为“taskScheduler”的 TaskScheduler bean;还将对 ScheduledExecutorService bean 执行相同的查找。如果两者都不可解析,则将在注册器中创建和使用本地单线程默认调度程序。
当需要更多控制时,@Configuration 类可以实现 SchedulingConfigurer。这允许访问底层 ScheduledTaskRegistrar 实例。例如,以下示例演示如何自定义用于执行计划任务的 Executor:
@Configuration
@EnableScheduling
public class AppConfig implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(taskExecutor());
}
@Bean(destroyMethod="shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}
}
Run Code Online (Sandbox Code Playgroud)
(强调)
归档时间: |
|
查看次数: |
44405 次 |
最近记录: |