= CXF Transport Component
:doctitle: CXF Transport
:shortname: cxf-transport
:artifactid: camel-cxf-transport
:description: Camel Transport for Apache CXF
:since: 2.8
:supportlevel: Stable
:tabs-sync-option:
//Manually maintained attributes
:camel-spring-boot-name: cxf-transport

*Since Camel {since}*

[[CamelTransportforCXF-WhatstheCamelTransportforCXF]]
== What's the Camel Transport for CXF

In CXF you offer or consume a webservice by defining its address. The
first part of the address specifies the protocol to use. For example
address="http://localhost:9000" in an endpoint configuration means your
service will be offered using the http protocol on port 9000 of
localhost. When you integrate Camel Tranport into CXF you get a new
transport "camel". So you can specify
address="camel://direct:MyEndpointName" to bind the CXF service address
to a camel direct endpoint.

Technically speaking Camel transport for CXF is a component which
implements the
https://cxf.apache.org/docs/cxf-architecture.html#CXFArchitecture-Transports[CXF
transport API] with the Camel core library. This allows you to easily
use Camel's routing engine and integration patterns support together
with your CXF services.

[[CamelTransportforCXF-IntegrateCamelintoCXFtransportlayer]]
== Integrate Camel into CXF transport layer

To include the Camel Transport into your CXF bus you use the
CamelTransportFactory. You can do this in Java as well as in Spring.

[[CamelTransportforCXF-SettinguptheCamelTransportinSpring]]
=== Setting up the Camel Transport in Spring

You can use the following snippet in your applicationcontext if you want
to configure anything special. If you only want to activate the camel
transport you do not have to do anything in your application context. As
soon as you include the camel-cxf-transport.jar in your app, cxf will scan the
jar and load a CamelTransportFactory for you.

[source,xml]
--------------------------------------------------------------------------------------------------------
<!-- you don't need to specify the CamelTransportFactory configuration as it is auto load by CXF bus -->
<bean class="org.apache.camel.component.cxf.transport.CamelTransportFactory">
  <property name="bus" ref="cxf" />
  <property name="camelContext" ref="camelContext" />
  <!-- If checkException is true , CamelDestination will check the outMessage's
     exception and set it into camel exchange. You can also override this value 
     in CamelDestination's configuration. The default value is false.
     This option should be set true when you want to leverage the camel's error 
     handler to deal with fault message -->
  <property name="checkException" value="true" />
  <property name="transportIds">
    <list>
      <value>http://cxf.apache.org/transports/camel</value>
    </list>
  </property>
</bean>
--------------------------------------------------------------------------------------------------------

[[CamelTransportforCXF-IntegratingtheCamelTransportinaprogrammaticway]]
=== Integrating the Camel Transport in a programmatic way

Camel transport provides a setContext method that you could use to set
the Camel context into the transport factory. If you want this factory
take effect, you need to register the factory into the CXF bus. Here is
a full example for you.

[source,java]
------------------------------------------------------------------------------------------------------------------
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.transport.ConduitInitiatorManager;
import org.apache.cxf.transport.DestinationFactoryManager;
...

BusFactory bf = BusFactory.newInstance();
Bus bus = bf.createBus();
CamelTransportFactory camelTransportFactory = new CamelTransportFactory();
// set up the CamelContext which will be use by the CamelTransportFactory
camelTransportFactory.setCamelContext(context)
// if you are using CXF higher then 2.4.x the 
camelTransportFactory.setBus(bus);

// if you are lower CXF, you need to register the ConduitInitiatorManager and DestinationFactoryManager like below
// register the conduit initiator
ConduitInitiatorManager cim = bus.getExtension(ConduitInitiatorManager.class);
cim.registerConduitInitiator(CamelTransportFactory.TRANSPORT_ID, camelTransportFactory);
// register the destination factory
DestinationFactoryManager dfm = bus.getExtension(DestinationFactoryManager.class);
dfm.registerDestinationFactory(CamelTransportFactory.TRANSPORT_ID, camelTransportFactory);
// set or bus as the default bus for cxf
BusFactory.setDefaultBus(bus);
------------------------------------------------------------------------------------------------------------------

[[CamelTransportforCXF-ConfigurethedestinationandconduitwithSpring]]
== Configure the destination and conduit with Spring

[[CamelTransportforCXF-Namespace]]
=== Namespace

The elements used to configure a Camel transport endpoint are defined
in the namespace `\http://cxf.apache.org/transports/camel`. It is
commonly referred to using the prefix `camel`. In order to use the Camel
transport configuration elements, you will need to add the lines shown
below to the beans element of your endpoint's configuration file. In
addition, you will need to add the configuration elements' namespace to
the `xsi:schemaLocation` attribute.

*Adding the Configuration Namespace*

[source,java]
---------------------------------------------------------------------
<beans ...
       xmlns:camel="http://cxf.apache.org/transports/camel
       ...
       xsi:schemaLocation="...
                           http://cxf.apache.org/transports/camel
                           http://cxf.apache.org/transports/camel.xsd
                          ...>
---------------------------------------------------------------------

[[CamelTransportforCXF-Thedestinationelement]]
=== The `destination` element

You configure a Camel transport server endpoint using the
`camel:destination` element and its children. The `camel:destination`
element takes a single attribute, `name`, that specifies the WSDL port
element that corresponds to the endpoint. The value for the `name`
attribute takes the form _portQName_`.camel-destination`. The example
below shows the `camel:destination` element that would be used to add
configuration for an endpoint that was specified by the WSDL fragment
`<port binding="widgetSOAPBinding" name="widgetSOAPPort">` if the
endpoint's target namespace was `\http://widgets.widgetvendor.net`.

*camel:destination Element*

[source,java]
---------------------------------------------------------------------------------------------------------------------------
...
  <camel:destination name="{http://widgets/widgetvendor.net}widgetSOAPPort.http-destination>
    <camelContext id="context" xmlns="http://activemq.apache.org/camel/schema/spring">
         <route>
           <from uri="direct:EndpointC" />
           <to uri="direct:EndpointD" />
         </route>
     </camelContext>
  </camel:destination>

  <camel:destination name="{http://widgets/widgetvendor.net}widgetSOAPPort.camel-destination" camelContextId="context" />  

...
---------------------------------------------------------------------------------------------------------------------------

The `camel:destination` element for Spring has a number of child
elements that specify configuration information. They are described
below.

Element

Description

`camel-spring:camelContext`

You can specify the camel context in the camel destination

`camel:camelContextRef`

The camel context id which you want inject into the camel destination

[[CamelTransportforCXF-Theconduitelement]]
=== The `conduit` element

You configure a Camel transport client using the `camel:conduit` element
and its children. The `camel:conduit` element takes a single attribute,
`name`, that specifies the WSDL port element that corresponds to the
endpoint. The value for the `name` attribute takes the form
_portQName_`.camel-conduit`. For example, the code below shows the
`camel:conduit` element that would be used to add configuration for an
endpoint that was specified by the WSDL fragment
`<port binding="widgetSOAPBinding" name="widgetSOAPPort">` if the
endpoint's target namespace was `\http://widgets.widgetvendor.net`.

*http-conf:conduit Element*

[source,xml]
-------------------------------------------------------------------------------------------------------------------------
...
  <camelContext id="conduit_context" xmlns="http://activemq.apache.org/camel/schema/spring">
       <route>
           <from uri="direct:EndpointA" />
           <to uri="direct:EndpointB" />
       </route>
   </camelContext>

  <camel:conduit name="{http://widgets/widgetvendor.net}widgetSOAPPort.camel-conduit" camelContextId="conduit_context" />
     

  <camel:conduit name="*.camel-conduit">
  <!-- you can also using the wild card to specify the camel-conduit that you want to configure -->
    ...
  </camel:conduit>
...
-------------------------------------------------------------------------------------------------------------------------

The `camel:conduit` element has a number of child elements that specify
configuration information. They are described below.

Element

Description

`camel-spring:camelContext`

You can specify the camel context in the camel conduit

`camel:camelContextRef`

The camel context id which you want to inject into the camel conduit

[[CamelTransportforCXF-ExampleUsingCamelasaloadbalancerforCXF]]
== Example Using Camel as a load balancer for CXF

This example shows how to use the camel load balancing feature in CXF.
You need to load the configuration file in CXF and publish the endpoints
on the address "camel://direct:EndpointA" and "camel://direct:EndpointB"

include::spring-boot:partial$starter.adoc[]
