在使用@Async批注的方法中使用Spring4 AsyncRestTemplate

时间:2016-10-13 22:03:02

标签: java spring rest asynchronous

我正在使用Spring4 AsyncRestTemplate 来调用外部REST API服务。

以下方法来自Spring @Service 类。 AsyncRestTemplate 是从Spring @Bean 自动装配的。

在该方法中,我在REST API调用的 ListenableFuture 响应中注册了回调。

除了单元测试之外,我不使用返回的 ListenableFuture 。回调将根据请求成功或失败处理我想要采取的实际操作。

ExternalServiceImpl.class

public ListenableFuture<ResponseEntity<ResponseBody>> makeExternalCall(RequestBody requestBody) {

            HttpEntity<RequestBody> request = new HttpEntity<>(RequestBody, getDefaultHeaders());

            ListenableFuture<ResponseEntity<ResponseBody>> responseEntity = asyncRestTemplate.exchange(serviceUri.toUriString(), HttpMethod.POST, request, ResponseBody.class);

            responseEntity.addCallback(
                    (onSuccess) -> System.out.println("Success"), 
                    (onFailure) -> onFailure.printStackTrace()
            );

            return responseEntity;
    }

我计划使用@EnableAsync注释并设置ThreadPoolTask​​Executor以及以类似于此处描述的过程的方式向方法添加@async注释:Spring Asynchronous Methods

问题

  • 这是多余的吗?缩放时是否还有其他好处 即使我正在使用,也使该方法异步 AsyncRestTemplate

  • 是否有任何我认为最佳的做法 实施这种模式?

  • 有什么需要注意的吗?

1 个答案:

答案 0 :(得分:0)

在您向应用程序添加@Async注释之前,

@EnableAsync实际上并没有做任何事情。当发生这种情况时,任何调用makeExternalCall方法的代码都会立即返回,spring会查找TaskExecutor bean以异步方式运行整个方法(而不仅仅是asyncRestTemplate服务是唯一的当前代码的异步部分。)

春季网站上的更多信息:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html