Abh*_*oda 4 java spring java-8
我正在使用CompletableFutureWeb 服务调用:
CompletableFuture<List<ProductCatalog>> completeableFuture =
CompletableFuture.supplyAsync(() -> restTemplate.getForEntity(serviceURL, Response.class))
.thenApply(responseEntity -> buildResponse(responseEntity.getBody()));
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,我可以看到JVM分配了一个pool worker(onPool-worker-1)线程来调用web服务,所以它按预期工作:
2018-03-12 10:11:08.402 INFO 14726 --- [nio-9020-exec-1] c.a.m.service.products.config.LogAspect : Entering in Method : productsCatalogClass Name : com.arrow.myarrow.service.products.controller.ProductsControllerArguments : []Target class : com.arrow.myarrow.service.products.controller.ProductsController
2018-03-12 10:11:43.561 INFO 14726 --- [onPool-worker-1] c.a.m.s.p.s.ProductsCatalogService : listProductCatalog has top level elements - 8
Run Code Online (Sandbox Code Playgroud)
由于 Web 服务调用可能很耗时,因此我使用该CompletableFuture.supplyAsync方法来调用 Web 服务。有人可以回答以下问题:
我在 Tomcat 上将我的应用程序作为 Spring Boot 应用程序运行。使用背后的主要灵感CompletableFuture是,当 Web 服务(第三方系统)关闭时,我所有传入的请求都不会被阻止。由于Tomcat默认的线程池大小为200,如果有200个用户在等待上面调用的响应,系统会不会被阻塞,或者使用上面的代码有什么区别?
这不是非阻塞 I/O。它只是在单独的线程中完成的常规阻塞 I/O。更糟糕的是,如果您没有明确提供执行器,CompletableFutures则将在公共处执行,ForkJoinPool这将很快填满。
如果您使用异步 servlet和单独的执行程序,您可以在不使用 Tomcat 工作池中的线程的情况下进行长时间运行的操作。然而,这只有在其他请求可以以某种方式完成时才有用。如果所有请求都卸载到自定义执行程序,您只需将一个池切换为另一个池。