4.7. HTTP 同步传输
使用 Apache HttpComponents HttpClient 5 实施 async SOAP 客户端.
4.7.1. Maven 协调 复制链接链接已复制到粘贴板!
在 code.quarkus.redhat.com 上使用 quarkus-cxf-rt-transports-http-hc5 创建新项目,或将这些协调添加到现有项目中:
<dependency>
<groupId>io.quarkiverse.cxf</groupId>
<artifactId>quarkus-cxf-rt-transports-http-hc5</artifactId>
</dependency>
4.7.2. 使用方法 复制链接链接已复制到粘贴板!
在 classpath 中提供了 quarkus-cxf-rt-transports-http-hc5 依赖项后,CXF 将使用 HttpAsyncClient 进行异步调用,并将继续使用 HttpURLConnection 进行同步调用。
4.7.2.1. 生成 async 方法 复制链接链接已复制到粘贴板!
异步客户端调用需要在服务端点接口中一些额外的方法。默认不会生成该代码。
要启用它,您需要创建一个 JAX-WS 绑定文件,并将 enableAsyncMapping 设置为 true :
本节中使用的代码片段示例来自 Quarkus CXF 的源树中的 HC5 集成测试
src/main/resources/wsdl/async-binding.xml
<?xml version="1.0"?>
<bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns="https://jakarta.ee/xml/ns/jaxws"
wsdlLocation="CalculatorService.wsdl">
<bindings node="wsdl:definitions">
<enableAsyncMapping>true</enableAsyncMapping>
</bindings>
</bindings>
然后,该文件应通过其 additional-params 属性传递给 wsdl2java :
application.properties
quarkus.cxf.codegen.wsdl2java.includes = wsdl/*.wsdl
quarkus.cxf.codegen.wsdl2java.additional-params = -b,src/main/resources/wsdl/async-binding.xml
4.7.2.2. 异步客户端和 Mutiny 复制链接链接已复制到粘贴板!
异步存根可用后,可以将客户端调用嵌套在 io.smallrye.mutiny.Uni 中,如下所示:
package io.quarkiverse.cxf.hc5.it;
import java.util.concurrent.Future;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.QueryParam;
import jakarta.ws.rs.core.MediaType;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.jboss.eap.quickstarts.wscalculator.calculator.AddResponse;
import org.jboss.eap.quickstarts.wscalculator.calculator.CalculatorService;
import io.quarkiverse.cxf.annotation.CXFClient;
import io.smallrye.mutiny.Uni;
@Path("/hc5")
public class Hc5Resource {
@Inject
@CXFClient("myCalculator") // name used in application.properties
CalculatorService myCalculator;
@SuppressWarnings("unchecked")
@Path("/add-async")
@GET
@Produces(MediaType.TEXT_PLAIN)
public Uni<Integer> addAsync(@QueryParam("a") int a, @QueryParam("b") int b) {
return Uni.createFrom()
.future(
(Future<AddResponse>) myCalculator
.addAsync(a, b, res -> {
}))
.map(addResponse -> addResponse.getReturn());
}
}
4.7.2.3. 线程池 复制链接链接已复制到粘贴板!
此扩展提供的异步客户端利用 Quarkus 提供的线程池来利用 ManagedExecutor。线程池可以使用 quarkus.thread-pooloriented 系列 选项 进行配置。因此,在 Quarkus 上的 async 客户端不会满足 org.apache.cxf.transports.http.configuration.HTTPClientPolicy 的 executor 和线程池相关的属性。
您可以查看 CXF 异步客户端的更多详细信息,以及如何在 CXF 文档中 进一步调整它。