Modified: websites/production/camel/content/book-in-one-page.html ============================================================================== --- websites/production/camel/content/book-in-one-page.html (original) +++ websites/production/camel/content/book-in-one-page.html Sun Jul 12 09:19:43 2015 @@ -3679,11 +3679,11 @@ The tutorial has been designed in two pa While not actual tutorials you might find working through the source of the various <a shape="rect" href="examples.html">Examples</a> useful.</li></ul> <h2 id="BookInOnePage-TutorialonSpringRemotingwithJMS">Tutorial on Spring Remoting with JMS</h2><p> </p><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Thanks</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>This tutorial was kindly donated to Apache Camel by Martin Gilday.</p></div></div><h2 id="BookInOnePage-Preface">Preface</h2><p>This tutorial aims to guide the reader through the stages of creating a project which uses Camel to facilitate the routing of messages from a JMS queue to a <a shape="rect" class="external-link" href="http://www.springramework.org" rel="nofollow">Spring</a> service. The route works in a synchronous fashion returning a response to the client.</p><p><style type="text/css">/*<![CDATA[*/ -div.rbtoc1436627877342 {padding: 0px;} -div.rbtoc1436627877342 ul {list-style: disc;margin-left: 0px;} -div.rbtoc1436627877342 li {margin-left: 0px;padding-left: 0px;} +div.rbtoc1436692699325 {padding: 0px;} +div.rbtoc1436692699325 ul {list-style: disc;margin-left: 0px;} +div.rbtoc1436692699325 li {margin-left: 0px;padding-left: 0px;} -/*]]>*/</style></p><div class="toc-macro rbtoc1436627877342"> +/*]]>*/</style></p><div class="toc-macro rbtoc1436692699325"> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-TutorialonSpringRemotingwithJMS">Tutorial on Spring Remoting with JMS</a></li><li><a shape="rect" href="#BookInOnePage-Preface">Preface</a></li><li><a shape="rect" href="#BookInOnePage-Prerequisites">Prerequisites</a></li><li><a shape="rect" href="#BookInOnePage-Distribution">Distribution</a></li><li><a shape="rect" href="#BookInOnePage-About">About</a></li><li><a shape="rect" href="#BookInOnePage-CreatetheCamelProject">Create the Camel Project</a> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-UpdatethePOMwithDependencies">Update the POM with Dependencies</a></li></ul> </li><li><a shape="rect" href="#BookInOnePage-WritingtheServer">Writing the Server</a> @@ -5783,11 +5783,11 @@ So we completed the last piece in the pi <p>This example has been removed from <strong>Camel 2.9</strong> onwards. Apache Axis 1.4 is a very old and unsupported framework. We encourage users to use <a shape="rect" href="cxf.html">CXF</a> instead of Axis.</p></div></div> <style type="text/css">/*<![CDATA[*/ -div.rbtoc1436627877996 {padding: 0px;} -div.rbtoc1436627877996 ul {list-style: disc;margin-left: 0px;} -div.rbtoc1436627877996 li {margin-left: 0px;padding-left: 0px;} +div.rbtoc1436692699565 {padding: 0px;} +div.rbtoc1436692699565 ul {list-style: disc;margin-left: 0px;} +div.rbtoc1436692699565 li {margin-left: 0px;padding-left: 0px;} -/*]]>*/</style><div class="toc-macro rbtoc1436627877996"> +/*]]>*/</style><div class="toc-macro rbtoc1436692699565"> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-TutorialusingAxis1.4withApacheCamel">Tutorial using Axis 1.4 with Apache Camel</a> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-Prerequisites">Prerequisites</a></li><li><a shape="rect" href="#BookInOnePage-Distribution">Distribution</a></li><li><a shape="rect" href="#BookInOnePage-Introduction">Introduction</a></li><li><a shape="rect" href="#BookInOnePage-SettinguptheprojecttorunAxis">Setting up the project to run Axis</a> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-Maven2">Maven 2</a></li><li><a shape="rect" href="#BookInOnePage-wsdl">wsdl</a></li><li><a shape="rect" href="#BookInOnePage-ConfiguringAxis">Configuring Axis</a></li><li><a shape="rect" href="#BookInOnePage-RunningtheExample">Running the Example</a></li></ul> @@ -14687,7 +14687,7 @@ from("seda:b").delay(1000).to( from("direct:start").loadBalance(). roundRobin().to("mock:x", "mock:y", "mock:z"); ]]></script> -</div></div><p><strong>Using the Spring configuration</strong></p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div><strong>Using the Spring configuration</strong><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring"> <route> <from uri="direct:start"/> @@ -14700,7 +14700,7 @@ roundRobin().to("mock:x", &quo </route> </camelContext> ]]></script> -</div></div><p>The above example loads balance requests from <strong>direct:start</strong> to one of the available <strong>mock endpoint</strong> instances, in this case using a round robin policy.<br clear="none"> For further examples of this pattern look at <a shape="rect" class="external-link" href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoundRobinLoadBalanceTest.java?view=markup">this junit test case</a></p><h3 id="BookInOnePage-Failover">Failover</h3><p>The <code>failover</code> load balancer is capable of trying the next processor in case an <a shape="rect" href="exchange.html">Exchange</a> failed with an <code>exception</code> during processing.<br clear="none"> You can constrain the <code>failover</code> to activate only when one exception of a list you specify occurs. If you do not specify a list any exception will cause fail over to occur. This balancer uses the same strategy for matching exceptions as the <a shape="rec t" href="exception-clause.html">Exception Clause</a> does for the <strong>onException</strong>.</p><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Enable stream caching if using streams</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>If you use streaming then you should enable <a shape="rect" href="stream-caching.html">Stream caching</a> when using the failover load balancer. This is needed so the stream can be re-read after failing over to the next processor.</p></div></div><p>Failover offers the following options:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Option</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>inheritErrorHandler</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>true</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.3:</strong> Whether or not the <a shape="rect" href="error-handler.html">Error Handler</a> configured on the route should be used. Disable this if you want failover to transfer immediately to the next endpoint. On the other hand, if you have this option enabled, then Camel will first let the <a shape="rect" href="error-handler.html">Error Handler</a> try to process the message. The <a shape="rect" href="error-handler.html">Error Handler</a> may have been configured to redeliver and use delays between attempts. If you have enabled a number of redeliveries then Camel will try to redeliver to the <strong>same</strong> endpoint, and only fail over to the next endpoint, when the <a s hape="rect" href="error-handler.html">Error Handler</a> is exhausted.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>maximumFailoverAttempts</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>int</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>-1</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.3:</strong> A value to indicate after X failover attempts we should exhaust (give up). Use -1 to indicate never give up and continuously try to failover. Use 0 to never failover. And use e.g. 3 to failover at most 3 times before giving up. This option can be used whether or not roundRobin is enabled or not.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>roundRobin</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>false</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.3:</strong> Whether or not the < code>failover</code> load balancer should operate in round robin mode or not. If not, then it will <strong>always</strong> start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If round robin is enabled, then it keeps state and will continue with the next endpoint in a round robin fashion. When using round robin it will not <em>stick</em> to last known good endpoint, it will always pick the next endpoint to use.</p></td></tr></tbody></table></div><p><strong>Camel 2.2 or older behavior</strong><br clear="none"> The current implementation of failover load balancer uses simple logic which <strong>always</strong> tries the first endpoint, and in case of an exception being thrown it tries the next in the list, and so forth. It has no state, and the next message will thus <strong>always</strong> start with the first endpoint.</p><p><strong>Camel 2.3 onwards behavior</strong><br clear="none"> The <code>failover</code> load balancer now supports round robin mode, which allows you to failover in a round robin fashion. See the <code>roundRobin</code> option.</p><div class="confluence-information-macro confluence-information-macro-note"><p class="title">Redelivery must be enabled</p><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>In Camel 2.2 or older the failover load balancer requires you have enabled Camel <a shape="rect" href="error-handler.html">Error Handler</a> to use redelivery. In Camel 2.3 onwards this is not required as such, as you can mix and match. See the <code>inheritErrorHandler</code> option.</p></div></div><p>Here is a sample to failover only if a <code>IOException</code> related exception was thrown:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div><p>The above example loads balance requests from <strong>direct:start</strong> to one of the available <strong>mock endpoint</strong> instances, in this case using a round robin policy.<br clear="none"> For further examples of this pattern look at <a shape="rect" class="external-link" href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/RoundRobinLoadBalanceTest.java?view=markup">this junit test case</a></p><h3 id="BookInOnePage-Failover">Failover</h3><p>The <code>failover</code> load balancer is capable of trying the next processor in case an <a shape="rect" href="exchange.html">Exchange</a> failed with an <code>exception</code> during processing.<br clear="none"> You can constrain the <code>failover</code> to activate only when one exception of a list you specify occurs. If you do not specify a list any exception will cause fail over to occur. This balancer uses the same strategy for matching exceptions as the <a shape="rec t" href="exception-clause.html">Exception Clause</a> does for the <strong>onException</strong>.</p><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Enable stream caching if using streams</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>If you use streaming then you should enable <a shape="rect" href="stream-caching.html">Stream caching</a> when using the failover load balancer. This is needed so the stream can be re-read after failing over to the next processor.</p></div></div><p>Failover offers the following options:</p><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Option</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>inheritErrorHandler</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>true</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.3:</strong> Whether or not the <a shape="rect" href="error-handler.html">Error Handler</a> configured on the route should be used. Disable this if you want failover to transfer immediately to the next endpoint. On the other hand, if you have this option enabled, then Camel will first let the <a shape="rect" href="error-handler.html">Error Handler</a> try to process the message. The <a shape="rect" href="error-handler.html">Error Handler</a> may have been configured to redeliver and use delays between attempts. If you have enabled a number of redeliveries then Camel will try to redeliver to the <strong>same</strong> endpoint, and only fail over to the next endpoint, when the <a s hape="rect" href="error-handler.html">Error Handler</a> is exhausted.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>maximumFailoverAttempts</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>int</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>-1</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.3:</strong> A value to indicate after X failover attempts we should exhaust (give up). Use -1 to indicate never give up and continuously try to failover. Use 0 to never failover. And use e.g. 3 to failover at most 3 times before giving up. This option can be used whether or not roundRobin is enabled or not.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p>roundRobin</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>false</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.3:</strong> Whether or not the < code>failover</code> load balancer should operate in round robin mode or not. If not, then it will <strong>always</strong> start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If round robin is enabled, then it keeps state and will continue with the next endpoint in a round robin fashion. When using round robin it will not <em>stick</em> to last known good endpoint, it will always pick the next endpoint to use. <span>You can also enable sticky mode together with round robin, if so then it will pick the last known good endpoint </span><span>to use when starting the load balancing (instead of using the next when starting).</span></p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd">sticky</td><td colspan="1" rowspan="1" class="confluenceTd">boolean</td><td colspan="1" rowspan="1" class="confluenceTd">false</td><td colspan="1" rowspan="1" class="confluenceTd"><strong>Camel 2.16:</strong> Whether or n ot the failover load balancer should operate in sticky mode or not. If not, then it will always start from the first endpoint when a new message is to be processed. In other words it restart from the top for every message. If sticky is enabled, then it keeps state and will continue with the last known good endpoint. You can also enable sticky mode together with round robin, if so then it will pick the last known good endpoint to use when starting the load balancing (instead of using the next when starting).</td></tr></tbody></table></div><p><strong>Camel 2.2 or older behavior</strong><br clear="none"> The current implementation of failover load balancer uses simple logic which <strong>always</strong> tries the first endpoint, and in case of an exception being thrown it tries the next in the list, and so forth. It has no state, and the next message will thus <strong>always</strong> start with the first endpoint.</p><p><strong>Camel 2.3 onwards behavior</strong><br clear="none"> The < code>failover</code> load balancer now supports round robin mode, which allows you to failover in a round robin fashion. See the <code>roundRobin</code> option.</p><div class="confluence-information-macro confluence-information-macro-note"><p class="title">Redelivery must be enabled</p><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>In Camel 2.2 or older the failover load balancer requires you have enabled Camel <a shape="rect" href="error-handler.html">Error Handler</a> to use redelivery. In Camel 2.3 onwards this is not required as such, as you can mix and match. See the <code>inheritErrorHandler</code> option.</p></div></div><p>Here is a sample to failover only if a <code>IOException</code> related exception was thrown:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ from("direct:start") // here we will load balance if IOException was thrown @@ -14710,7 +14710,7 @@ from("direct:start") .loadBalance().failover(IOException.class) .to("direct:x", "direct:y", "direct:z"); ]]></script> -</div></div><p>You can specify multiple exceptions to failover as the option is varargs, for instance:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>You can specify multiple exceptions to failover as the option is varargs, for instance:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[// enable redelivery so failover can react errorHandler(defaultErrorHandler().maximumRedeliveries(5)); @@ -14741,7 +14741,7 @@ from("direct:start") .loadBalance().failover(-1, false, true). to("direct:bad", "direct:bad2", "direct:good", "direct:good2"); ]]></script> -</div></div><p>And the same example using Spring XML:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>And the same example using Spring XML:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ <route> <from uri="direct:start"/> @@ -14813,7 +14813,7 @@ from("direct:start") .loadBalance(new MyLoadBalancer()) .to("mock:x", "mock:y", "mock:z"); ]]></script> -</div></div><p>And the same example using XML DSL:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>And the same example using XML DSL:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ <!-- this is the implementation of our custom load balancer --> <bean id="myBalancer" class="org.apache.camel.processor.CustomLoadBalanceTest$MyLoadBalancer"/> @@ -14832,7 +14832,7 @@ from("direct:start") </route> </camelContext> ]]></script> -</div></div><p>Notice in the XML DSL above we use <custom> which is only available in <strong>Camel 2.8</strong> onwards. In older releases you would have to do as follows instead:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>Notice in the XML DSL above we use <custom> which is only available in <strong>Camel 2.8</strong> onwards. In older releases you would have to do as follows instead:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ <loadBalance ref="myBalancer"> <!-- these are the endpoints to balancer --> <to uri="mock:x"/> @@ -17678,11 +17678,11 @@ template.send("direct:alias-verify& ]]></script> </div></div><p></p><h3 id="BookInOnePage-SeeAlso.28">See Also</h3> <ul><li><a shape="rect" href="configuring-camel.html">Configuring Camel</a></li><li><a shape="rect" href="component.html">Component</a></li><li><a shape="rect" href="endpoint.html">Endpoint</a></li><li><a shape="rect" href="getting-started.html">Getting Started</a></li></ul><ul><li><a shape="rect" href="crypto.html">Crypto</a> Crypto is also available as a <a shape="rect" href="data-format.html">Data Format</a></li></ul> <h2 id="BookInOnePage-CXFComponent">CXF Component</h2><div class="confluence-information-macro confluence-information-macro-note"><span class="aui-icon aui-icon-small aui-iconfont-warning confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>When using CXF as a consumer, the <a shape="rect" href="cxf-bean-component.html">CXF Bean Component</a> allows you to factor out how message payloads are received from their processing as a RESTful or SOAP web service. This has the potential of using a multitude of transports to consume web services. The bean component's configuration is also simpler and provides the fastest method to implement web services using Camel and CXF.</p></div></div><div class="confluence-information-macro confluence-information-macro-tip"><span class="aui-icon aui-icon-small aui-iconfont-approve confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>When using CXF in streaming modes (see DataFormat option), then also read about <a shape="rect" href="stream-caching.html">Stream caching</a>.</p></div></div><p>The <strong>cxf:</strong> component provides integration with <a shape="rect" href="http://cxf.apache.org">Apache CXF</a> for connecting to JAX-WS services hosted in CXF.</p><p><style type="text/css">/*<![CDATA[*/ -div.rbtoc1436627900281 {padding: 0px;} -div.rbtoc1436627900281 ul {list-style: disc;margin-left: 0px;} -div.rbtoc1436627900281 li {margin-left: 0px;padding-left: 0px;} +div.rbtoc1436692705893 {padding: 0px;} +div.rbtoc1436692705893 ul {list-style: disc;margin-left: 0px;} +div.rbtoc1436692705893 li {margin-left: 0px;padding-left: 0px;} -/*]]>*/</style></p><div class="toc-macro rbtoc1436627900281"> +/*]]>*/</style></p><div class="toc-macro rbtoc1436692705893"> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-CXFComponent">CXF Component</a> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-URIformat">URI format</a></li><li><a shape="rect" href="#BookInOnePage-Options">Options</a> <ul class="toc-indentation"><li><a shape="rect" href="#BookInOnePage-Thedescriptionsofthedataformats">The descriptions of the dataformats</a> @@ -26961,7 +26961,7 @@ protected RouteBuilder createRouteBuilde ]]></script> </div></div><p>When using named parameters, Camel will lookup the names from, in the given precedence:<br clear="none"> 1. from message body if its a <code>java.util.Map</code><br clear="none"> 2. from message headers</p><p>If a named parameter cannot be resolved, then an exception is thrown.</p><p>From Camel 2.14 onward you can use Simple expressions as parameters as shown:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[sql:select * from table where id=:#${property.myId} order by name[?options]]]></script> -</div></div><p>Notice that the standard <code>?</code> symbol that denotes the parameters to an SQL query is substituted with the <code>#</code> symbol, because the <code>?</code> symbol is used to specify options for the endpoint. The <code>?</code> symbol replacement can be configured on endpoint basis.</p><p>You can append query options to the URI in the following format, <code>?option=value&option=value&...</code></p><h3 id="BookInOnePage-Options.75">Options</h3><div class="confluenceTableSmall"><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Option</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>batch</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code> boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.7.5, 2.8.4 and 2.9:</strong> Execute SQL batch update statements. See notes below on how the treatment of the inbound message body changes if this is set to <code>true</code>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>dataSourceRef</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Deprecated and will be removed in Camel 3.0:</strong> Reference to a <code>DataSource</code> to look up in the registry. Use <code>dataSource=#theName</code> instead.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>dataSource</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Str ing</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> Reference to a <code>DataSource</code> to look up in the registry.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>placeholder</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>#</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.4:</strong> Specifies a character that will be replaced to <code>?</code> in SQL query. Notice, that it is simple <code>String.replaceAll()</code> operation and no SQL parsing is involved (quoted strings will also change). This replacement is <strong>only</strong> happening if the endpoint is created using the <code>SqlComponent</code>. If you manually create the endpoint, then use the expected <code>?</code> sign instead.< /p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>template.<xxx></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Sets additional options on the Spring <code>JdbcTemplate</code> that is used behind the scenes to execute the queries. For instance, <code>template.maxRows=10</code>. For detailed documentation, see the <a shape="rect" class="external-link" href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html" rel="nofollow">JdbcTemplate javadoc</a> documentation.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>allowNamedParameters</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan= "1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> Whether to allow using named parameters in the queries.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>processingStrategy</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Allows to plugin to use a custom <code>org.apache.camel.component.sql.SqlProcessingStrategy</code> to execute queries when the consumer has processed the rows/batch.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>prepareStatementStrategy</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> Allows to plugin to use a custom <code>org.apache.camel.component.sql.SqlPrepareStatementStrategy</code> to control preparation of the query and prepared statement.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.delay</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>500</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Delay in milliseconds between each poll.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.initialDelay</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>1000</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Milliseconds before polling starts.</p></td>< /tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.useFixedDelay</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Set to <code>true</code> to use fixed delay between polls, otherwise fixed rate is used. See <a shape="rect" class="external-link" href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html" rel="nofollow">ScheduledExecutorService</a> in JDK for details.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>maxMessagesPerPoll</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>0</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Ca mel 2.11:</strong> <strong>SQL consumer only:</strong> An integer value to define the maximum number of messages to gather per poll. By default, no maximum is set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.useIterator</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> If <code>true</code> each row returned when polling will be processed individually. If <code>false</code> the entire <code>java.util.List</code> of data is set as the IN body.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.routeEmptyResultSet</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Whether to route a single empty <a shape="rect" href="exchange.html">Exchange</a> if there was no data to poll.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.onConsume</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> After processing each row then this query can be executed, if the <a shape="rect" href="exchange.html">Exchange</a> was processed successfully, for example to mark the row as processed. The query can have parameter.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.onConsumeFailed</code></p></td><td colspan="1" rowspan="1" class="confluenc eTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> After processing each row then this query can be executed, if the <a shape="rect" href="exchange.html">Exchange</a> failed, for example to mark the row as failed. The query can have parameter.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.onConsumeBatchComplete</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> After processing the entire batch, this query can be executed to bulk update rows etc. The query cannot have parameters.</p></td></tr><tr><td colspan="1" rowspan="1" class="con fluenceTd"><p><code>consumer.expectedUpdateCount</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>-1</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> If using <code>consumer.onConsume</code> then this option can be used to set an expected number of rows being updated. Typically you may set this to <code>1</code> to expect one row to be updated.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.breakBatchOnConsumeFail</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> If using <code>consumer.onConsume</code> and it fails, then this o ption controls whether to break out of the batch or continue processing the next row from the batch.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>alwaysPopulateStatement</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL producer only:</strong> If enabled then the <code>populateStatement</code> method from <code>org.apache.camel.component.sql.SqlPrepareStatementStrategy</code> is always invoked, also if there is no expected parameters to be prepared. When this is <code>false</code> then the <code>populateStatement</code> is only invoked if there is 1 or more expected parameters to be set; for example this avoids reading the message body/headers for SQL queries with no parameters.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenc eTd"><p><code>separator</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>char</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>,</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11.1:</strong> The separator to use when parameter values is taken from message body (if the body is a String type), to be inserted at # placeholders. Notice if you use named parameters, then a <code>Map</code> type is used instead.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>outputType</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>SelectList</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.0:</strong> Make the output of consumer or producer to <code>SelectList</code> as List of Map, or <code>SelectOne</code> as single Java object in the following way:<br clear="none"> a) If the query has only single column, then that JDBC Column object is returned. (such as <code>SELECT COUNT( * ) FROM PROJECT</code> will return a Long object.<br clear="none"> b) If the query has more than one column, then it will return a Map of that result.<br clear="none"> c) If the <code>outputClass</code> is set, then it will convert the query result into an Java bean object by calling all the setters that match the column names. It will assume your class has a default constructor to create instance with.<br clear="none"> d) If the query resulted in more than one rows, it throws an non-unique result exception.</p><p>From <strong>Camel 2.14.1</strong> onwards the SelectList also supports mapping each row to a Java object as the SelectOne does <span>(only step c)</span>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>outputClass</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan=" 1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.0:</strong> Specify the full package and class name to use as conversion when <code>outputType=SelectOne</code>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>outputHeader</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><code>String</code></td><td colspan="1" rowspan="1" class="confluenceTd"><code>null</code></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.15:</strong> To store the result as a header instead of the message body. This allows to preserve the existing message body as-is.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>parametersCount</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>0</code></p></td><td colspan="1" rowspan="1" class="confluenc eTd"><p><strong>Camel 2.11.2/2.12.0</strong> If set greater than zero, then Camel will use this count value of parameters to replace instead of querying via JDBC metadata API. This is useful if the JDBC vendor could not return correct parameters count, then user may override instead.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>noop</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.0</strong> If set, will ignore the results of the SQL query and use the existing IN message as the OUT message for the continuation of processing</p></td></tr></tbody></table></div></div><h3 id="BookInOnePage-Treatmentofthemessagebody">Treatment of the message body</h3><p>The SQL component tries to convert the message body to an object of <code>java.util.Iterator</code> type and then uses this iterator to fill the query parameters (where each query parameter is represented by a <code>#</code> symbol (or configured placeholder) in the endpoint URI). If the message body is not an array or collection, the conversion results in an iterator that iterates over only one object, which is the body itself.</p><p>For example, if the message body is an instance of <code>java.util.List</code>, the first item in the list is substituted into the first occurrence of <code>#</code> in the SQL query, the second item in the list is substituted into the second occurrence of <code>#</code>, and so on.</p><p>If <code>batch</code> is set to <code>true</code>, then the interpretation of the inbound message body changes slightly – instead of an iterator of parameters, the component expects an iterator that contains the parameter iterators; the size of the outer iterator determines the batch size.</p><h3 id="BookInOnePage-Resultofthequery">Result of the query</h3><p>For <code>sele ct</code> operations, the result is an instance of <code>List<Map<String, Object>></code> type, as returned by the <a shape="rect" class="external-link" href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html#queryForList(java.lang.String,%20java.lang.Object%91%93)" rel="nofollow">JdbcTemplate.queryForList()</a> method. For <code>update</code> operations, the result is the number of updated rows, returned as an <code>Integer</code>.</p><p>By default, the result is placed in the message body.  If the outputHeader parameter is set, the result is placed in the header.  This is an alternative to using a full message enrichment pattern to add headers, it provides a concise syntax for querying a sequence or some other small value into a header.  It is convenient to use outputHeader and outputType together:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div><p>Notice that the standard <code>?</code> symbol that denotes the parameters to an SQL query is substituted with the <code>#</code> symbol, because the <code>?</code> symbol is used to specify options for the endpoint. The <code>?</code> symbol replacement can be configured on endpoint basis.</p><p>You can append query options to the URI in the following format, <code>?option=value&option=value&...</code></p><h3 id="BookInOnePage-Options.75">Options</h3><div class="confluenceTableSmall"><div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Option</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Type</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Default</p></th><th colspan="1" rowspan="1" class="confluenceTh"><p>Description</p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>batch</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code> boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.7.5, 2.8.4 and 2.9:</strong> Execute SQL batch update statements. See notes below on how the treatment of the inbound message body changes if this is set to <code>true</code>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>dataSourceRef</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Deprecated and will be removed in Camel 3.0:</strong> Reference to a <code>DataSource</code> to look up in the registry. Use <code>dataSource=#theName</code> instead.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>dataSource</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>Str ing</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> Reference to a <code>DataSource</code> to look up in the registry.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>placeholder</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>#</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.4:</strong> Specifies a character that will be replaced to <code>?</code> in SQL query. Notice, that it is simple <code>String.replaceAll()</code> operation and no SQL parsing is involved (quoted strings will also change). This replacement is <strong>only</strong> happening if the endpoint is created using the <code>SqlComponent</code>. If you manually create the endpoint, then use the expected <code>?</code> sign instead.< /p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>template.<xxx></code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>Sets additional options on the Spring <code>JdbcTemplate</code> that is used behind the scenes to execute the queries. For instance, <code>template.maxRows=10</code>. For detailed documentation, see the <a shape="rect" class="external-link" href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html" rel="nofollow">JdbcTemplate javadoc</a> documentation.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>allowNamedParameters</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan= "1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> Whether to allow using named parameters in the queries.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>processingStrategy</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Allows to plugin to use a custom <code>org.apache.camel.component.sql.SqlProcessingStrategy</code> to execute queries when the consumer has processed the rows/batch.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>prepareStatementStrategy</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> Allows to plugin to use a custom <code>org.apache.camel.component.sql.SqlPrepareStatementStrategy</code> to control preparation of the query and prepared statement.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.delay</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>500</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Delay in milliseconds between each poll.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.initialDelay</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>long</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>1000</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Milliseconds before polling starts.</p></td>< /tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.useFixedDelay</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Set to <code>true</code> to use fixed delay between polls, otherwise fixed rate is used. See <a shape="rect" class="external-link" href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/ScheduledExecutorService.html" rel="nofollow">ScheduledExecutorService</a> in JDK for details.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>maxMessagesPerPoll</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>0</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Ca mel 2.11:</strong> <strong>SQL consumer only:</strong> An integer value to define the maximum number of messages to gather per poll. By default, no maximum is set.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.useIterator</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>true</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> If <code>true</code> each row returned when polling will be processed individually. If <code>false</code> the entire <code>java.util.List</code> of data is set as the IN body.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.routeEmptyResultSet</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> Whether to route a single empty <a shape="rect" href="exchange.html">Exchange</a> if there was no data to poll.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.onConsume</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> After processing each row then this query can be executed, if the <a shape="rect" href="exchange.html">Exchange</a> was processed successfully, for example to mark the row as processed. The query can have parameter.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.onConsumeFailed</code></p></td><td colspan="1" rowspan="1" class="confluenc eTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> After processing each row then this query can be executed, if the <a shape="rect" href="exchange.html">Exchange</a> failed, for example to mark the row as failed. The query can have parameter.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.onConsumeBatchComplete</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> After processing the entire batch, this query can be executed to bulk update rows etc. The query cannot have parameters.</p></td></tr><tr><td colspan="1" rowspan="1" class="con fluenceTd"><p><code>consumer.expectedUpdateCount</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>-1</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> If using <code>consumer.onConsume</code> then this option can be used to set an expected number of rows being updated. Typically you may set this to <code>1</code> to expect one row to be updated.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>consumer.breakBatchOnConsumeFail</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL consumer only:</strong> If using <code>consumer.onConsume</code> and it fails, then this o ption controls whether to break out of the batch or continue processing the next row from the batch.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>alwaysPopulateStatement</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11:</strong> <strong>SQL producer only:</strong> If enabled then the <code>populateStatement</code> method from <code>org.apache.camel.component.sql.SqlPrepareStatementStrategy</code> is always invoked, also if there is no expected parameters to be prepared. When this is <code>false</code> then the <code>populateStatement</code> is only invoked if there is 1 or more expected parameters to be set; for example this avoids reading the message body/headers for SQL queries with no parameters.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenc eTd"><p><code>separator</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>char</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>,</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.11.1:</strong> The separator to use when parameter values is taken from message body (if the body is a String type), to be inserted at # placeholders. Notice if you use named parameters, then a <code>Map</code> type is used instead.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>outputType</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>SelectList</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.0:</strong> Make the output of consumer or producer to <code>SelectList</code> as List of Map, or <code>SelectOne</code> as single Java object in the following way:<br clear="none"> a) If the query has only single column, then that JDBC Column object is returned. (such as <code>SELECT COUNT( * ) FROM PROJECT</code> will return a Long object.<br clear="none"> b) If the query has more than one column, then it will return a Map of that result.<br clear="none"> c) If the <code>outputClass</code> is set, then it will convert the query result into an Java bean object by calling all the setters that match the column names. It will assume your class has a default constructor to create instance with.<br clear="none"> d) If the query resulted in more than one rows, it throws an non-unique result exception.</p><p>From <strong>Camel 2.14.1</strong> onwards the SelectList also supports mapping each row to a Java object as the SelectOne does <span>(only step c)</span>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>outputClass</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>String</code></p></td><td colspan=" 1" rowspan="1" class="confluenceTd"><p><code>null</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.0:</strong> Specify the full package and class name to use as conversion when <code>outputType=SelectOne</code>.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>outputHeader</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><code>String</code></td><td colspan="1" rowspan="1" class="confluenceTd"><code>null</code></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.15:</strong> To store the result as a header instead of the message body. This allows to preserve the existing message body as-is.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>parametersCount</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>int</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>0</code></p></td><td colspan="1" rowspan="1" class="confluenc eTd"><p><strong>Camel 2.11.2/2.12.0</strong> If set greater than zero, then Camel will use this count value of parameters to replace instead of querying via JDBC metadata API. This is useful if the JDBC vendor could not return correct parameters count, then user may override instead.</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p><code>noop</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>boolean</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><code>false</code></p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><strong>Camel 2.12.0</strong> If set, will ignore the results of the SQL query and use the existing IN message as the OUT message for the continuation of processing</p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><code>useMessageBodyForSql</code></td><td colspan="1" rowspan="1" class="confluenceTd"><code>boolean</code></td><td colspan="1" rowspan="1" class="confluenceTd"><code>false</ code></td><td colspan="1" rowspan="1" class="confluenceTd"><strong>Camel 2.16:</strong> Whether to use the message body as the SQL and then headers for parameters. If this option is enabled then the SQL in the uri is not used. The SQL parameters must then be provided in a header with the key <code>CamelSqlParameters</code>. This option is only for the producer.</td></tr></tbody></table></div></div><h3 id="BookInOnePage-Treatmentofthemessagebody">Treatment of the message body</h3><p>The SQL component tries to convert the message body to an object of <code>java.util.Iterator</code> type and then uses this iterator to fill the query parameters (where each query parameter is represented by a <code>#</code> symbol (or configured placeholder) in the endpoint URI). If the message body is not an array or collection, the conversion results in an iterator that iterates over only one object, which is the body itself.</p><p>For example, if the message body is an instance of <code>java.util.List </code>, the first item in the list is substituted into the first occurrence of <code>#</code> in the SQL query, the second item in the list is substituted into the second occurrence of <code>#</code>, and so on.</p><p>If <code>batch</code> is set to <code>true</code>, then the interpretation of the inbound message body changes slightly – instead of an iterator of parameters, the component expects an iterator that contains the parameter iterators; the size of the outer iterator determines the batch size.</p><p>From Camel 2.16 onwards you can use the option <span>useMessageBodyForSql that allows to use the message body as the SQL statement, and then the SQL parameters must be provided in a header with the key SqlConstants.SQL_PARAMETERS. This allows the SQL component to work more dynamic as the SQL query is from the message body.</span></p><h3 id="BookInOnePage-Resultofthequery">Result of the query</h3><p>For <code>select</code> operations, the result is an instance o f <code>List<Map<String, Object>></code> type, as returned by the <a shape="rect" class="external-link" href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/jdbc/core/JdbcTemplate.html#queryForList(java.lang.String,%20java.lang.Object%91%93)" rel="nofollow">JdbcTemplate.queryForList()</a> method. For <code>update</code> operations, the result is the number of updated rows, returned as an <code>Integer</code>.</p><p>By default, the result is placed in the message body.  If the outputHeader parameter is set, the result is placed in the header.  This is an alternative to using a full message enrichment pattern to add headers, it provides a concise syntax for querying a sequence or some other small value into a header.  It is convenient to use outputHeader and outputType together:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[from("jms:order.inbox") .to("sql:select order_seq.nextval from dual?outputHeader=OrderId&outputType=SelectOne") .to("jms:order.booking");]]></script> @@ -26974,20 +26974,20 @@ protected RouteBuilder createRouteBuilde db = new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.DERBY).addScript("sql/createAndPopulateDatabase.sql").build(); ]]></script> -</div></div><p>The SQL script <code>createAndPopulateDatabase.sql</code> we execute looks like as described below:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>The SQL script <code>createAndPopulateDatabase.sql</code> we execute looks like as described below:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: sql; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ create table projects (id integer primary key, project varchar(10), license varchar(5)); insert into projects values (1, 'Camel', 'ASF'); insert into projects values (2, 'AMQ', 'ASF'); insert into projects values (3, 'Linux', 'XXX'); ]]></script> -</div></div><p>Then we configure our route and our <code>sql</code> component. Notice that we use a <code>direct</code> endpoint in front of the <code>sql</code> endpoint. This allows us to send an exchange to the <code>direct</code> endpoint with the URI, <code>direct:simple</code>, which is much easier for the client to use than the long <code>sql:</code> URI. Note that the <code>DataSource</code> is looked up up in the registry, so we can use standard Spring XML to configure our <code>DataSource</code>.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>Then we configure our route and our <code>sql</code> component. Notice that we use a <code>direct</code> endpoint in front of the <code>sql</code> endpoint. This allows us to send an exchange to the <code>direct</code> endpoint with the URI, <code>direct:simple</code>, which is much easier for the client to use than the long <code>sql:</code> URI. Note that the <code>DataSource</code> is looked up up in the registry, so we can use standard Spring XML to configure our <code>DataSource</code>.<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ from("direct:simple") .to("sql:select * from projects where license = # order by id?dataSourceRef=jdbc/myDataSource") .to("mock:result"); ]]></script> -</div></div><p>And then we fire the message into the <code>direct</code> endpoint that will route it to our <code>sql</code> component that queries the database.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>And then we fire the message into the <code>direct</code> endpoint that will route it to our <code>sql</code> component that queries the database.<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: java; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ MockEndpoint mock = getMockEndpoint("mock:result"); mock.expectedMessageCount(1); @@ -27009,7 +27009,7 @@ Map<?, ?> row = assertIsInstanceOf // and we should be able the get the project from the map that should be Linux assertEquals("Linux", row.get("PROJECT")); ]]></script> -</div></div><p>We could configure the <code>DataSource</code> in Spring XML as follows:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>We could configure the <code>DataSource</code> in Spring XML as follows:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ <jee:jndi-lookup id="myDS" jndi-name="jdbc/myDataSource"/> ]]></script> </div></div><h4 id="BookInOnePage-Usingnamedparameters.1">Using named parameters</h4><p><strong>Available as of Camel 2.11</strong></p><p>In the given route below, we want to get all the projects from the projects table. Notice the SQL query has 2 named parameters, :#lic and :#min.<br clear="none"> Camel will then lookup for these parameters from the message body or message headers. Notice in the example above we set two headers with constant value<br clear="none"> for the named parameters:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> @@ -27044,7 +27044,7 @@ assertEquals("Linux", row.get( <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ <jdbc:embedded-database id="dataSource" type="DERBY" /> ]]></script> -</div></div><p>And finally we can create our JDBC idempotent repository in the spring XML file as well:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> +</div></div>And finally we can create our JDBC idempotent repository in the spring XML file as well:<div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl"> <script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ <bean id="messageIdRepository" class="org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository"> <constructor-arg ref="dataSource" />