h2. CXF Proxy Example
|
*Available as of Camel 2.5*
|
This example is located in the {{examples/camel-example-cxf-proxy}} directory of the Camel distribution. There is a {{README.txt}} file with instructions how to run it.
|
If you use mMaven then you can easily run it from the command line using:
|
{code}
|
mvn jetty:run camel:run
|
{code} h3. About
|
This example demonstrates how you can use [CXF] to proxy a real web service. For example in this case we want Camel to validate and enrich the input message before its send to the real web service. We do this to ensure the data is correct and that missing information is added automatic by Camel. In real life you may want to do this in case a client send bad/faulty data to a web service, and its costly/not possible to update and fix that client. Instead lets fix it by a proxy with Camel.
|
This example demonstrates how [CXF] can be used to proxy a real web service. For this example we want Camel to validate and enrich the input message before it's sent to the actual web service. We do this to ensure the data is correct and to have Camel automatically add in any missing information. In real life you may wish to use a proxy in cases where clients are sending bad/faulty data to a web service, and it's costly/not possible to update and fix those clients.
|
{tip:title=Pure HTTP proxy}
|
If you want a pure http based proxy then you can use [Jetty] or [Servlet] as front end in Camel. Then delegate those incoming HTTP requests to the real web service. You may want to do this if you want a simple straight thru proxy where the message should not be altered by Camel. By using the [CXF] component you get access to all the web service features Apache CXF provides, where as with [Jetty] its just pure HTTP proxy.
|
If you want a pure HTTP-based proxy then you can use [Jetty] or [Servlet] as the front end in Camel. Then delegate those incoming HTTP requests to the real web service. This is for cases where you need a simple straight through proxy where the message should not be altered by Camel. By using the [CXF] component you get access to all the web service features Apache CXF provides, whereas [Jetty] will provide just a pure HTTP proxy.
|
{tip} h3. Implementation
|
Since this is a example it provides both the Camel application and the real web service in the same JVM. In your use-case the real webs ervice will be hosted on another server etc.
|
For this simple example both the Camel application and the real web service are in the same JVM. In production work the real web service may often be hosted on another server, etc.
|
h4. Spring XML
|
In the Spring XML file we have defined the [CXF] proxy endpoint using the {{<cxf:cxfEndpoint>}} tag. The real web service is the Spring bean with the id {{realWebService}}.
|
And the real web service is the Spring bean with the id {{realWebService}}.
|
|
As you can see in the Camel route we use a [CXF] consumer to proxy the web service. Then we route the message to the enrich bean EnrichBean which validates and adds the missing information. Then we just use the [HTTP] component to send the web service request to the real web service.
|
The reply from the real web service is then logged and used as a reply for the proxied web service as well.
|
{snippet:id=e1|lang=xml|url=""
|
...
|
h3. Running the example
|
You start the example from the command line using the maven goal {{mvn jetty:run}}. There is also a {{build.xml}} file for ANT users.
|
You start the example from the command line using the Maven goal {{mvn camel:run}}.
|
You can also start the Camel application from your IDE, by running the {{org.apache.camel.example.cxf.proxy.MyMain}} main class.
|
|
You can then use SoapUI or another web service client and send a request to the {{http://localhost:9080/camel-example-cxf-proxy/webservices/incident}} url. The wsdl is located at: {{http://localhost:9080/camel-example-cxf-proxy/webservices/incident?wsdl}}.
|
The console should then output progress.
|
After making a SOAP request, check the console to see the SOAP request and response:
|
h3. Sample output
|
Here is some a sample output from the console:
|
{code} 2010-09-26 12:20:46,974 [main ] INFO DefaultCamelContext - Apache Camel 2.5-SNAPSHOT (CamelContext: camel-1) started in 0.858 seconds
|
...
|
<soapenv:Body> <rep:inputReportIncident>
|
<incidentId>63</incidentId>
|
<incidentDate>2010-09-26</incidentDate>
|
<givenName>Ibsen</givenName> <givenName>Claus</givenName>
|
<familyName>Claus</familyName> <familyName>Ibsen</familyName>
|
<summary>Bla bla</summary> <details>More bla</details>
|
...
|
</soapenv:Body> </soapenv:Envelope>]
|
Incident was , 63, changed to 456
|
|
Invoked real web service: id=456 by Claus Ibsen
|
|
Invoked real web service: id=456 by Ibsen Claus
|
|
2010-09-26 12:20:55,997 [tp-1790017034-1] INFO output - Exchange[ExchangePattern:InOut, BodyType:org.apache.camel.converter.stream.CachedOutputStream.WrappedInputStream, Body:
|
...
|