我想使用@Async
注释使方法异步写入数据库。
我用注解@EnableAsync
标记了班级:
@EnableAsync
public class FacialRecognitionAsyncImpl {
@Async
public void populateDataInPushQueue(int mediaId, int studentId) {
//myCode
}
}
在调用populateDataInPushQueue
方法时,写操作应在另一个线程中执行,并且流程应从我正在调用此方法的类中继续。但这没有发生,程序执行正在等待此方法完成。
答案 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
方法void
或Future
以下内容可以在@EnableAsync
的文档中找到:
请注意,代理模式仅允许通过代理拦截呼叫;同一类内的本地调用无法通过这种方式被拦截。
另一个事实是,用@EnableAsync
注释的类也必须是@Configuration
。因此,从一个空的类开始:
@EnableAsync
@Configuration
public class AsyncConfiguration { }