将Spring @Async放在一堆方法调用中的位置

时间:2018-03-12 17:12:52

标签: java spring multithreading spring-boot asynchronous

我正在使用Spring Boot 1.5.x,详细地说,我正在使用@Async注释。我的问题是我在存储库中有以下方法。

@Repository
class Repository {
    @Async
    CompletableFuture<String> findSomething() {
        /* Some code that returns something */
    }
}

然后,我在服务中有以下方法,它调用上面的存储库。

@Service
class Service {
    private Repository repository;
    // ...
    @Async
    CompletableFuture<String> findSomething() {
        return repository.findSomething()
    }
}

我的问题是:我应该在@Async方法中放置service.findSomething()注释吗?或者我应该在服务方法中放置注释?

我的意思是,Spring应该在专用线程中安排执行标有@Async注释的方法。这是对的吗?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用@Async注释方法将导致调用者立即返回,并且实际执行将在单独的线程中发生,作为提交到默认SimpleAsyncTaskExecutor的任务的一部分(如果尚未配置)另一个)。请参阅相关的春季documentation

话虽如此,为了你的目标,嵌套@Async并没有额外的好处。如果您的目标是让Repository.findSomething异步并且能够从不同的地方调用它,而不仅仅是Service.findSomething,那么您应该仅注释此方法。

此外,在您描述的场景中,Service.findSomething本身也是异步的,即使没有使用@Async注释。该方法不会通过调用CompletableFuture.get()来阻止,并且它将立即返回,尽管它不会在单独的线程中执行。