首页 > 解决方案 > @Async 不适用于返回类型为 void 的方法

问题描述

我想使用@Async注释创建一个异步写入数据库的方法。

我用注释标记了课程@EnableAsync

@EnableAsync
public class FacialRecognitionAsyncImpl {

    @Async
    public void populateDataInPushQueue(int mediaId, int studentId) {
        //myCode
    }
}

在调用该populateDataInPushQueue方法时,写入操作应该在另一个线程中执行,并且流程应该从我正在调用此方法的类继续。但这并没有发生,程序执行正在等待此方法完成。

标签: javaspringspring-bootasynchronousspring-annotations

解决方案


@Async注释几乎没有限制 - 检查是否遵守这些限制:

  • 它必须仅应用于public方法
  • 它不能从定义的同一类中调用
  • 返回类型必须是void或者Future

以下内容可在以下文档中找到@EnableAsync

请注意,代理模式只允许通过代理拦截呼叫;同一类中的本地调用不能以这种方式被拦截。

另一个事实是带有注释的类也@EnableAsync必须是 a @Configuration。因此从一个空类开始:

@EnableAsync
@Configuration
public class AsyncConfiguration { }

推荐阅读