Ved*_*nja 8 java spring asynchronous spring-mvc spring-boot
我有一个关于Spring的@Async注释以及如何正确使用它的问题.假设我有这些方法:
@Async
public void test(String param1) {
test2(param1, null);
}
@Async
public void test2(String param1, String param2) {
test3(param1, param2, null);
}
@Async
public void test3(String param1, String param2, String param3) {
// do some heavy work
}
Run Code Online (Sandbox Code Playgroud)
我是否需要@Async在所有三种方法上进行异步调用,或者只是将其置于test3实际上才能完成工作?
您确实只需要一种方法。只是因为,在使用第一个方法启动新线程后@Async,它与调用方法是异步的。
但这对您意味着什么,很大程度上取决于您的示例应说明的内容:
1)所以在你的情况下,当你调用and through时,一个@Asyncfor就足够了。test1(String param1)test2test3test1
@Async
public void test1(String param1) {
test2(param1, null);
}
private void test2(String param1, String param2) {
test3(param1, param2, null);
}
private void test3(String param1, String param2, String param3) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
注意方法2和3是私有的
2)但是如果您的示例是为了说明默认参数的方法重载模式(方法链接),那么它会更加复杂。然后,您需要@Async在执行实际操作的方法上添加注释。因为您只想以异步方式执行真正的执行,而不是为每个链接步骤执行一次异步调用。
public void test(String param1) {
test(param1, null);
}
public void test(String param1, String param2) {
//this invocation runs async only when real AspectJ is used
test(param1, param2, null);
}
@Async
public void test(String param1, String param2, String param3) {
// do something
}
Run Code Online (Sandbox Code Playgroud)
请注意,所有方法都只是命名test(方法链接模式)
问题是,如果通过 ! 调用,Spring(没有真正的 AspectJ 加载或编译时编织)将不会运行异步方法this!(参见/sf/answers/1579333241/)
| 归档时间: |
|
| 查看次数: |
1799 次 |
| 最近记录: |