gpt4 book ai didi

java - 一起使用@Scheduled 和@Async?

转载 作者:行者123 更新时间:2023-12-04 18:59:07 24 4
gpt4 key购买 nike

如果我想要一种重复异步的方法,我可以一起使用 @Scheduled 和 @Async 吗?

@Async
@Scheduled(fixedDelay = x)
public void doSomethingEveryXMinuteAsync() {
// action
}

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

最佳答案

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

更新:

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

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

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

关于java - 一起使用@Scheduled 和@Async?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42482865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com