use*_*286 5 java rest spring resttemplate asyncresttemplate
我正在使用 Spring RestTemplate 并想调用另一个不返回任何响应正文的服务。所以,我不想等待回应。所以,这只是一劳永逸,然后继续剩下的代码。我正在考虑创建一个新线程来执行此操作,但真的不确定什么是正确的方法。
如果您使用 Java 11,则 Java 支持异步 HTTP 客户端。异步客户端在后面使用CompletableFuture。你可以看到javadoc。
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("http://openjdk.java.net/"))
.timeout(Duration.ofMinutes(1))
.header("Content-Type", "application/json")
.POST(BodyPublishers.ofFile(Paths.get("file.json")))
.build();
client.sendAsync(request, BodyHandlers.ofString())
.thenApply(response -> { System.out.println(response.statusCode());
return response; } )
.thenApply(HttpResponse::body)
.thenAccept(System.out::println);
Run Code Online (Sandbox Code Playgroud)
正确的方法是使用回调执行异步(使用DeferredResult,如下所示(假设我们有一个someClass要从 API 检索的类:
@GetMapping(path = "/testingAsync")
public DeferredResult<String> value() throws ExecutionException, InterruptedException, TimeoutException {
AsyncRestTemplate restTemplate = new AsyncRestTemplate();
String baseUrl = "http://someUrl/blabla";
HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
String value = "";
HttpEntity entity = new HttpEntity("parameters", requestHeaders);
final DeferredResult<String> result = new DeferredResult<>();
ListenableFuture<ResponseEntity<someClass>> futureEntity = restTemplate.getForEntity(baseUrl, someClass.class);
futureEntity.addCallback(new ListenableFutureCallback<ResponseEntity<someClass>>() {
@Override
public void onSuccess(ResponseEntity<someClass> result) {
System.out.println(result.getBody().getName());
result.setResult(result.getBody().getName());
}
@Override
public void onFailure(Throwable ex) {
result.setErrorResult(ex.getMessage());
}
});
return result;
}
Run Code Online (Sandbox Code Playgroud)