HTTP Async Transport

🧪Experimental • Since 1.1.0

Implement async SOAP Clients using Apache HttpComponents HttpClient 5.

This extension is experimental, because there are no tests covering it. Contributions are welcome!

Maven coordinates

Create a new project using quarkus-cxf-rt-transports-http-hc5 on code.quarkus.io or add these coordinates to your existing project:

<dependency>
    <groupId>io.quarkiverse.cxf</groupId>
    <artifactId>quarkus-cxf-rt-transports-http-hc5</artifactId>
</dependency>
Check the User guide and especially its Dependency management section for more information about writing applications with CXF Extensions for Quarkus.

Usage

Once the quarkus-cxf-rt-transports-http-hc5 dependency is available in the classpath, CXF will use HttpAsyncClient for asynchronous calls and will continue using HttpURLConnection for synchronous calls.

You can see more details about the CXF asynchronous client and how to tune it further in CXF documentation.

Asynchronous Clients and Mutiny

Asynchronous client invocations require some additional methods in the service endpoint interface. That code is not generated by default.

To enable it, you need to create a JAX-WS binding file with enableAsyncMapping set to true:

binding.xml
<bindings xmlns:xsd="http://www.w3.org/2001/XMLSchema"
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
          wsdlLocation="AffectedWSDL"
          xmlns="http://java.sun.com/xml/ns/jaxws">
  <bindings node="AffectedNode">
    <enableAsyncMapping>true</enableAsyncMapping>
  </bindings>
</bindings>

This file should then be passed to wsdl2java through its additional-params property:

application.properties
quarkus.cxf.java2ws.includes = HelloService.wsdl
quarkus.cxf.java2ws.foo-params.additional-params = -b,src/main/resources/binding.xml

Once the asynchronous stubs are available, it is possible to wrap a client call in io.smallrye.mutiny.Uni as shown below:

import jakarta.inject.Inject;
import io.smallrye.mutiny.Uni;
import io.quarkiverse.cxf.annotation.CXFClient;

class Client {

    @Inject @CXFClient
    CalculatorService calculator;

    public Uni add(int a, int b) {
        return Uni.createFrom().future(() ->
                (Future)calculatorSoap.addAsync(a, b, res -> {}));
    }
}
A sample application demonstrating this flow is available here.