camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Claus Ibsen (Confluence)" <conflue...@apache.org>
Subject [CONF] Apache Camel > ServletListener Component
Date Fri, 20 Sep 2013 07:09:00 GMT
<html>
<head>
    <base href="https://cwiki.apache.org/confluence">
            <link rel="stylesheet" href="/confluence/s/en/2176/1/1/_/styles/combined.css?spaceKey=CAMEL&amp;forWysiwyg=true"
type="text/css">
    </head>
<body style="background: white;" bgcolor="white" class="email-body">
<div id="pageContent">
<div id="notificationFormat">
<div class="wiki-content">
<div class="email">
    <h2><a href="https://cwiki.apache.org/confluence/display/CAMEL/ServletListener+Component">ServletListener
Component</a></h2>
    <h4>Page <b>edited</b> by             <a href="https://cwiki.apache.org/confluence/display/~davsclaus">Claus
Ibsen</a>
    </h4>
        <br/>
                         <h4>Changes (1)</h4>
                                 
    
<div id="page-diffs">
                    <table class="diff" cellpadding="0" cellspacing="0">
    
            <tr><td class="diff-snipped" >...<br></td></tr>
            <tr><td class="diff-unchanged" >| jmx.XXX | | To configure [JMX|Camel
JMX]. You should prefix the option with &quot;jmx.&quot;, for example to disable JMX,
use jmx.disabled as name. You can configure all the options from {{org.apache.camel.spi.ManagementAgent}}.
As well the options mentioned on the [JMX|Camel JMX] page. | <br>| name | {{String}}
| To configure the name of the [CamelContext]. | <br></td></tr>
            <tr><td class="diff-added-lines" style="background-color: #dfd;">|
messageHistory | {{Boolean}} | *Camel 2.12.2:* Whether to enable or disable [Message History]
(enabled by default). | <br></td></tr>
            <tr><td class="diff-unchanged" >| streamCache | {{Boolean}} | Whether
to enable [Stream Caching]. | <br>| trace | {{Boolean}} | Whether to enable [Tracer].
| <br></td></tr>
            <tr><td class="diff-snipped" >...<br></td></tr>
    
            </table>
    </div>                            <h4>Full Content</h4>
                    <div class="notificationGreySide">
        <h2><a name="ServletListenerComponent-ServletListenerComponent"></a>ServletListener
Component</h2>
<p><b>Available as of Camel 2.11</b></p>

<p>This component is used for bootstrapping Camel applications in web applications.
For example beforehand people would have to find their own way of bootstrapping Camel, or
rely on 3rd party frameworks such as Spring to do it.</p>

<div class='panelMacro'><table class='noteMacro'><colgroup><col width='24'><col></colgroup><tr><td
valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16"
align="absmiddle" alt="" border="0"></td><td><b>Sidebar</b><br
/>This component supports Servlet 2.x onwards, which mean it works also in older web containers;
which is the goal of this component.<br/>
Though Servlet 2.x requires to use a web.xml file as configuration.

<p>For Servlet 3.x containers you can use annotation driven configuration to boostrap
Camel using the @WebListener, and implement your own class, where you boostrap Camel. Doing
this still puts the challenge how to let end users easily configure Camel, which you get for
free with the old school web.xml file.</p></td></tr></table></div>

<p>Maven users will need to add the following dependency to their <tt>pom.xml</tt>
for this component:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
&lt;dependency&gt;
    &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
    &lt;artifactId&gt;camel-servletlistener&lt;/artifactId&gt;
    &lt;version&gt;x.x.x&lt;/version&gt;
    &lt;!-- use the same version as your Camel core version --&gt;
&lt;/dependency&gt;
</pre>
</div></div>

<h3><a name="ServletListenerComponent-Using"></a>Using</h3>

<p>You would need to chose one of the following implementations of the abstract class
<tt>org.apache.camel.component.servletlistener.CamelServletContextListener</tt>.</p>
<ul class="alternate" type="square">
	<li><tt>JndiCamelServletContextListener</tt> which uses the <tt>JndiRegistry</tt>
to leverage JNDI for its registry.</li>
	<li><tt>SimpleCamelServletContextListener</tt> which uses the <tt>SimpleRegistry</tt>
to leverage a <tt>java.util.Map</tt> as its registry.</li>
</ul>


<p>To use this you need to configure the <tt>org.apache.camel.component.servletlistener.CamelServletContextListener</tt>
in the <tt>WEB-INF/web.xml</tt> file as shown below:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Default; brush: xml; gutter: false"><![CDATA[
&lt;web-app&gt;

  &lt;!-- the test parameter is only to be used for unit testing --&gt;
  &lt;!-- you should not use this option for production usage --&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;test&lt;/param-name&gt;
    &lt;param-value&gt;true&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;!-- you can configure any of the properties on CamelContext, eg setName will be
configured as below --&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;name&lt;/param-name&gt;
    &lt;param-value&gt;MyCamel&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;!-- configure a route builder to use --&gt;
  &lt;!-- Camel will pickup any parameter names that start with routeBuilder (case ignored)
--&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;routeBuilder-MyRoute&lt;/param-name&gt;
    &lt;param-value&gt;org.apache.camel.component.servletlistener.MyRoute&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;!-- register Camel as a listener so we can bootstrap Camel when the web application
starts --&gt;
  &lt;listener&gt;
    &lt;listener-class&gt;org.apache.camel.component.servletlistener.SimpleCamelServletContextListener&lt;/listener-class&gt;
  &lt;/listener&gt;

&lt;/web-app&gt;
]]></script>
</div></div>

<h3><a name="ServletListenerComponent-Options"></a>Options</h3>

<p>The <tt>org.apache.camel.component.servletlistener.CamelServletContextListener</tt>
supports the following options which can be configured as context-param in the web.xml file.</p>

<div class="confluenceTableSmall"><div class='table-wrap'>
<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Option </th>
<th class='confluenceTh'> Type </th>
<th class='confluenceTh'> Description </th>
</tr>
<tr>
<td class='confluenceTd'> propertyPlaceholder.XXX </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> To configure <a href="/confluence/display/CAMEL/Using+PropertyPlaceholder"
title="Using PropertyPlaceholder">property placeholders</a> in Camel. You should
prefix the option with "propertyPlaceholder.", for example to configure the location, use
propertyPlaceholder.location as name. You can configure all the options from the <a href="/confluence/display/CAMEL/Properties"
title="Properties">Properties</a> component. </td>
</tr>
<tr>
<td class='confluenceTd'> jmx.XXX </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> To configure <a href="/confluence/display/CAMEL/Camel+JMX"
title="Camel JMX">JMX</a>. You should prefix the option with "jmx.", for example
to disable JMX, use jmx.disabled as name. You can configure all the options from <tt>org.apache.camel.spi.ManagementAgent</tt>.
As well the options mentioned on the <a href="/confluence/display/CAMEL/Camel+JMX" title="Camel
JMX">JMX</a> page. </td>
</tr>
<tr>
<td class='confluenceTd'> name </td>
<td class='confluenceTd'> <tt>String</tt> </td>
<td class='confluenceTd'> To configure the name of the <a href="/confluence/display/CAMEL/CamelContext"
title="CamelContext">CamelContext</a>. </td>
</tr>
<tr>
<td class='confluenceTd'> messageHistory </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> <b>Camel 2.12.2:</b> Whether to enable or disable
<a href="/confluence/display/CAMEL/Message+History" title="Message History">Message
History</a> (enabled by default). </td>
</tr>
<tr>
<td class='confluenceTd'> streamCache </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> Whether to enable <a href="/confluence/display/CAMEL/Stream+caching"
title="Stream caching">Stream caching</a>. </td>
</tr>
<tr>
<td class='confluenceTd'> trace </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> Whether to enable <a href="/confluence/display/CAMEL/Tracer"
title="Tracer">Tracer</a>. </td>
</tr>
<tr>
<td class='confluenceTd'> delayer </td>
<td class='confluenceTd'> <tt>Long</tt> </td>
<td class='confluenceTd'> To set a delay value for <a href="/confluence/display/CAMEL/Delay+Interceptor"
title="Delay Interceptor">Delay Interceptor</a>. </td>
</tr>
<tr>
<td class='confluenceTd'> handleFault </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> Whether to enable handle fault. </td>
</tr>
<tr>
<td class='confluenceTd'> errorHandlerRef </td>
<td class='confluenceTd'> <tt>String</tt> </td>
<td class='confluenceTd'> Refers to a context scoped <a href="/confluence/display/CAMEL/Error+Handler"
title="Error Handler">Error Handler</a> to be used. </td>
</tr>
<tr>
<td class='confluenceTd'> autoStartup </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> Whether to start all routes when starting Camel. </td>
</tr>
<tr>
<td class='confluenceTd'> useMDCLogging </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> Whether to use <a href="/confluence/display/CAMEL/MDC+logging"
title="MDC logging">MDC logging</a>. </td>
</tr>
<tr>
<td class='confluenceTd'> useBreadcrumb </td>
<td class='confluenceTd'> <tt>Boolean</tt> </td>
<td class='confluenceTd'> Whether to use <a href="/confluence/display/CAMEL/MDC+logging"
title="MDC logging">breadcrumb</a>. </td>
</tr>
<tr>
<td class='confluenceTd'> managementNamePattern </td>
<td class='confluenceTd'> <tt>String</tt> </td>
<td class='confluenceTd'> To set a custom naming pattern for JMX MBeans. </td>
</tr>
<tr>
<td class='confluenceTd'> threadNamePattern </td>
<td class='confluenceTd'> <tt>String</tt> </td>
<td class='confluenceTd'> To set a custom naming pattern for threads. </td>
</tr>
<tr>
<td class='confluenceTd'> properties.XXX </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> To set custom properties on <tt>CamelContext.getProperties</tt>.
This is seldom in use. </td>
</tr>
<tr>
<td class='confluenceTd'> routebuilder.XXX </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> To configure routes to be used. See below for more details.
</td>
</tr>
<tr>
<td class='confluenceTd'> CamelContextLifecycle </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Refers to a FQN classname of an implementation of <tt>org.apache.camel.component.servletlistener.CamelContextLifecycle</tt>.
Which allows to execute custom code before and after <a href="/confluence/display/CAMEL/CamelContext"
title="CamelContext">CamelContext</a> has been started or stopped. See below for
further details. </td>
</tr>
<tr>
<td class='confluenceTd'> XXX </td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> To set any option on <a href="/confluence/display/CAMEL/CamelContext"
title="CamelContext">CamelContext</a>. </td>
</tr>
</tbody></table>
</div>
</div>

<h3><a name="ServletListenerComponent-Examples"></a>Examples</h3>

<p>See <a href="/confluence/display/CAMEL/Servlet+Tomcat+No+Spring+Example" title="Servlet
Tomcat No Spring Example">Servlet Tomcat No Spring Example</a>. </p>

<h3><a name="ServletListenerComponent-Configuringroutes"></a>Configuring
routes</h3>

<p>You need to configure which routes to use in the web.xml file. You can do this in
a number of ways, though all the parameters must be prefixed with "routeBuilder".</p>

<h4><a name="ServletListenerComponent-UsingaRouteBuilderclass"></a>Using
a RouteBuilder class</h4>

<p>By default Camel will assume the param-value is a FQN classname for a Camel <a
href="/confluence/display/CAMEL/RouteBuilder" title="RouteBuilder">RouteBuilder</a>
class, as shown below:</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;context-param&gt;
    &lt;param-name&gt;routeBuilder-MyRoute&lt;/param-name&gt;
    &lt;param-value&gt;org.apache.camel.component.servletlistener.MyRoute&lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>

<p>You can specify multiple classes in the same param-value as shown below:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;context-param&gt;
    &lt;param-name&gt;routeBuilder-routes&lt;/param-name&gt;
    &lt;!-- we can define multiple values separated by comma --&gt;
    &lt;param-value&gt;
      org.apache.camel.component.servletlistener.MyRoute,
      org.apache.camel.component.servletlistener.routes.BarRouteBuilder
    &lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>

<p>The name of the parameter does not have a meaning at runtime. It just need to be
unique and start with "routeBuilder". In the example above we have "routeBuilder-routes".
But you could just as well have named it "routeBuilder.foo".</p>

<h4><a name="ServletListenerComponent-Usingpackagescanning"></a>Using package
scanning</h4>

<p>You can also tell Camel to use package scanning, which mean it will look in the given
package for all classes of <a href="/confluence/display/CAMEL/RouteBuilder" title="RouteBuilder">RouteBuilder</a>
types and automatic adding them as Camel routes. To do that you need to prefix the value with
"packagescan:" as shown below:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;context-param&gt;
    &lt;param-name&gt;routeBuilder-MyRoute&lt;/param-name&gt;
    &lt;!-- define the routes using package scanning by prefixing with packagescan: --&gt;
    &lt;param-value&gt;packagescan:org.apache.camel.component.servletlistener.routes&lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>

<h4><a name="ServletListenerComponent-UsingaXMLfile"></a>Using a XML file</h4>

<p>You can also define Camel routes using XML DSL, though as we are not using Spring
or Blueprint the XML file can only contain Camel route(s). <br/>
In the web.xml you refer to the XML file which can be from "classpath", "file" or a "http"
url, as shown below:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;context-param&gt;
    &lt;param-name&gt;routeBuilder-MyRoute&lt;/param-name&gt;
    &lt;param-value&gt;classpath:routes/myRoutes.xml&lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>

<p>And the XML file is:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!-- the xmlns="http://camel.apache.org/schema/spring" is needed --&gt;
&lt;routes xmlns="http://camel.apache.org/schema/spring"&gt;

  &lt;route id="foo"&gt;
    &lt;from uri="direct:foo"/&gt;
    &lt;to uri="mock:foo"/&gt;
  &lt;/route&gt;

  &lt;route id="bar"&gt;
    &lt;from uri="direct:bar"/&gt;
    &lt;to uri="mock:bar"/&gt;
  &lt;/route&gt;

&lt;/routes&gt;
</pre>
</div></div>

<p>Notice that in the XML file the root tag is &lt;routes&gt; which must use
the namespace "http://camel.apache.org/schema/spring". This namespace is having the spring
in the name, but that is because of historical reasons, as Spring was the first and only XML
DSL back in the time. At runtime no Spring JARs is needed. Maybe in Camel 3.0 the namespace
can be renamed to a generic name.</p>


<h4><a name="ServletListenerComponent-Configuringpropertplaceholders"></a>Configuring
propert placeholders</h4>

<p>Here is a snippet of a web.xml configuration for setting up property placeholders
to load <tt>myproperties.properties</tt> from the classpath</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;!-- setup property placeholder to load properties from classpath --&gt;
  &lt;!-- we do this by setting the param-name with propertyPlaceholder. as prefix and
then any options such as location, cache etc --&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;propertyPlaceholder.location&lt;/param-name&gt;
    &lt;param-value&gt;classpath:myproperties.properties&lt;/param-value&gt;
  &lt;/context-param&gt;
  &lt;!-- for example to disable cache on properties component, you do --&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;propertyPlaceholder.cache&lt;/param-name&gt;
    &lt;param-value&gt;false&lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>

<h4><a name="ServletListenerComponent-ConfiguringJMX"></a>Configuring JMX</h4>

<p>Here is a snippet of a web.xml configuration for configuring JMX, such as disabling
JMX.</p>

<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;!-- configure JMX by using names that is prefixed with jmx. --&gt;
  &lt;!-- in this example we disable JMX --&gt;
  &lt;context-param&gt;
    &lt;param-name&gt;jmx.disabled&lt;/param-name&gt;
    &lt;param-value&gt;true&lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>


<h3><a name="ServletListenerComponent-JNDIorSimpleasCamelRegistry"></a>JNDI
or Simple as Camel <a href="/confluence/display/CAMEL/Registry" title="Registry">Registry</a></h3>

<p>This component uses either JNDI or Simple as the <a href="/confluence/display/CAMEL/Registry"
title="Registry">Registry</a>.<br/>
This allows you to lookup <a href="/confluence/display/CAMEL/Bean" title="Bean">Bean</a>s
and other services in JNDI, and as well to bind and unbind your own <a href="/confluence/display/CAMEL/Bean"
title="Bean">Bean</a>s.</p>

<p>This is done from Java code by implementing the <tt>org.apache.camel.component.servletlistener.CamelContextLifecycle</tt>.</p>

<h4><a name="ServletListenerComponent-UsingcustomCamelContextLifecycle"></a>Using
custom CamelContextLifecycle</h4>

<p>In the code below we use the callbacks <tt>beforeStart</tt> and <tt>afterStop</tt>
to enlist our custom bean in the Simple <a href="/confluence/display/CAMEL/Registry" title="Registry">Registry</a>,
and as well to cleanup when we stop.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<script type="syntaxhighlighter" class="theme: Default; brush: java; gutter: false"><![CDATA[
/**
 * Our custom {@link CamelContextLifecycle} which allows us to enlist beans in the {@link
JndiContext}
 * so the Camel application can lookup the beans in the {@link org.apache.camel.spi.Registry}.
 * &lt;p/&gt;
 * We can of course also do other kind of custom logic as well.
 */
public class MyLifecycle implements CamelContextLifecycle&lt;SimpleRegistry&gt; {

    @Override
    public void beforeStart(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
        // enlist our bean(s) in the registry
        registry.put("myBean", new HelloBean());
    }

    @Override
    public void afterStart(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
        // noop
    }

    @Override
    public void beforeStop(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
        // noop
    }

    @Override
    public void afterStop(ServletCamelContext camelContext, SimpleRegistry registry) throws
Exception {
        // unbind our bean when Camel has been stopped
        registry.remove("myBean");
    }
}
]]></script>
</div></div>

<p>Then we need to register this class in the web.xml file as shown below, using the
parameter name "CamelContextLifecycle". The value must be a FQN which refers to the class
implementing the <tt>org.apache.camel.component.servletlistener.CamelContextLifecycle</tt>
interface.</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: xml; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
  &lt;context-param&gt;
    &lt;param-name&gt;CamelContextLifecycle&lt;/param-name&gt;
    &lt;param-value&gt;org.apache.camel.component.servletlistener.MyLifecycle&lt;/param-value&gt;
  &lt;/context-param&gt;
</pre>
</div></div>

<p>As we enlisted our HelloBean <a href="/confluence/display/CAMEL/Bean" title="Bean">Bean</a>
using the name "myBean" we can refer to this <a href="/confluence/display/CAMEL/Bean" title="Bean">Bean</a>
in the Camel routes as shown below:</p>
<div class="code panel" style="border-width: 1px;"><div class="codeContent panelContent">
<pre class="theme: Default; brush: java; gutter: false" style="font-size:12px; font-family:
ConfluenceInstalledFont,monospace;">
public class MyBeanRoute extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("seda:foo").routeId("foo")
            .to("bean:myBean")
            .to("mock:foo");
    }
}
</pre>
</div></div>

<p><b>Important:</b> If you use <tt>org.apache.camel.component.servletlistener.JndiCamelServletContextListener</tt>
then the <tt>CamelContextLifecycle</tt> must use the <tt>JndiRegistry</tt>
as well. And likewise if the servlet is <tt>org.apache.camel.component.servletlistener.SimpleCamelServletContextListener</tt>
then the <tt>CamelContextLifecycle</tt> must use the <tt>SimpleRegistry</tt>
</p>

<h3><a name="ServletListenerComponent-SeeAlso"></a>See Also</h3>
<ul class="alternate" type="square">
	<li><a href="/confluence/display/CAMEL/SERVLET" title="SERVLET">SERVLET</a></li>
	<li><a href="/confluence/display/CAMEL/Servlet+Tomcat+Example" title="Servlet Tomcat
Example">Servlet Tomcat Example</a></li>
	<li><a href="/confluence/display/CAMEL/Servlet+Tomcat+No+Spring+Example" title="Servlet
Tomcat No Spring Example">Servlet Tomcat No Spring Example</a></li>
</ul>

    </div>
        <div id="commentsSection" class="wiki-content pageSection">
        <div style="float: right;" class="grey">
                        <a href="https://cwiki.apache.org/confluence/users/removespacenotification.action?spaceKey=CAMEL">Stop
watching space</a>
            <span style="padding: 0px 5px;">|</span>
                <a href="https://cwiki.apache.org/confluence/users/editmyemailsettings.action">Change
email notification preferences</a>
</div>
        <a href="https://cwiki.apache.org/confluence/display/CAMEL/ServletListener+Component">View
Online</a>
        |
        <a href="https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=30747188&revisedVersion=10&originalVersion=9">View
Changes</a>
                |
        <a href="https://cwiki.apache.org/confluence/display/CAMEL/ServletListener+Component?showComments=true&amp;showCommentArea=true#addcomment">Add
Comment</a>
            </div>
</div>
</div>
</div>
</div>
</body>
</html>

Mime
View raw message