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)
还是有另一种标准的方法来实现这一目标?
无需使用@Async。只需使用@Scheduled 的fixedRate属性而不是fixedDelay。Spring 将在给定时间后对该方法进行另一次调用,而不管是否已经处理了任何调用。
更新:
显然,fixedRate 属性不会强制异步调用调度方法,并且增加调度程序任务执行器的池大小只会启用独立 @Scheduled 方法的异步执行。即使将 @Async 放在方法上也不能像 OP 所要求的那样工作。
ScheduledAnnotationBeanPostProcessor 只是从 @Scheduled 方法创建一个 Runnable 并且不会像 @Async 方法处理器那样创建任何切入点。ScheduledThreadPoolExecutor等待直到 Runnable#run() 完成并使用开始时间和固定速率设置下一次执行时间。因此,如果方法调用花费的时间比预定时间长,则在前一个调用完成后立即触发下一个任务。
一个简单的解决方案是将实际方法作为 @Async 方法提取到另一个类中,并从 @Scheduled 方法调用此方法。
| 归档时间: |
|
| 查看次数: |
4260 次 |
| 最近记录: |