如果我想要一个方法来重复异步,我可以一起使用@Scheduled和@ async吗?
@Async
@Scheduled(fixedDelay = x)
public void doSomethingEveryXMinuteAsync() {
// action
}或者有另一种标准的方法来实现这一点?
发布于 2017-02-27 18:18:45
不需要使用@Async。只需使用@Scheduled的fixedRate属性,而不是fixedDelay。Spring将在给定时间之后对该方法进行另一次调用,而不管任何调用是否已经在处理中。
更新:
显然,fixedRate属性并不强制调度方法被异步调用,增加调度器任务执行器的池大小只允许异步执行独立的@Scheduled方法。即使把@Async放在这个方法上也不能让它像OP要求的那样工作。
ScheduledAnnotationBeanPostProcessor只是从@Scheduled方法创建一个Runnable,并不像@Async方法处理器那样创建任何切入点。ScheduledThreadPoolExecutor 等待Runnable#run()完成,并使用开始时间和固定速率设置下一次执行时间。因此,如果方法调用花费的时间超过计划时间,则在前一个调用完成后立即触发下一个任务。
一个简单的解决方案是将实际的方法提取到另一个类中作为@Async方法,并从@Scheduled方法调用此方法。
发布于 2020-04-11 16:09:00
实现SchedulingConfigurer并重写configureTasks方法。定义多个poolsize,它将按照您的期望工作。
发布于 2021-07-22 20:54:56
您还可以设置以下属性:
spring.task.scheduling.pool.sizehttps://stackoverflow.com/questions/42482865
复制相似问题