4.7. HTTP 非同期トランスポート
Apache HttpComponents HttpClient 5 を使用して非同期 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. 使用方法 リンクのコピーリンクがクリップボードにコピーされました!
quarkus-cxf-rt-transports-http-hc5 依存関係がクラスパスで使用可能になると、CXF は非同期呼び出しに HttpAsyncClient を使用し、同期呼び出しには引き続き HttpURLConnection を使用します。
4.7.2.1. 非同期メソッドの生成 リンクのコピーリンクがクリップボードにコピーされました!
非同期クライアント呼び出しには、サービスエンドポイントインターフェイスにいくつかの追加メソッドが必要です。そのコードはデフォルトでは生成されません。
これを有効にするには、enableAsyncMapping を true に設定した JAX-WS バインディングファイルを作成する必要があります。
このセクションで使用されているサンプルコードスニペットは、Quarkus CXF のソースツリーにある HC5 integration test からの抜粋です。
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-pool.* ファミリーを使用して設定できます。その場合、org.apache.cxf.transports.http.configuration.HTTPClientPolicy のエグゼキューターおよびスレッドプール関連の属性は、Quarkus 上の非同期クライアントで考慮されません。
CXF 非同期クライアントの詳細と、その調整方法は、CXF ドキュメント を参照してください。