spring 异步 rest 客户端协调几个调用
spring async rest client orchestrate few calls
我在我的服务中遇到以下问题我正在构建对象 X 但是为了构建它我需要进行一些 http 调用以获得所有必需的数据来填充它(每个其余部分填充对象的特定部分。 ) 为了保持高性能,我认为调用异步会很好,并且在所有调用完成后 return 向调用者发送对象。看起来像这样
ListenableFuture<ResponseEntity<String>> future1 = asycTemp.exchange(url, method, requestEntity, responseType);
future1.addCallback({
//process response and set fields
complexObject.field1 = "PARSERD RESPONSE"
},{
//in case of fail fill default or take some ather actions
})
我不知道如何等待所有功能完成。我想它们是解决此类问题的一些标准 spring 方法。在此先感谢您的任何建议。 Spring 版本 - 4.2.4.RELEASE
最好的问候
改编自Waiting for callback for multiple futures。
此示例仅请求 Google 和 Microsoft 主页。在回调中收到响应并完成我的处理后,我递减 CountDownLatch。我等待 CountDownLatch,"blocking" 当前线程,直到 CountDownLatch 达到 0。
如果调用失败或成功,请务必递减,因为您必须按 0 才能继续该方法!
public static void main(String[] args) throws Exception {
String googleUrl = "http://www.google.com";
String microsoftUrl = "http://www.microsoft.com";
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
ListenableFuture<ResponseEntity<String>> googleFuture = asyncRestTemplate.exchange(googleUrl, HttpMethod.GET, null, String.class);
ListenableFuture<ResponseEntity<String>> microsoftFuture = asyncRestTemplate.exchange(microsoftUrl, HttpMethod.GET, null, String.class);
final CountDownLatch countDownLatch = new CountDownLatch(2);
ListenableFutureCallback<ResponseEntity<java.lang.String>> listenableFutureCallback = new ListenableFutureCallback<ResponseEntity<String>>() {
public void onSuccess(ResponseEntity<String> stringResponseEntity) {
System.out.println(String.format("[Thread %d] Status Code: %d. Body size: %d",
Thread.currentThread().getId(),
stringResponseEntity.getStatusCode().value(),
stringResponseEntity.getBody().length()
));
countDownLatch.countDown();
}
public void onFailure(Throwable throwable) {
System.err.println(throwable.getMessage());
countDownLatch.countDown();
}
};
googleFuture.addCallback(listenableFutureCallback);
microsoftFuture.addCallback(listenableFutureCallback);
System.out.println(String.format("[Thread %d] This line executed immediately.", Thread.currentThread().getId()));
countDownLatch.await();
System.out.println(String.format("[Thread %d] All responses received.", Thread.currentThread().getId()));
}
我的控制台的输出:
[Thread 1] This line executed immediately.
[Thread 14] Status Code: 200. Body size: 112654
[Thread 13] Status Code: 200. Body size: 19087
[Thread 1] All responses received.
我在我的服务中遇到以下问题我正在构建对象 X 但是为了构建它我需要进行一些 http 调用以获得所有必需的数据来填充它(每个其余部分填充对象的特定部分。 ) 为了保持高性能,我认为调用异步会很好,并且在所有调用完成后 return 向调用者发送对象。看起来像这样
ListenableFuture<ResponseEntity<String>> future1 = asycTemp.exchange(url, method, requestEntity, responseType);
future1.addCallback({
//process response and set fields
complexObject.field1 = "PARSERD RESPONSE"
},{
//in case of fail fill default or take some ather actions
})
我不知道如何等待所有功能完成。我想它们是解决此类问题的一些标准 spring 方法。在此先感谢您的任何建议。 Spring 版本 - 4.2.4.RELEASE 最好的问候
改编自Waiting for callback for multiple futures。
此示例仅请求 Google 和 Microsoft 主页。在回调中收到响应并完成我的处理后,我递减 CountDownLatch。我等待 CountDownLatch,"blocking" 当前线程,直到 CountDownLatch 达到 0。
如果调用失败或成功,请务必递减,因为您必须按 0 才能继续该方法!
public static void main(String[] args) throws Exception {
String googleUrl = "http://www.google.com";
String microsoftUrl = "http://www.microsoft.com";
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
ListenableFuture<ResponseEntity<String>> googleFuture = asyncRestTemplate.exchange(googleUrl, HttpMethod.GET, null, String.class);
ListenableFuture<ResponseEntity<String>> microsoftFuture = asyncRestTemplate.exchange(microsoftUrl, HttpMethod.GET, null, String.class);
final CountDownLatch countDownLatch = new CountDownLatch(2);
ListenableFutureCallback<ResponseEntity<java.lang.String>> listenableFutureCallback = new ListenableFutureCallback<ResponseEntity<String>>() {
public void onSuccess(ResponseEntity<String> stringResponseEntity) {
System.out.println(String.format("[Thread %d] Status Code: %d. Body size: %d",
Thread.currentThread().getId(),
stringResponseEntity.getStatusCode().value(),
stringResponseEntity.getBody().length()
));
countDownLatch.countDown();
}
public void onFailure(Throwable throwable) {
System.err.println(throwable.getMessage());
countDownLatch.countDown();
}
};
googleFuture.addCallback(listenableFutureCallback);
microsoftFuture.addCallback(listenableFutureCallback);
System.out.println(String.format("[Thread %d] This line executed immediately.", Thread.currentThread().getId()));
countDownLatch.await();
System.out.println(String.format("[Thread %d] All responses received.", Thread.currentThread().getId()));
}
我的控制台的输出:
[Thread 1] This line executed immediately.
[Thread 14] Status Code: 200. Body size: 112654
[Thread 13] Status Code: 200. Body size: 19087
[Thread 1] All responses received.