首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用@Scheduled和@Async?

同时使用@Scheduled和@Async?
EN

Stack Overflow用户
提问于 2017-02-27 18:06:39
回答 5查看 11.5K关注 0票数 6

如果我想要一个方法来重复异步,我可以一起使用@Scheduled和@ async吗?

代码语言:javascript
复制
@Async
@Scheduled(fixedDelay = x)
public void doSomethingEveryXMinuteAsync() { 
  // action 
}

或者有另一种标准的方法来实现这一点?

EN

回答 5

Stack Overflow用户

发布于 2017-02-27 18:18:45

不需要使用@Async。只需使用@Scheduled的fixedRate属性,而不是fixedDelay。Spring将在给定时间之后对该方法进行另一次调用,而不管任何调用是否已经在处理中。

更新:

显然,fixedRate属性并不强制调度方法被异步调用,增加调度器任务执行器的池大小只允许异步执行独立的@Scheduled方法。即使把@Async放在这个方法上也不能让它像OP要求的那样工作。

ScheduledAnnotationBeanPostProcessor只是从@Scheduled方法创建一个Runnable,并不像@Async方法处理器那样创建任何切入点。ScheduledThreadPoolExecutor 等待Runnable#run()完成,并使用开始时间和固定速率设置下一次执行时间。因此,如果方法调用花费的时间超过计划时间,则在前一个调用完成后立即触发下一个任务。

一个简单的解决方案是将实际的方法提取到另一个类中作为@Async方法,并从@Scheduled方法调用此方法。

票数 8
EN

Stack Overflow用户

发布于 2020-04-11 16:09:00

实现SchedulingConfigurer并重写configureTasks方法。定义多个poolsize,它将按照您的期望工作。

票数 2
EN

Stack Overflow用户

发布于 2021-07-22 20:54:56

您还可以设置以下属性:

代码语言:javascript
复制
spring.task.scheduling.pool.size
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42482865

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档