一起使用@Scheduled和@Async?

And*_*sen 5 java asynchronous scheduled-tasks spring-boot

如果我想重复异步的方法,可以同时使用@Scheduled和@Async吗?

@Async
@Scheduled(fixedDelay = x)
public void doSomethingEveryXMinuteAsync() { 
  // action 
}
Run Code Online (Sandbox Code Playgroud)

还是有另一种标准的方法来实现这一目标?

Yuq*_*uqu 8

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

更新:

显然,fixedRate 属性不会强制异步调用调度方法,并且增加调度程序任务执行器的池大小只会启用独立 @Scheduled 方法的异步执行。即使将 @Async 放在方法上也不能像 OP 所要求的那样工作。

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

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