@Async无法用于返回类型为void的方法

时间:2019-05-30 17:00:51

标签: java spring spring-boot asynchronous spring-annotations

我想使用@Async注释使方法异步写入数据库。

我用注解@EnableAsync标记了班级:

@EnableAsync
public class FacialRecognitionAsyncImpl {

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

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

2 个答案:

答案 0 :(得分:5)

我认为您缺少@Configuration注释,并且异步服务未进行组件扫描。这是应该解决问题的示例代码片段:

@Configuration
@EnableAsync  //should be placed together.
public class FacialRecognitionAsyncService {

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

@Configuration
@EnableAsync
public class FacialServiceConfig {

    // this will make your service to be scanned.
    @Bean
    public FacialRecognitionAsyncService createFacialRecognitionService() {
        return new FacialRecognitionAsyncService();
    }

}

现在调用异步方法的服务bean。请注意,它已被注入依赖项。这样,将在facialService的每次调用中调用spring AOP代理。 Spring在后台使用AOP来实现@Async

@Service
public class MyBusinessService {

@Autowire
FacialRecognitionAsyncService  facialService;

public myBusinessMethod() {
   facialService.populateDataInPushQueue()
}

请注意,FacialService是通过依赖项注入而注入到MyService中的。

答案 1 :(得分:5)

@Async批注有一些限制-请检查这些限制是否得到遵守:

  • 必须仅将其应用于public方法
  • 不能从定义的同一个类中调用
  • 返回类型必须为voidFuture

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

  

请注意,代理模式仅允许通过代理拦截呼叫;同一类内的本地调用无法通过这种方式被拦截。

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

@EnableAsync
@Configuration
public class AsyncConfiguration { }