如何在Spring中正确使用@Async

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实际上才能完成工作?

Ral*_*lph 4

您确实只需要一种方法。只是因为,在使用第一个方法启动新线程后@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/