Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

...

The servlet: component provides HTTP based endpoints for consuming HTTP requests that arrive at a http HTTP endpoint and this endpoint is bind with that is bound to a published Servlet.NOTE: This component is new to Camel 2.0

Maven users will need to add the following dependency to their pom.xml for this component:

...

Servlet is stream based, which means the input it receives is submitted to Camel as a stream. That means you will only be able to read the content of the stream once. If you find a situation where the message body appears to be empty or you need to access the data multiple times (eg: doing multicasting, or redelivery error handling) you should use Stream caching or convert the message body to a String which is safe to be read multiple times.

URI format

...

You can append query options to the URI in the following format, ?option=value&option=value&...

Options

...

Name

Default Value

Description

httpBindingRef

null

Reference to an org.apache.camel.component.http.HttpBinding in the Registry. A HttpBinding implementation can be used to customize how to write a response.

httpBindingnullCamel 2.16: Reference to an org.apache.camel.component.http.HttpBinding in the Registry. A HttpBindingimplementation can be used to customize how to write a response

...

.

matchOnUriPrefix

false

Whether or not the CamelServlet should try to find a target consumer by matching the URI prefix, if no exact match is found.

servletName

...

CamelServlet

Specifies the

...

servlet name

...

that the

...

servlet endpoint will bind

...

to. This name should match the name you define in web.xml file.

httpMethodRestrict

nullCamel 2.11: Consumer only: Used to only allow consuming if the HttpMethod matches, such as GET/POST/PUT etc. From Camel 2.15 onwards multiple methods can be specified separated by comma.

Message Headers

Camel will apply the same Message Headers form as the HTTP component.

Camel will also populate all request.parameter and request.headers. For instance of example, if a client request with has the URL, http://myserver/myserver?orderid=123Image Removed then , the exchange will contain a header named orderid with the value 123.

Usage

You can consume only consume from endpoints generated by the Servlet component. Therefore, it should only be used only as input into your camel RoutesCamel routes. To issue HTTP requests against other HTTP endpoints you can , use the HTTP Component

Using Servlet 3.0 Async Mode

Available as of Camel 2.18

You can configure the servlet with an init-param to turn on async mode when using a Servlet 3.x container. There is a sample XML configuration below:

...

 

Putting Camel JARs in the app server boot classpath

If you put the Camel JARs such as camel-core, camel-servlet, etc. in the boot classpath of your application server (eg usually in its lib directory), then mind that the servlet mapping list is now shared between multiple deployed Camel application in the app server.

Mind that putting Camel JARs in the boot classpath of the application server is generally not best practice!

So in those situations you must define a custom and unique servlet name in each of your Camel application, eg in the web.xml define:

...

And in your Camel endpoints then include the servlet name as well

...

From Camel 2.11 onwards Camel will detect this duplicate and fail to start the application. You can control to ignore this duplicate by setting the servlet init-parameter ignoreDuplicateServletName to true as follows:

...

But its strongly advised to use unique servlet-name for each Camel application to avoid this duplication clash, as well any unforeseen side-effects.

Sample

...

From Camel 2.7 onwards it's easier to use Servlet in Spring web applications. See Servlet Tomcat Example for details.

In this sample, we define a route where we expose a http that exposes a HTTP service at http://localhost:8080/camel/services/helloImage Removed:.
First, you need to publish the CamelHttpTransportServlet through the normal Web Container, or OSGi Service.
Using Use the Web.xml file to publish the CamelHttpTransportServlet

...

as follows:{snippet:id=web|lang=xml|url=camel/trunk/components/camel-servlet/src/test/resources/org/apache/camel/component/servlet/web.xml

...

Using the Activator to publish the CamelHttpTransportServlet in the OSGi platform

...

}

...

Then you can define you router like this

...

your route as follows:{snippet:id=route|lang=java|url=camel/trunk/components/camel-servlet/src/test/java/org/apache/camel/component/servlet/HttpClientRouteTest.java}

...

...

Since we are binding the Http transport with a published

...

servlet, and we don't know the

...

servlet's application context path, the camel-servlet endpoint

...

uses the relative path to specify the endpoint's URL.

...

A client can access the camel-servlet endpoint through the

...

servlet publish address: ("http://localhost:8080/camel/services") + RELATIVE_PATH("/hello").

Sample when using Spring 3.

...

x

See Servlet Tomcat Example

Sample when using Spring 2.x

When using the Servlet component in a Camel/Spring application it's often required to load the Spring ApplicationContext after the Servlet component has started. This can be accomplished by using Spring's ContextLoaderServlet instead of ContextLoaderListener. In that case you'll need to start ContextLoaderServlet after CamelHttpTransportServlet like this:

...

Sample when using OSGi

From Camel 2.6.0, you can publish the CamelHttpTransportServlet as an OSGi service with help of SpringDM like this.{snippet:id=service|lang=xml|url=camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/servlet/ServletServiceContext.xml}Then use this service in your camel route like this:{snippet:id=camelContext|lang=xml|url=camel/trunk/tests/camel-itest-osgi/src/test/resources/org/apache/camel/itest/osgi/servlet/CamelServletWithServletServiceContext.xml}For versions prior to Camel 2.6 you can use an Activator to publish the CamelHttpTransportServlet on the OSGi platform{snippet:id=activator|lang=java|url=camel/trunk/tests/camel-itest-osgi/src/test/java/org/apache/camel/itest/osgi/servlet/support/ServletActivator.java}Endpoint See Also

...