Overview

CXF includes a "local" transport. This transport allows you to send messsages more efficiently inside a JVM. The messages will serialized and piped from one endpoint to another.

The local transport supports URIs of the structure "local://{endpoint_name}" where {endpoint_name} is any set of characters. To use the local transport you simply need to set your address to a local URI.

Examples

JAX-WS

This code shows how to publish on a local endpoint:

import javax.xml.ws.Endpoint;

HelloServiceImpl serverImpl = new HelloServiceImpl();
Endpoint.publish("local://hello", serverImpl);

Or with XML:

<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:simple="http://cxf.apache.org/simple"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
http://cxf.apache.org/simple http://cxf.apache.org/schemas/simple.xsd">

  <import resource="classpath:META-INF/cxf/cxf.xml"/>
  <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/>
    
  <bean class="org.apache.cxf.transport.local.LocalTransportFactory" lazy-init="false">
      <property name="transportIds">
          <list>
              <value>http://cxf.apache.org/transports/local</value>
              <value>http://schemas.xmlsoap.org/soap/http</value>
              <value>http://schemas.xmlsoap.org/wsdl/soap/http</value>
          </list>
      </property>
  </bean>
  
  <jaxws:endpoint name="helloWorld" address="local://hello" implementor="org.example.HelloServiceImpl"/>

</beans>

Simple Frontend

Before you use the local transport , you need to register the default soap transportURI with the local transport factory in the bus


Bus bus = BusFactory.getDefaultBus();
LocalTransportFactory localTransport = new LocalTransportFactory();
dfm.registerDestinationFactory("http://schemas.xmlsoap.org/soap/http", localTransport);
dfm.registerDestinationFactory("http://schemas.xmlsoap.org/wsdl/soap/http", localTransport);
dfm.registerDestinationFactory("http://cxf.apache.org/bindings/xformat", localTransport);
dfm.registerDestinationFactory("http://cxf.apache.org/transports/local", localTransport);

ConduitInitiatorManager extension = bus.getExtension(ConduitInitiatorManager.class);
extension.registerConduitInitiator("http://cxf.apache.org/transports/local", localTransport);
extension.registerConduitInitiator("http://schemas.xmlsoap.org/wsdl/soap/http", localTransport);
extension.registerConduitInitiator("http://schemas.xmlsoap.org/soap/http", localTransport);
extension.registerConduitInitiator("http://cxf.apache.org/bindings/xformat", localTransport);

You can also pass in a local://address to the server and client factory beans:

import org.apache.cxf.frontend.ServerFactoryBean;

ServerFactoryBean sf = new ServerFactoryBean();
sf.setAddress("local://hello");
sf.setServiceBean(new HelloServiceImpl());
sf.setServiceClass(HelloService.class); // Optionally specify the service interface
sf.create();
import org.apache.cxf.frontend.ClientProxyFactoryBean;

ClientProxyFactoryBean cf = new ClientProxyFactoryBean();
cf.setAddress("local://hello");
cf.setServiceClass(HelloService.class); // Optionally specify the service interface
HelloService h = (HelloService) cf.create();