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 文档中 进一步调整它。

Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat
返回顶部