Spring @async异步调用使用很方便,使用方法,参考官方文档
但是写好后一定要测试,异步函数阻塞,但是调用的地方继续往下执行。
遇到不生效情况,可以参考如下情况:
1. 方法不能使用static修饰
如为了调用翻遍的库函数,加了static后, @Async就不生效了。
1
2
3
public static asyncPost() {
}
2. 没有用spring进行bean管理
async方法所在的异步类要用@Compnent或者@Service等注解,否则导致spring无法扫描到异步类
3. 调用异步方法不能与异步方法在同一个类中
调用异步方法的类一定是和异步方法在不同的类中,否则不生效。
4. 通过@Autowired或@Resource等注解自动注入
不能自己手动new对象,这就是edgex出现的bug,本来@Autowired了httpExecutor,但是又在构造函数里面new了一个。
修改的补丁如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
+import org.springframework.stereotype.Component;
+@Component
public class ScheduleEventExecutor {
private static final org.edgexfoundry.support.logging.client.EdgeXLogger logger =
@@ -32,10 +34,6 @@ public class ScheduleEventExecutor {
@Autowired
ScheduleEventHTTPExecutor httpExecutor;
- ScheduleEventExecutor() {
- httpExecutor = new ScheduleEventHTTPExecutor();
- }
-
5. 使用SpringBoot框架必须在启动类中增加@EnableAsync注解
1
2
3
4
5
@SpringBootApplication
@EnableAsync
@EnableDiscoveryClient
public class Application {
}