You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by bu...@apache.org on 2016/05/19 20:22:57 UTC

svn commit: r988663 [3/3] - in /websites/production/camel/content: ./ cache/

Modified: websites/production/camel/content/siteindex.html
==============================================================================
--- websites/production/camel/content/siteindex.html (original)
+++ websites/production/camel/content/siteindex.html Thu May 19 20:22:56 2016
@@ -91,7 +91,7 @@
 
 <p>
 <table class="grid" width="99%" cellspacing="0"><tr><td colspan="2" rowspan="1">
-         <table width="100%"><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-0-9">0-9</a> ... 0</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-A">A</a> ... 39</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-B">B</a> ... 43</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-C">C</a> ... 186</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-D">D</a> ... 33</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-E">E</a> ... 32</td></tr><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-F">F</a> ... 15</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-G">G</a> ... 33</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-H">H</a> ... 88</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-I">I</a> ... 19</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-J">J</a> ... 32</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-K">K</a> ... 6</td></tr><tr><td colspan="1" row
 span="1"><a shape="rect" href="#index-L">L</a> ... 19</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-M">M</a> ... 36</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-N">N</a> ... 12</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-O">O</a> ... 7</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-P">P</a> ... 27</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-Q">Q</a> ... 5</td></tr><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-R">R</a> ... 32</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-S">S</a> ... 89</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-T">T</a> ... 42</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-U">U</a> ... 19</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-V">V</a> ... 8</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-W">W</a> ... 30</td></tr><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-X">X</a> ... 14</td>
 <td colspan="1" rowspan="1"><a shape="rect" href="#index-Y">Y</a> ... 2</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-Z">Z</a> ... 4</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-%21@%23%24">!@#$</a> ... 0</td><td colspan="1" rowspan="1">&#160;</td><td colspan="1" rowspan="1">&#160;</td></tr></table>
+         <table width="100%"><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-0-9">0-9</a> ... 0</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-A">A</a> ... 39</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-B">B</a> ... 43</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-C">C</a> ... 186</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-D">D</a> ... 33</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-E">E</a> ... 33</td></tr><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-F">F</a> ... 15</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-G">G</a> ... 33</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-H">H</a> ... 88</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-I">I</a> ... 19</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-J">J</a> ... 32</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-K">K</a> ... 6</td></tr><tr><td colspan="1" row
 span="1"><a shape="rect" href="#index-L">L</a> ... 19</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-M">M</a> ... 36</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-N">N</a> ... 12</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-O">O</a> ... 7</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-P">P</a> ... 27</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-Q">Q</a> ... 5</td></tr><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-R">R</a> ... 32</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-S">S</a> ... 89</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-T">T</a> ... 42</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-U">U</a> ... 19</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-V">V</a> ... 8</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-W">W</a> ... 30</td></tr><tr><td colspan="1" rowspan="1"><a shape="rect" href="#index-X">X</a> ... 14</td>
 <td colspan="1" rowspan="1"><a shape="rect" href="#index-Y">Y</a> ... 2</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-Z">Z</a> ... 4</td><td colspan="1" rowspan="1"><a shape="rect" href="#index-%21@%23%24">!@#$</a> ... 0</td><td colspan="1" rowspan="1">&#160;</td><td colspan="1" rowspan="1">&#160;</td></tr></table>
         </td></tr><tr valign="top"><td colspan="1" rowspan="1"><h4 style="margin-top: 0px"><a shape="rect" name="index-0-9"></a>0-9</h4>
         </td><td colspan="1" rowspan="1"><h4 style="margin-top: 0px"><a shape="rect" name="index-A"></a>A</h4>
                              <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>                 <a shape="rect" href="acknowledgment.html">Acknowledgment</a>
@@ -274,7 +274,7 @@
              <div class="smalltext" style="margin: 0 0 0 36px">Bindy The goal of this component is to allow the parsing/binding of non-structured data (or to be more precise non-XML data) to/from Java Beans that have binding mappings defined with annotations. Using Bindy, you can bind data from sources such as : CSV </div>
                              <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>                 <a shape="rect" href="blueprint-testing.html">Blueprint Testing</a>
         <br clear="none">
-             <div class="smalltext" style="margin: 0 0 0 36px">Blueprint Testing Available as of Camel 2.10 camel-test-blueprint does only support testing one CamelContext. So if you have 2 or more CamelContexts in your blueprint XML files, then first found CamelContext is used during testing. Testing is a crucial pa</div>
+             <div class="smalltext" style="margin: 0 0 0 36px">Blueprint Testing Available as of Camel 2.10 camel-test-blueprint does only support testing one CamelContext. So if you have two or more CamelContexts in your blueprint XML files, then only the CamelContext first found is used during testing. Testing is a</div>
                              <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>                 <a shape="rect" href="book.html">Book</a>
         <br clear="none">
              <div class="smalltext" style="margin: 0 0 0 36px">Book These pages are used to create the DocBook for the User Guide Introduction Getting Started Architecture Enterprise Integration Patterns Cook Book Tutorials Languages Appendix DataFormat Appendix Pattern Appendix Component Appendix</div>
@@ -1004,6 +1004,9 @@
                              <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>                 <a shape="rect" href="edi.html">EDI</a>
         <br clear="none">
              <div class="smalltext" style="margin: 0 0 0 36px">EDI DataFormat We encourage end users to look at the Smooks http://milyn.codehaus.org/Home which supports EDI and Camel natively.</div>
+                             <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>                 <a shape="rect" href="ehcache.html">Ehcache</a>
+        <br clear="none">
+             <div class="smalltext" style="margin: 0 0 0 36px">Ehcache Component Available as of Camel 2.18.x The ehcache component enables you to perform caching operations using Ehcache 3 as the Cache Implementation. This component supports producer and event based consumer endpoints. The Cache consumer is an event</div>
                              <span class="icon aui-icon aui-icon-small aui-iconfont-page-default" title="Page">Page:</span>                 <a shape="rect" href="eip.html">EIP</a>
         <br clear="none">
              <div class="smalltext" style="margin: 0 0 0 36px">Enterprise Integration Patterns</div>

Modified: websites/production/camel/content/sql-component.html
==============================================================================
--- websites/production/camel/content/sql-component.html (original)
+++ websites/production/camel/content/sql-component.html Thu May 19 20:22:56 2016
@@ -222,7 +222,7 @@ template.requestBodyAndHeader(&quot;dire
 <script class="brush: sql; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[ ]]></script>
 </div></div><p>CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100) )</p><p>&#160;</p><p>In <strong>Camel 2.8</strong>, we added the createdAt column:</p><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[ ]]></script>
-</div></div><p>CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP )</p><p>&#160;</p><p>&#160;</p><div class="confluence-information-macro confluence-information-macro-warning"><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body">&#160;</div></div><p class="wysiwyg-macro-body">The SQL Server&#160;<strong>TIMESTAMP</strong> type is a fixed-length binary-string type. It does not map to any of the JDBC time types: <strong>DATE</strong>, <strong>TIME</strong>, or <strong>TIMESTAMP</strong>.</p><p>&#160;</p><p>&#160;</p><p>We recommend to have a unique constraint on the columns processorName and messageId. Because the syntax for this constraint differs for database to database, we do not show it here.</p><p>Second we need to setup a <code>javax.sql.DataSource</code> in the spring XML file:&#160;{snippet:id=e1|lang=xml|url=camel/trunk/compon
 ents/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml}</p><p>&#160;</p><p>And finally we can create our JDBC idempotent repository in the spring XML file as well:&#160;{snippet:id=e2|lang=xml|url=camel/trunk/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml}</p><p>&#160;</p><p>Customize the JdbcMessageIdRepository</p><p>Starting with <strong>Camel 2.9.1</strong> you have a few options to tune the <code>org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository</code> for your needs:</p><p class="confluenceTable">&#160;</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Parameter</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Default Value</p><p>&#160;</p><p>Description</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>createTableIfNotExists</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>true</p><p>&#160;</p><p>Defines whether or not Camel should try to create the table
  if it doesn't exist.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>tableExistsString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0</p><p>&#160;</p><p>This query is used to figure out whether the table already exists or not. It must throw an exception to indicate the table doesn't exist.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>createString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>CREATE TABLE CAMEL_MESSAGEPROCESSED (processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP)</p><p>&#160;</p><p>The statement which is used to create the table.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>queryString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? AND messageId = ?</p><p>&#160;</p><p>The query which is used to figure out whether the message already exists in the reposi
 tory (the result is not equals to '0'). It takes two parameters. This first one is the processor name (<code>String</code>) and the second one is the message id (<code>String</code>).</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>insertString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>INSERT INTO CAMEL_MESSAGEPROCESSED (processorName, messageId, createdAt) VALUES (?, ?, ?)</p><p>&#160;</p><p>The statement which is used to add the entry into the table. It takes three parameter. The first one is the processor name (<code>String</code>), the second one is the message id (<code>String</code>) and the third one is the timestamp (<code>java.sql.Timestamp</code>) when this entry was added to the repository.</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>deleteString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? AND messageId = ?</p><p>&#160;</p><p>The statement which is used to delete the 
 entry from the database. It takes two parameter. This first one is the processor name (<code>String</code>) and the second one is the message id (<code>String</code>).</p><p>&#160;</p><p>A customized <code>org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository</code> could look like:&#160;{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-spring.xml}</p><p>&#160;</p><p>Using the JDBC based aggregation repository</p><p><strong>Available as of Camel 2.6</strong></p><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Using JdbcAggregationRepository in Camel 2.6</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body">&#160;</div></div><p>In Camel 2.6, the JdbcAggregationRepository is provided in the <code>camel-jdbc-aggregator</code> component. From Camel 2
 .7 onwards, the <code>JdbcAggregationRepository</code> is provided in the <code>camel-sql</code> component.</p><p>&#160;</p><p><code>JdbcAggregationRepository</code> is an <code>AggregationRepository</code> which on the fly persists the aggregated messages. This ensures that you will not loose messages, as the default aggregator will use an in memory only <code>AggregationRepository</code>.<br clear="none"> The <code>JdbcAggregationRepository</code> allows together with Camel to provide persistent support for the <a shape="rect" href="aggregator2.html">Aggregator</a>.</p><p>It has the following options:</p><p class="confluenceTable">&#160;</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Option</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Type</p><p>&#160;</p><p>Description</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>dataSource</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>DataSource</code></p><p>&#160;</p><p><strong>Mandat
 ory:</strong> The <code>javax.sql.DataSource</code> to use for accessing the database.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>repositoryName</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>String</code></p><p>&#160;</p><p><strong>Mandatory:</strong> The name of the repository.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>transactionManager</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>TransactionManager</code></p><p>&#160;</p><p><strong>Mandatory:</strong> The <code>org.springframework.transaction.PlatformTransactionManager</code> to mange transactions for the database. The TransactionManager must be able to support databases.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>lobHandler</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>LobHandler</code></p><p>&#160;</p><p>A <code>org.springframework.jdbc.support.lob.LobHandler</code> to handle Lob t
 ypes in the database. Use this option to use a vendor specific LobHandler, for example when using Oracle.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>returnOldExchange</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>boolean</p><p>&#160;</p><p>Whether the get operation should return the old existing Exchange if any existed. By default this option is <code>false</code> to optimize as we do not need the old exchange when aggregating.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>useRecovery</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>boolean</p><p>&#160;</p><p>Whether or not recovery is enabled. This option is by default <code>true</code>. When enabled the Camel <a shape="rect" href="aggregator2.html">Aggregator</a> automatic recover failed aggregated exchange and have them resubmitted.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>recoveryInterval</code></p><p>&#160;</p><p class
 ="confluenceTd">&#160;</p><p>long</p><p>&#160;</p><p>If recovery is enabled then a background task is run every x'th time to scan for failed exchanges to recover and resubmit. By default this interval is 5000 millis.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>maximumRedeliveries</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>int</p><p>&#160;</p><p>Allows you to limit the maximum number of redelivery attempts for a recovered exchange. If enabled then the Exchange will be moved to the dead letter channel if all redelivery attempts failed. By default this option is disabled. If this option is used then the <code>deadLetterUri</code> option must also be provided.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>deadLetterUri</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>String</p><p>&#160;</p><p>An endpoint uri for a <a shape="rect" href="dead-letter-channel.html">Dead Letter Channel</a> where exhausted recov
 ered Exchanges will be moved. If this option is used then the <code>maximumRedeliveries</code> option must also be provided.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>storeBodyAsText</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>boolean</p><p>&#160;</p><p><strong>Camel 2.11:</strong> Whether to store the message body as String which is human readable. By default this option is <code>false</code> storing the body in binary format.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>headersToStoreAsText</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>List&lt;String&gt;</code></p><p>&#160;</p><p><strong>Camel 2.11:</strong> Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>optimisticLocking</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><co
 de>false</code></p><p>&#160;</p><p><strong>Camel 2.12:</strong> To turn on optimistic locking, which often would be needed in clustered environments where multiple Camel applications shared the same JDBC based aggregation repository.</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>jdbcOptimisticLockingExceptionMapper</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>&#160;</p><p>&#160;</p><p><strong>Camel 2.12:</strong> Allows to plugin a custom <code>org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper</code> to map vendor specific error codes to an optimistick locking error, for Camel to perform a retry. This requires <code>optimisticLocking</code> to be enabled.</p><p>&#160;</p><p>What is preserved when persisting</p><p><code>JdbcAggregationRepository</code> will only preserve any <code>Serializable</code> compatible data types. If a data type is not such a type its dropped and a <code>WARN</code> is logged. And it only persists the 
 <code>Message</code> body and the <code>Message</code> headers. The <code>Exchange</code> properties are <strong>not</strong> persisted.</p><p>From Camel 2.11 onwards you can store the message body and select(ed) headers as String in separate columns.</p><p>Recovery</p><p>The <code>JdbcAggregationRepository</code> will by default recover any failed <a shape="rect" href="exchange.html">Exchange</a>. It does this by having a background tasks that scans for failed <a shape="rect" href="exchange.html">Exchange</a>s in the persistent store. You can use the <code>checkInterval</code> option to set how often this task runs. The recovery works as transactional which ensures that Camel will try to recover and redeliver the failed <a shape="rect" href="exchange.html">Exchange</a>. Any <a shape="rect" href="exchange.html">Exchange</a> which was found to be recovered will be restored from the persistent store and resubmitted and send out again.</p><p>The following headers is set when an <a shap
 e="rect" href="exchange.html">Exchange</a> is being recovered/redelivered:</p><p class="confluenceTable">&#160;</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Header</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Type</p><p>&#160;</p><p>Description</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>Exchange.REDELIVERED</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>Boolean</p><p>&#160;</p><p>Is set to true to indicate the <a shape="rect" href="exchange.html">Exchange</a> is being redelivered.</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>Exchange.REDELIVERY_COUNTER</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>Integer</p><p>&#160;</p><p>The redelivery attempt, starting from 1.</p><p>&#160;</p><p>Only when an <a shape="rect" href="exchange.html">Exchange</a> has been successfully processed it will be marked as complete which happens when the <code>confirm</code> method is invoked on the <code>AggregationReposito
 ry</code>. This means if the same <a shape="rect" href="exchange.html">Exchange</a> fails again it will be kept retried until it success.</p><p>You can use option <code>maximumRedeliveries</code> to limit the maximum number of redelivery attempts for a given recovered <a shape="rect" href="exchange.html">Exchange</a>. You must also set the <code>deadLetterUri</code> option so Camel knows where to send the <a shape="rect" href="exchange.html">Exchange</a> when the <code>maximumRedeliveries</code> was hit.</p><p>You can see some examples in the unit tests of camel-sql, for example <a shape="rect" class="external-link" href="https://svn.apache.org/repos/asf/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateRecoverDeadLetterChannelTest.java">this test</a>.</p><p>Database</p><p>To be operational, each aggregator uses two table: the aggregation and completed one. By convention the completed has the same name as the aggregation one suffix
 ed with <code>"_COMPLETED"</code>. The name must be configured in the Spring bean with the <code>RepositoryName</code> property. In the following example aggregation will be used.</p><p>The table structure definition of both table are identical: in both case a String value is used as key (<strong>id</strong>) whereas a Blob contains the exchange serialized in byte array.<br clear="none"> However one difference should be remembered: the <strong>id</strong> field does not have the same content depending on the table.<br clear="none"> In the aggregation table <strong>id</strong> holds the correlation Id used by the component to aggregate the messages. In the completed table, <strong>id</strong> holds the id of the exchange stored in corresponding the blob field.</p><p>Here is the SQL query used to create the tables, just replace <code>"aggregation"</code> with your aggregator repository name.</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent panelContent
  pdl">
+</div></div><p>CREATE TABLE CAMEL_MESSAGEPROCESSED ( processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP )</p><p>&#160;</p><p>&#160;</p><div class="confluence-information-macro confluence-information-macro-warning"><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body">&#160;</div></div><p class="wysiwyg-macro-body">The SQL Server&#160;<strong>TIMESTAMP</strong> type is a fixed-length binary-string type. It does not map to any of the JDBC time types: <strong>DATE</strong>, <strong>TIME</strong>, or <strong>TIMESTAMP</strong>.</p><p>&#160;</p><p>&#160;</p><p>We recommend to have a unique constraint on the columns processorName and messageId. Because the syntax for this constraint differs for database to database, we do not show it here.</p><p>Second we need to setup a <code>javax.sql.DataSource</code> in the spring XML file:</p><p>&#160;</p>{snippet:id=e1|lang=xml|url=camel/t
 runk/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml}<p></p><p>&#160;</p><p>And finally we can create our JDBC idempotent repository in the spring XML file as well:</p><p>&#160;</p>{snippet:id=e2|lang=xml|url=camel/trunk/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/spring.xml}<p></p><p>&#160;</p><p>Customize the JdbcMessageIdRepository</p><p>Starting with <strong>Camel 2.9.1</strong> you have a few options to tune the <code>org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository</code> for your needs:</p><p class="confluenceTable">&#160;</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Parameter</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Default Value</p><p>&#160;</p><p>Description</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>createTableIfNotExists</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>true</p><p>&#160;</p><p>Defines whether or not Camel sh
 ould try to create the table if it doesn't exist.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>tableExistsString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>SELECT 1 FROM CAMEL_MESSAGEPROCESSED WHERE 1 = 0</p><p>&#160;</p><p>This query is used to figure out whether the table already exists or not. It must throw an exception to indicate the table doesn't exist.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>createString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>CREATE TABLE CAMEL_MESSAGEPROCESSED (processorName VARCHAR(255), messageId VARCHAR(100), createdAt TIMESTAMP)</p><p>&#160;</p><p>The statement which is used to create the table.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>queryString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>SELECT COUNT(*) FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? AND messageId = ?</p><p>&#160;</p><p>The query which is used to figure out whether the message 
 already exists in the repository (the result is not equals to '0'). It takes two parameters. This first one is the processor name (<code>String</code>) and the second one is the message id (<code>String</code>).</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>insertString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>INSERT INTO CAMEL_MESSAGEPROCESSED (processorName, messageId, createdAt) VALUES (?, ?, ?)</p><p>&#160;</p><p>The statement which is used to add the entry into the table. It takes three parameter. The first one is the processor name (<code>String</code>), the second one is the message id (<code>String</code>) and the third one is the timestamp (<code>java.sql.Timestamp</code>) when this entry was added to the repository.</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>deleteString</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>DELETE FROM CAMEL_MESSAGEPROCESSED WHERE processorName = ? AND messageId = ?</p><p>&#160;</p><p>The statement 
 which is used to delete the entry from the database. It takes two parameter. This first one is the processor name (<code>String</code>) and the second one is the message id (<code>String</code>).</p><p>&#160;</p><p>A customized <code>org.apache.camel.processor.idempotent.jdbc.JdbcMessageIdRepository</code> could look like:</p><p>&#160;</p>{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-sql/src/test/resources/org/apache/camel/processor/idempotent/jdbc/customized-spring.xml}<p></p><p>&#160;</p><p>Using the JDBC based aggregation repository</p><p><strong>Available as of Camel 2.6</strong></p><div class="confluence-information-macro confluence-information-macro-information"><p class="title">Using JdbcAggregationRepository in Camel 2.6</p><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body">&#160;</div></div><p>In Camel 2.6, the JdbcAggregationRepository is provided in the <code>camel-jdbc
 -aggregator</code> component. From Camel 2.7 onwards, the <code>JdbcAggregationRepository</code> is provided in the <code>camel-sql</code> component.</p><p>&#160;</p><p><code>JdbcAggregationRepository</code> is an <code>AggregationRepository</code> which on the fly persists the aggregated messages. This ensures that you will not loose messages, as the default aggregator will use an in memory only <code>AggregationRepository</code>.<br clear="none"> The <code>JdbcAggregationRepository</code> allows together with Camel to provide persistent support for the <a shape="rect" href="aggregator2.html">Aggregator</a>.</p><p>It has the following options:</p><p class="confluenceTable">&#160;</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Option</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Type</p><p>&#160;</p><p>Description</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>dataSource</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>DataSourc
 e</code></p><p>&#160;</p><p><strong>Mandatory:</strong> The <code>javax.sql.DataSource</code> to use for accessing the database.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>repositoryName</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>String</code></p><p>&#160;</p><p><strong>Mandatory:</strong> The name of the repository.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>transactionManager</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>TransactionManager</code></p><p>&#160;</p><p><strong>Mandatory:</strong> The <code>org.springframework.transaction.PlatformTransactionManager</code> to mange transactions for the database. The TransactionManager must be able to support databases.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>lobHandler</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>LobHandler</code></p><p>&#160;</p><p>A <code>org.springframework.jdbc.sup
 port.lob.LobHandler</code> to handle Lob types in the database. Use this option to use a vendor specific LobHandler, for example when using Oracle.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>returnOldExchange</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>boolean</p><p>&#160;</p><p>Whether the get operation should return the old existing Exchange if any existed. By default this option is <code>false</code> to optimize as we do not need the old exchange when aggregating.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>useRecovery</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>boolean</p><p>&#160;</p><p>Whether or not recovery is enabled. This option is by default <code>true</code>. When enabled the Camel <a shape="rect" href="aggregator2.html">Aggregator</a> automatic recover failed aggregated exchange and have them resubmitted.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>recove
 ryInterval</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>long</p><p>&#160;</p><p>If recovery is enabled then a background task is run every x'th time to scan for failed exchanges to recover and resubmit. By default this interval is 5000 millis.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>maximumRedeliveries</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>int</p><p>&#160;</p><p>Allows you to limit the maximum number of redelivery attempts for a recovered exchange. If enabled then the Exchange will be moved to the dead letter channel if all redelivery attempts failed. By default this option is disabled. If this option is used then the <code>deadLetterUri</code> option must also be provided.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>deadLetterUri</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>String</p><p>&#160;</p><p>An endpoint uri for a <a shape="rect" href="dead-letter-channel.html">Dea
 d Letter Channel</a> where exhausted recovered Exchanges will be moved. If this option is used then the <code>maximumRedeliveries</code> option must also be provided.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>storeBodyAsText</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>boolean</p><p>&#160;</p><p><strong>Camel 2.11:</strong> Whether to store the message body as String which is human readable. By default this option is <code>false</code> storing the body in binary format.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>headersToStoreAsText</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>List&lt;String&gt;</code></p><p>&#160;</p><p><strong>Camel 2.11:</strong> Allows to store headers as String which is human readable. By default this option is disabled, storing the headers in binary format.</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>optimisticLocking</code></p><p>&#160;</
 p><p class="confluenceTd">&#160;</p><p><code>false</code></p><p>&#160;</p><p><strong>Camel 2.12:</strong> To turn on optimistic locking, which often would be needed in clustered environments where multiple Camel applications shared the same JDBC based aggregation repository.</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>jdbcOptimisticLockingExceptionMapper</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>&#160;</p><p>&#160;</p><p><strong>Camel 2.12:</strong> Allows to plugin a custom <code>org.apache.camel.processor.aggregate.jdbc.JdbcOptimisticLockingExceptionMapper</code> to map vendor specific error codes to an optimistick locking error, for Camel to perform a retry. This requires <code>optimisticLocking</code> to be enabled.</p><p>&#160;</p><p>What is preserved when persisting</p><p><code>JdbcAggregationRepository</code> will only preserve any <code>Serializable</code> compatible data types. If a data type is not such a type its dropped and a <code>WARN</
 code> is logged. And it only persists the <code>Message</code> body and the <code>Message</code> headers. The <code>Exchange</code> properties are <strong>not</strong> persisted.</p><p>From Camel 2.11 onwards you can store the message body and select(ed) headers as String in separate columns.</p><p>Recovery</p><p>The <code>JdbcAggregationRepository</code> will by default recover any failed <a shape="rect" href="exchange.html">Exchange</a>. It does this by having a background tasks that scans for failed <a shape="rect" href="exchange.html">Exchange</a>s in the persistent store. You can use the <code>checkInterval</code> option to set how often this task runs. The recovery works as transactional which ensures that Camel will try to recover and redeliver the failed <a shape="rect" href="exchange.html">Exchange</a>. Any <a shape="rect" href="exchange.html">Exchange</a> which was found to be recovered will be restored from the persistent store and resubmitted and send out again.</p><p>Th
 e following headers is set when an <a shape="rect" href="exchange.html">Exchange</a> is being recovered/redelivered:</p><p class="confluenceTable">&#160;</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Header</p><p>&#160;</p><p class="confluenceTh">&#160;</p><p>Type</p><p>&#160;</p><p>Description</p><p>&#160;</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>Exchange.REDELIVERED</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>Boolean</p><p>&#160;</p><p>Is set to true to indicate the <a shape="rect" href="exchange.html">Exchange</a> is being redelivered.</p><p>&#160;</p><p class="confluenceTd">&#160;</p><p><code>Exchange.REDELIVERY_COUNTER</code></p><p>&#160;</p><p class="confluenceTd">&#160;</p><p>Integer</p><p>&#160;</p><p>The redelivery attempt, starting from 1.</p><p>&#160;</p><p>Only when an <a shape="rect" href="exchange.html">Exchange</a> has been successfully processed it will be marked as complete which happens when the <code>confirm</code> method i
 s invoked on the <code>AggregationRepository</code>. This means if the same <a shape="rect" href="exchange.html">Exchange</a> fails again it will be kept retried until it success.</p><p>You can use option <code>maximumRedeliveries</code> to limit the maximum number of redelivery attempts for a given recovered <a shape="rect" href="exchange.html">Exchange</a>. You must also set the <code>deadLetterUri</code> option so Camel knows where to send the <a shape="rect" href="exchange.html">Exchange</a> when the <code>maximumRedeliveries</code> was hit.</p><p>You can see some examples in the unit tests of camel-sql, for example <a shape="rect" class="external-link" href="https://svn.apache.org/repos/asf/camel/trunk/components/camel-sql/src/test/java/org/apache/camel/processor/aggregate/jdbc/JdbcAggregateRecoverDeadLetterChannelTest.java">this test</a>.</p><p>Database</p><p>To be operational, each aggregator uses two table: the aggregation and completed one. By convention the completed has t
 he same name as the aggregation one suffixed with <code>"_COMPLETED"</code>. The name must be configured in the Spring bean with the <code>RepositoryName</code> property. In the following example aggregation will be used.</p><p>The table structure definition of both table are identical: in both case a String value is used as key (<strong>id</strong>) whereas a Blob contains the exchange serialized in byte array.<br clear="none"> However one difference should be remembered: the <strong>id</strong> field does not have the same content depending on the table.<br clear="none"> In the aggregation table <strong>id</strong> holds the correlation Id used by the component to aggregate the messages. In the completed table, <strong>id</strong> holds the id of the exchange stored in corresponding the blob field.</p><p>Here is the SQL query used to create the tables, just replace <code>"aggregation"</code> with your aggregator repository name.</p><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[ ]]></script>
 </div></div><p>CREATE TABLE aggregation ( id varchar(255) NOT NULL, exchange blob NOT NULL, constraint aggregation_pk PRIMARY KEY (id) ); CREATE TABLE aggregation_completed ( id varchar(255) NOT NULL, exchange blob NOT NULL, constraint aggregation_completed_pk PRIMARY KEY (id) );</p><p>&#160;</p><p>Storing body and headers as text</p><p><strong>Available as of Camel 2.11</strong></p><p>You can configure the <code>JdbcAggregationRepository</code> to store message body and select(ed) headers as String in separate columns. For example to store the body, and the following two headers <code>companyName</code> and <code>accountName</code> use the following SQL:</p><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[ ]]></script>

Modified: websites/production/camel/content/tracer-example.html
==============================================================================
--- websites/production/camel/content/tracer-example.html (original)
+++ websites/production/camel/content/tracer-example.html Thu May 19 20:22:56 2016
@@ -178,11 +178,11 @@ select * from camel_messagetraced
 <p>And it should return the list of trace events in the SQL.</p>
 
 <p>We enter this sql: <code>select id, shortExchangeId, previousNode, toNode, body from camel_messagetraced</code> and get the output as the picture below:<br clear="none">
-<span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tracer-example.data/tracer_sql.png" data-image-src="/confluence/download/attachments/107823/tracer_sql.png?version=1&amp;modificationDate=1232323775000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="9605" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="tracer_sql.png" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="107823" data-linked-resource-container-version="20"></span></p>
+<span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tracer-example.data/tracer_sql.png" data-image-src="/confluence/download/attachments/107823/tracer_sql.png?version=1&amp;modificationDate=1232323775000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="9605" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="tracer_sql.png" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="107823" data-linked-resource-container-version="21"></span></p>
 
 <h3 id="TracerExample-Routing">Routing</h3>
 <p>The diagram below illustrates the route diagram generated using <a shape="rect" href="visualisation.html">Visualisation</a>.<br clear="none">
-<span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tracer-example.data/tracer_dot.png" data-image-src="/confluence/download/attachments/107823/tracer_dot.png?version=1&amp;modificationDate=1232326207000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="9606" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="tracer_dot.png" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="107823" data-linked-resource-container-version="20"></span></p>
+<span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tracer-example.data/tracer_dot.png" data-image-src="/confluence/download/attachments/107823/tracer_dot.png?version=1&amp;modificationDate=1232326207000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="9606" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="tracer_dot.png" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="107823" data-linked-resource-container-version="21"></span></p>
 
 <p>We receive an Exchange from the in stream, then its split using the <code>splitWords</code> method. Then the quote method is invoked before its aggregated and finally sent to the stream out to be printed in the console.</p>
 

Modified: websites/production/camel/content/tutorial-jmsremoting.html
==============================================================================
--- websites/production/camel/content/tutorial-jmsremoting.html (original)
+++ websites/production/camel/content/tutorial-jmsremoting.html Thu May 19 20:22:56 2016
@@ -354,7 +354,7 @@ public static void main(final String[] a
 DefaultInstrumentationAgent    INFO  JMX connector thread started on service:jmx:rmi:///jndi/rmi://claus-acer:1099/jmxrmi/camel
 ...
 ]]></script>
-</div></div><p>In the screenshot below we can see the route and its performance metrics:<br clear="none"> <span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tutorial-jmsremoting.data/jconsole_jms_tutorial.PNG" data-image-src="/confluence/download/attachments/82923/jconsole_jms_tutorial.PNG?version=1&amp;modificationDate=1214345078000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="59672517" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="jconsole_jms_tutorial.PNG" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="82923" data-linked-resource-container-version="36"></span></p><h2 id="Tutorial-JmsRemoting-SeeAlso">See Also</h2><ul><li><a shape="rect" class="external-link" href="http://aminsblog.wordpress.com/2008/05/06/15/" rel="nofollow">Spring Remoting with JMS Example</a> on <a sh
 ape="rect" class="external-link" href="http://aminsblog.wordpress.com/" rel="nofollow">Amin Abbaspour's Weblog</a></li></ul></div>
+</div></div><p>In the screenshot below we can see the route and its performance metrics:<br clear="none"> <span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="tutorial-jmsremoting.data/jconsole_jms_tutorial.PNG" data-image-src="/confluence/download/attachments/82923/jconsole_jms_tutorial.PNG?version=1&amp;modificationDate=1214345078000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="59672517" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="jconsole_jms_tutorial.PNG" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="82923" data-linked-resource-container-version="37"></span></p><h2 id="Tutorial-JmsRemoting-SeeAlso">See Also</h2><ul><li><a shape="rect" class="external-link" href="http://aminsblog.wordpress.com/2008/05/06/15/" rel="nofollow">Spring Remoting with JMS Example</a> on <a sh
 ape="rect" class="external-link" href="http://aminsblog.wordpress.com/" rel="nofollow">Amin Abbaspour's Weblog</a></li></ul></div>
         </td>
         <td valign="top">
           <div class="navigation">