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 2017/08/25 08:22:03 UTC

svn commit: r1017260 [17/40] - in /websites/production/camel/content: ./ cache/

Modified: websites/production/camel/content/debugger.html
==============================================================================
--- websites/production/camel/content/debugger.html (original)
+++ websites/production/camel/content/debugger.html Fri Aug 25 08:22:01 2017
@@ -36,17 +36,6 @@
     <![endif]-->
 
 
-  <link href='//camel.apache.org/styles/highlighter/styles/shCoreCamel.css' rel='stylesheet' type='text/css' />
-  <link href='//camel.apache.org/styles/highlighter/styles/shThemeCamel.css' rel='stylesheet' type='text/css' />
-  <script src='//camel.apache.org/styles/highlighter/scripts/shCore.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
-  
-  <script type="text/javascript">
-  SyntaxHighlighter.defaults['toolbar'] = false;
-  SyntaxHighlighter.all();
-  </script>
 
     <title>
     Apache Camel: Debugger
@@ -86,42 +75,8 @@
 	<tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2 id="Debugger-Debugger">Debugger</h2><p><strong>Available as of Camel 2.6</strong></p><p>Camel <a shape="rect" href="debugger.html">Debugger</a> is much related to <a shape="rect" href="tracer.html">Tracer</a>, in fact they are sisters. Debugger is a enhanced tracer with a debugger framework so that tooling can be developed to easily monitor Camel routes, trace messages and set breakpoints at points in a route etc.</p><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>There is also a <a shape="rect" href="backlogdebugger.html">BacklogDebugger</a> which allows to debug from JMX, and 3rd party tooling.</p></div></div><h3 id="Debugger-AbouttheDebugger">About the Debugger</h3><p>The Debugger allows tooling or the likes to attach breakpoints which is being invoked when <a shap
 e="rect" href="exchange.html">Exchange</a>s are being routed.</p><h3 id="Debugger-DefaultImplementation">Default Implementation</h3><p>Camel provides a default implementation <strong><code>org.apache.camel.impl.DefaultDebugger</code></strong> which you can set on the <strong><code>CamelContext</code></strong> using the <strong><code>setDebugger</code></strong> method. Likewise you can get hold of the <a shape="rect" href="debugger.html">Debugger</a> using the <strong><code>getDebugger</code></strong> method on <strong><code>CamelContext</code></strong>.</p><p>The <strong><code>org.apache.camel.spi.Debugger</code></strong> has methods to attach and remove breakpoints. And to suspend/resume all breakpoints etc. You can also attach a condition to the breakpoint so it only reacts if the condition matches.</p><h3 id="Debugger-DebuggingCamelRoutesUsingcamel-test">Debugging Camel Routes Using <code>camel-test</code></h3><p>If you are developing unit tests using the <strong><code>camel-test
 </code></strong> component, then the <a shape="rect" href="debugger.html">Debugger</a> comes out of the box. From <strong>Camel 2.9</strong>: you would need to explicit enable the debugger, by overriding <strong><code>isUseDebugger()</code></strong> method and return <strong><code>true</code></strong>.</p><h4 id="Debugger-Example">Example</h4><p>In this unit test</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[public class DebugTest extends CamelTestSupport
-]]></script>
-</div></div><p>We want to debug the following route:</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[
-@Override
-protected RouteBuilder createRouteBuilder() throws Exception {
-    return new RouteBuilder() {
-        @Override
-        public void configure() throws Exception {
-            // this is the route we want to debug
-            from(&quot;direct:start&quot;)
-                .to(&quot;mock:a&quot;)
-                .transform(body().prepend(&quot;Hello &quot;))
-                .to(&quot;mock:b&quot;);
-        }
-    };
-}
-]]></script>
-</div></div>Which can easily done by overriding the <strong><code>debugBefore</code></strong> method as shown:<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[
-@Override
-public boolean isUseDebugger() {
-    // must enable debugger
-    return true;
-}
-
-@Override
-protected void debugBefore(Exchange exchange, Processor processor,
-                           ProcessorDefinition&lt;?&gt; definition, String id, String shortName) {
-    // this method is invoked before we are about to enter the given processor
-    // from your Java editor you can just add a breakpoint in the code line below
-    log.info(&quot;Before &quot; + definition + &quot; with body &quot; + exchange.getIn().getBody());
-}
-]]></script>
-</div></div>Then from your Java editor just add a breakpoint inside the <strong><code>debugBefore</code></strong> method. Then fire up the unit test and wait for the Java editor to hit the breakpoint. Then you can inspect the <a shape="rect" href="exchange.html">Exchange</a> during debugging while it advances during routing. The <strong><code>ProcessorDefinition</code></strong> and the <strong><code>id</code></strong> and <strong><code>shortName</code></strong> parameters is all information which tells you where in the route the breakpoint was hit.<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>There is also a <strong><code>debugAfter</code></strong> method which is invoked after the processor has been invoked. This allows you to <em>see</em> what happens to the <a shape="rect" href="exchange.html">Exchange</
 a> right after it has invoked a processor in the route.</p></div></div><p>The screenshot below shows the <a shape="rect" href="debugger.html">Debugger</a> in action. The IDE (IDEA) has hit the breakpoint and we can inspect the parameters. Notice how we can see that the message is to be send to the&#160;<strong><code>mock:a</code></strong> endpoint:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="debugger.data/debug.png" data-image-src="/confluence/download/attachments/86210/debug.png?version=1&amp;modificationDate=1288586116000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="24346680" data-linked-resource-version="1" data-linked-resource-type="attachment" data-linked-resource-default-alias="debug.png" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="86210" data-linked-resource-container-version="38"></span></p><h3 id="Debugger-Se
 eAlso">See Also</h3><ul class="alternate"><li><a shape="rect" href="tracer.html">Tracer</a></li><li><a shape="rect" href="backlogdebugger.html">BacklogDebugger</a></li></ul></div>
+<div class="wiki-content maincontent"><h2 id="Debugger-Debugger">Debugger</h2><p><strong>Available as of Camel 2.6</strong></p><p>Camel <a shape="rect" href="debugger.html">Debugger</a> is much related to <a shape="rect" href="tracer.html">Tracer</a>, in fact they are sisters. Debugger is a enhanced tracer with a debugger framework so that tooling can be developed to easily monitor Camel routes, trace messages and set breakpoints at points in a route etc.</p><rich-text-body><p>There is also a <a shape="rect" href="backlogdebugger.html">BacklogDebugger</a> which allows to debug from JMX, and 3rd party tooling.</p></rich-text-body><h3 id="Debugger-AbouttheDebugger">About the Debugger</h3><p>The Debugger allows tooling or the likes to attach breakpoints which is being invoked when <a shape="rect" href="exchange.html">Exchange</a>s are being routed.</p><h3 id="Debugger-DefaultImplementation">Default Implementation</h3><p>Camel provides a default implementation <strong><code>org.apache.c
 amel.impl.DefaultDebugger</code></strong> which you can set on the <strong><code>CamelContext</code></strong> using the <strong><code>setDebugger</code></strong> method. Likewise you can get hold of the <a shape="rect" href="debugger.html">Debugger</a> using the <strong><code>getDebugger</code></strong> method on <strong><code>CamelContext</code></strong>.</p><p>The <strong><code>org.apache.camel.spi.Debugger</code></strong> has methods to attach and remove breakpoints. And to suspend/resume all breakpoints etc. You can also attach a condition to the breakpoint so it only reacts if the condition matches.</p><h3 id="Debugger-DebuggingCamelRoutesUsingcamel-test">Debugging Camel Routes Using <code>camel-test</code></h3><p>If you are developing unit tests using the <strong><code>camel-test</code></strong> component, then the <a shape="rect" href="debugger.html">Debugger</a> comes out of the box. From <strong>Camel 2.9</strong>: you would need to explicit enable the debugger, by overridi
 ng <strong><code>isUseDebugger()</code></strong> method and return <strong><code>true</code></strong>.</p><h4 id="Debugger-Example">Example</h4><p>In this unit test</p><plain-text-body>public class DebugTest extends CamelTestSupport
+</plain-text-body><p>We want to debug the following route:<plain-text-body>{snippet:id=e2|lang=java|url=camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/DebugTest.java}</plain-text-body>Which can easily done by overriding the <strong><code>debugBefore</code></strong> method as shown:<plain-text-body>{snippet:id=e1|lang=java|url=camel/trunk/components/camel-test/src/test/java/org/apache/camel/test/patterns/DebugTest.java}</plain-text-body>Then from your Java editor just add a breakpoint inside the <strong><code>debugBefore</code></strong> method. Then fire up the unit test and wait for the Java editor to hit the breakpoint. Then you can inspect the <a shape="rect" href="exchange.html">Exchange</a> during debugging while it advances during routing. The <strong><code>ProcessorDefinition</code></strong> and the <strong><code>id</code></strong> and <strong><code>shortName</code></strong> parameters is all information which tells you where in the route the br
 eakpoint was hit.</p><rich-text-body><p>There is also a <strong><code>debugAfter</code></strong> method which is invoked after the processor has been invoked. This allows you to <em>see</em> what happens to the <a shape="rect" href="exchange.html">Exchange</a> right after it has invoked a processor in the route.</p></rich-text-body><p>The screenshot below shows the <a shape="rect" href="debugger.html">Debugger</a> in action. The IDE (IDEA) has hit the breakpoint and we can inspect the parameters. Notice how we can see that the message is to be send to the&#160;<strong><code>mock:a</code></strong> endpoint:</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image" src="debugger.data/debug.png" data-image-src="/confluence/download/attachments/86210/debug.png?version=1&amp;modificationDate=1288586116000&amp;api=v2" data-unresolved-comment-count="0" data-linked-resource-id="24346680" data-linked-resource-version="1" data-linked-resource-type="attachment
 " data-linked-resource-default-alias="debug.png" data-base-url="https://cwiki.apache.org/confluence" data-linked-resource-content-type="image/png" data-linked-resource-container-id="86210" data-linked-resource-container-version="39"></span></p><h3 id="Debugger-SeeAlso">See Also</h3><ul class="alternate"><li><a shape="rect" href="tracer.html">Tracer</a></li><li><a shape="rect" href="backlogdebugger.html">BacklogDebugger</a></li></ul></div>
         </td>
         <td valign="top">
           <div class="navigation">

Modified: websites/production/camel/content/delayer.html
==============================================================================
--- websites/production/camel/content/delayer.html (original)
+++ websites/production/camel/content/delayer.html Fri Aug 25 08:22:01 2017
@@ -36,17 +36,6 @@
     <![endif]-->
 
 
-  <link href='//camel.apache.org/styles/highlighter/styles/shCoreCamel.css' rel='stylesheet' type='text/css' />
-  <link href='//camel.apache.org/styles/highlighter/styles/shThemeCamel.css' rel='stylesheet' type='text/css' />
-  <script src='//camel.apache.org/styles/highlighter/scripts/shCore.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
-  
-  <script type="text/javascript">
-  SyntaxHighlighter.defaults['toolbar'] = false;
-  SyntaxHighlighter.all();
-  </script>
 
     <title>
     Apache Camel: Delayer
@@ -86,92 +75,31 @@
 	<tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><h3 id="Delayer-Delayer">Delayer</h3><p>The Delayer Pattern allows you to delay the delivery of messages to some destination.</p><div class="confluence-information-macro confluence-information-macro-information"><span class="aui-icon aui-icon-small aui-iconfont-info confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>The expression is a value in millis to wait from the current time, so the expression should just be <code>3000</code>.<br clear="none"> However you can use a long value for a fixed value to indicate the delay in millis.<br clear="none"> See the Spring DSL samples for Delayer.</p></div></div><div class="confluence-information-macro confluence-information-macro-warning"><p class="title">Using Delayer in Java DSL</p><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>See this ticket: <a shape="rect" cl
 ass="external-link" href="https://issues.apache.org/jira/browse/CAMEL-2654">https://issues.apache.org/jira/browse/CAMEL-2654</a></p></div></div><h3 id="Delayer-Options">Options</h3><div class="confluenceTableSmall">
+<div class="wiki-content maincontent"><h3 id="Delayer-Delayer">Delayer</h3><p>The Delayer Pattern allows you to delay the delivery of messages to some destination.</p><parameter ac:name="">Delayer</parameter><rich-text-body><p>The expression is a value in millis to wait from the current time, so the expression should just be <code>3000</code>.<br clear="none"> However you can use a long value for a fixed value to indicate the delay in millis.<br clear="none"> See the Spring DSL samples for Delayer.</p></rich-text-body><parameter ac:name="title">Using Delayer in Java DSL</parameter><rich-text-body><p>See this ticket: <a shape="rect" class="external-link" href="https://issues.apache.org/jira/browse/CAMEL-2654">https://issues.apache.org/jira/browse/CAMEL-2654</a></p></rich-text-body><h3 id="Delayer-Options">Options</h3><parameter ac:name="class">confluenceTableSmall</parameter><rich-text-body>
 <div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Name </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Default Value </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>asyncDelayed</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.4:</strong> If enabled then delayed messages happens asynchronously using a scheduled thread pool. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>executorServiceRef</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>&#160;</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p>  <strong>Camel 2.4:</strong> Refers to a custom <a shape="rect" href="threading-model.html">Thread Pool</a> to be used if <code>asyncDel
 ay</code> has been enabled. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>callerRunsWhenRejected</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.4:</strong> Is used if <code>asyncDelayed</code> was enabled. This controls if the caller thread should execute the task if the thread pool rejected the task. </p></td></tr></tbody></table></div>
-</div>
-
-
-<p><strong>Using the <a shape="rect" href="fluent-builders.html">Fluent Builders</a></strong></p><p>The example below will delay all messages received on <strong>seda:b</strong> 1 second before sending them to <strong><a shape="rect" class="external-link" href="http://mockresult" rel="nofollow">mock:result</a></strong>.</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(&quot;seda:b&quot;).delay(100).to(&quot;mock:result&quot;);
-]]></script>
-</div></div><p>You can just delay things a fixed amount of time from the point at which the delayer receives the message. For example to delay things 2 seconds</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[delayer(2000)
-]]></script>
-</div></div><p>The above assume that the delivery order is maintained and that the messages are delivered in delay order. If you want to reorder the messages based on delivery time, you can use the <a shape="rect" href="resequencer.html">Resequencer</a> with this pattern. For example</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(&quot;activemq:someQueue&quot;).resequencer(header(&quot;MyDeliveryTime&quot;)).delay(&quot;MyRedeliveryTime&quot;).to(&quot;activemq:aDelayedQueue&quot;);
-]]></script>
-</div></div><p>You can of course use many different <a shape="rect" href="expression.html">Expression</a> languages such as <a shape="rect" href="xpath.html">XPath</a>, <a shape="rect" href="xquery.html">XQuery</a>, <a shape="rect" href="sql.html">SQL</a> or various <a shape="rect" href="scripting-languages.html">Scripting Languages</a>. For example to delay the message for the time period specified in the header, use the following syntax:</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(&quot;activemq:someQueue&quot;).delay(header(&quot;delayValue&quot;)).to(&quot;activemq:aDelayedQueue&quot;);
-]]></script>
-</div></div><p>And to delay processing using the <a shape="rect" href="simple.html">Simple</a> language you can use the following DSL:</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(&quot;activemq:someQueue&quot;).delay(simple(&quot;${body.delayProperty}&quot;)).to(&quot;activemq:aDelayedQueue&quot;);
-]]></script>
-</div></div><h4 id="Delayer-SpringDSL">Spring DSL</h4><p>The sample below demonstrates the delay in Spring DSL:</p><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[
-&lt;bean id=&quot;myDelayBean&quot; class=&quot;org.apache.camel.processor.MyDelayCalcBean&quot;/&gt;
-&lt;bean id=&quot;exchangeAwareBean&quot; class=&quot;org.apache.camel.processor.ExchangeAwareDelayCalcBean&quot;/&gt;
-
-&lt;camelContext xmlns=&quot;http://camel.apache.org/schema/spring&quot;&gt;
-    &lt;route&gt;
-        &lt;from uri=&quot;seda:a&quot;/&gt;
-        &lt;delay&gt;
-            &lt;header&gt;MyDelay&lt;/header&gt;
-        &lt;/delay&gt;
-        &lt;to uri=&quot;mock:result&quot;/&gt;
-    &lt;/route&gt;
-    &lt;route&gt;
-        &lt;from uri=&quot;seda:b&quot;/&gt;
-        &lt;delay&gt;
-            &lt;constant&gt;1000&lt;/constant&gt;
-        &lt;/delay&gt;
-        &lt;to uri=&quot;mock:result&quot;/&gt;
-    &lt;/route&gt;
-    &lt;route&gt;
-        &lt;from uri=&quot;seda:c&quot;/&gt;
-        &lt;delay&gt;
-            &lt;method ref=&quot;myDelayBean&quot; method=&quot;delayMe&quot;/&gt;
-        &lt;/delay&gt;
-        &lt;to uri=&quot;mock:result&quot;/&gt;
-    &lt;/route&gt;
-    &lt;route&gt;
-        &lt;from uri=&quot;seda:d&quot;/&gt;
-        &lt;delay&gt;
-            &lt;method ref=&quot;exchangeAwareBean&quot; method=&quot;delayMe&quot;/&gt;
-        &lt;/delay&gt;
-        &lt;to uri=&quot;mock:result&quot;/&gt;
-    &lt;/route&gt;
-&lt;/camelContext&gt;
-]]></script>
-</div></div><p>For further examples of this pattern in use you could look at the <a shape="rect" class="external-link" href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DelayerTest.java?view=markup">junit test case</a></p><h3 id="Delayer-Asynchronousdelaying">Asynchronous delaying</h3><p><strong>Available as of Camel 2.4</strong></p><p>You can let the <a shape="rect" href="delayer.html">Delayer</a> use non blocking asynchronous delaying, which means Camel will use a scheduler to schedule a task to be executed in the future. The task will then continue routing. This allows the caller thread to not block and be able to service other messages etc.</p><h4 id="Delayer-FromJavaDSL">From Java DSL</h4><p>You use the <code>asyncDelayed()</code> to enable the async behavior.</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(&quot;activemq:queue:foo&quot;).delay(1000).asyncDelayed().to(&quot;activemq:aDelayedQueue&quot;);
-]]></script>
-</div></div><h4 id="Delayer-FromSpringXML">From Spring XML</h4><p>You use the <code>asyncDelayed="true"</code> attribute to enable the async behavior.</p><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[&lt;route&gt;
-   &lt;from uri=&quot;activemq:queue:foo&quot;/&gt;
-   &lt;delay asyncDelayed=&quot;true&quot;&gt;
+</rich-text-body><p><strong>Using the <a shape="rect" href="fluent-builders.html">Fluent Builders</a></strong></p><p>The example below will delay all messages received on <strong>seda:b</strong> 1 second before sending them to <strong><a shape="rect" class="external-link" href="http://mockresult" rel="nofollow">mock:result</a></strong>.</p><plain-text-body>{snippet:id=ex2|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DelayerTest.java}</plain-text-body><p>You can just delay things a fixed amount of time from the point at which the delayer receives the message. For example to delay things 2 seconds</p><plain-text-body>delayer(2000)
+</plain-text-body><p>The above assume that the delivery order is maintained and that the messages are delivered in delay order. If you want to reorder the messages based on delivery time, you can use the <a shape="rect" href="resequencer.html">Resequencer</a> with this pattern. For example</p><plain-text-body>from("activemq:someQueue").resequencer(header("MyDeliveryTime")).delay("MyRedeliveryTime").to("activemq:aDelayedQueue");
+</plain-text-body><p>You can of course use many different <a shape="rect" href="expression.html">Expression</a> languages such as <a shape="rect" href="xpath.html">XPath</a>, <a shape="rect" href="xquery.html">XQuery</a>, <a shape="rect" href="sql.html">SQL</a> or various <a shape="rect" href="scripting-languages.html">Scripting Languages</a>. For example to delay the message for the time period specified in the header, use the following syntax:</p><plain-text-body>from("activemq:someQueue").delay(header("delayValue")).to("activemq:aDelayedQueue");
+</plain-text-body><p>And to delay processing using the <a shape="rect" href="simple.html">Simple</a> language you can use the following DSL:</p><plain-text-body>from("activemq:someQueue").delay(simple("${body.delayProperty}")).to("activemq:aDelayedQueue");
+</plain-text-body><h4 id="Delayer-SpringDSL">Spring DSL</h4><p>The sample below demonstrates the delay in Spring DSL:</p><plain-text-body>{snippet:id=example|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/delayer.xml}</plain-text-body><p>For further examples of this pattern in use you could look at the <a shape="rect" class="external-link" href="http://svn.apache.org/viewvc/camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DelayerTest.java?view=markup">junit test case</a></p><h3 id="Delayer-Asynchronousdelaying">Asynchronous delaying</h3><p><strong>Available as of Camel 2.4</strong></p><p>You can let the <a shape="rect" href="delayer.html">Delayer</a> use non blocking asynchronous delaying, which means Camel will use a scheduler to schedule a task to be executed in the future. The task will then continue routing. This allows the caller thread to not block and be able to service other messages etc.</p><h4 id="Delaye
 r-FromJavaDSL">From Java DSL</h4><p>You use the <code>asyncDelayed()</code> to enable the async behavior.</p><plain-text-body>from("activemq:queue:foo").delay(1000).asyncDelayed().to("activemq:aDelayedQueue");
+</plain-text-body><h4 id="Delayer-FromSpringXML">From Spring XML</h4><p>You use the <code>asyncDelayed="true"</code> attribute to enable the async behavior.</p><parameter ac:name="">xml</parameter><plain-text-body>&lt;route&gt;
+   &lt;from uri="activemq:queue:foo"/&gt;
+   &lt;delay asyncDelayed="true"&gt;
        &lt;constant&gt;1000&lt;/constant&gt;
    &lt;/delay&gt;
-   &lt;to uri=&quot;activemq:aDealyedQueue&quot;/&gt;
+   &lt;to uri="activemq:aDealyedQueue"/&gt;
 &lt;/route&gt;
-]]></script>
-</div></div><h3 id="Delayer-Creatingacustomdelay">Creating a custom delay</h3><p>You can use an expression to determine when to send a message using something like this</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(&quot;activemq:foo&quot;).
-  delay().method(&quot;someBean&quot;, &quot;computeDelay&quot;).
-  to(&quot;activemq:bar&quot;);
-]]></script>
-</div></div><p>then the bean would look like this...</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[public class SomeBean {
+</plain-text-body><h3 id="Delayer-Creatingacustomdelay">Creating a custom delay</h3><p>You can use an expression to determine when to send a message using something like this</p><plain-text-body>from("activemq:foo").
+  delay().method("someBean", "computeDelay").
+  to("activemq:bar");
+</plain-text-body><p>then the bean would look like this...</p><plain-text-body>public class SomeBean {
   public long computeDelay() { 
      long delay = 0;
      // use java code to compute a delay value in millis
      return delay;
  }
 }
-]]></script>
-</div></div><p></p><h4 id="Delayer-UsingThisPattern">Using This Pattern</h4>
-
-<p>If you would like to use this EIP Pattern then please read the <a shape="rect" href="getting-started.html">Getting Started</a>, you may also find the <a shape="rect" href="architecture.html">Architecture</a> useful particularly the description of <a shape="rect" href="endpoint.html">Endpoint</a> and <a shape="rect" href="uris.html">URIs</a>. Then you could try out some of the <a shape="rect" href="examples.html">Examples</a> first before trying this pattern out.</p><h3 id="Delayer-SeeAlso">See Also</h3><ul><li><a shape="rect" href="delay-interceptor.html">Delay Interceptor</a></li></ul></div>
+</plain-text-body><p><parameter ac:name=""><a shape="rect" href="using-this-pattern.html">Using This Pattern</a></parameter></p><h3 id="Delayer-SeeAlso">See Also</h3><ul><li><a shape="rect" href="delay-interceptor.html">Delay Interceptor</a></li></ul></div>
         </td>
         <td valign="top">
           <div class="navigation">

Modified: websites/production/camel/content/dynamic-router.html
==============================================================================
--- websites/production/camel/content/dynamic-router.html (original)
+++ websites/production/camel/content/dynamic-router.html Fri Aug 25 08:22:01 2017
@@ -36,17 +36,6 @@
     <![endif]-->
 
 
-  <link href='//camel.apache.org/styles/highlighter/styles/shCoreCamel.css' rel='stylesheet' type='text/css' />
-  <link href='//camel.apache.org/styles/highlighter/styles/shThemeCamel.css' rel='stylesheet' type='text/css' />
-  <script src='//camel.apache.org/styles/highlighter/scripts/shCore.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushJava.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushXml.js' type='text/javascript'></script>
-  <script src='//camel.apache.org/styles/highlighter/scripts/shBrushPlain.js' type='text/javascript'></script>
-  
-  <script type="text/javascript">
-  SyntaxHighlighter.defaults['toolbar'] = false;
-  SyntaxHighlighter.all();
-  </script>
 
     <title>
     Apache Camel: Dynamic Router
@@ -86,125 +75,27 @@
 	<tbody>
         <tr>
         <td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2 id="DynamicRouter-DynamicRouter">Dynamic Router</h2><p>The <a shape="rect" class="external-link" href="http://www.enterpriseintegrationpatterns.com/DynamicRouter.html" rel="nofollow">Dynamic Router</a> from the <a shape="rect" href="enterprise-integration-patterns.html">EIP patterns</a> allows you to route messages while avoiding the dependency of the router on all possible destinations while maintaining its efficiency.</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://www.enterpriseintegrationpatterns.com/img/DynamicRouter.gif" data-image-src="http://www.enterpriseintegrationpatterns.com/img/DynamicRouter.gif"></span></p><p>In <strong>Camel 2.5</strong> we introduced a <code>dynamicRouter</code> in the DSL which is like a dynamic <a shape="rect" href="routing-slip.html">Routing Slip</a> which evaluates the slip <em>on-the-fly</em>.</p><div class="confluence-i
 nformation-macro confluence-information-macro-warning"><p class="title">Beware</p><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>You must ensure the expression used for the <code>dynamicRouter</code> such as a bean, will return <code>null</code> to indicate the end. Otherwise the <code>dynamicRouter</code> will keep repeating endlessly.</p></div></div><h3 id="DynamicRouter-Options">Options</h3><div class="confluenceTableSmall">
+<div class="wiki-content maincontent"><h2 id="DynamicRouter-DynamicRouter">Dynamic Router</h2><p>The <a shape="rect" class="external-link" href="http://www.enterpriseintegrationpatterns.com/DynamicRouter.html" rel="nofollow">Dynamic Router</a> from the <a shape="rect" href="enterprise-integration-patterns.html">EIP patterns</a> allows you to route messages while avoiding the dependency of the router on all possible destinations while maintaining its efficiency.</p><p><span class="confluence-embedded-file-wrapper"><img class="confluence-embedded-image confluence-external-resource" src="http://www.enterpriseintegrationpatterns.com/img/DynamicRouter.gif" data-image-src="http://www.enterpriseintegrationpatterns.com/img/DynamicRouter.gif"></span></p><p>In <strong>Camel 2.5</strong> we introduced a <code>dynamicRouter</code> in the DSL which is like a dynamic <a shape="rect" href="routing-slip.html">Routing Slip</a> which evaluates the slip <em>on-the-fly</em>.</p><parameter ac:name="titl
 e">Beware</parameter><rich-text-body><p>You must ensure the expression used for the <code>dynamicRouter</code> such as a bean, will return <code>null</code> to indicate the end. Otherwise the <code>dynamicRouter</code> will keep repeating endlessly.</p></rich-text-body><h3 id="DynamicRouter-Options">Options</h3><parameter ac:name="class">confluenceTableSmall</parameter><rich-text-body>
 <div class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p> Name </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Default Value </p></th><th colspan="1" rowspan="1" class="confluenceTh"><p> Description </p></th></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>uriDelimiter</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>,</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> Delimiter used if the <a shape="rect" href="expression.html">Expression</a> returned multiple endpoints. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>ignoreInvalidEndpoints</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>false</code> </p></td><td colspan="1" rowspan="1" class="confluenceTd"><p> If an endpoint uri could not be resolved, should it be ignored. Otherwise Camel will thrown an exception stating the endpoint uri is
  not valid. </p></td></tr><tr><td colspan="1" rowspan="1" class="confluenceTd"><p> <code>cacheSize</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.13.1/2.12.4:</strong> Allows to configure the cache size for the <code>ProducerCache</code> which caches producers for reuse in the routing slip. Will by default use the default cache size which is 1000. Setting the value to -1 allows to turn off the cache all together. </p></td></tr></tbody></table></div>
-</div>
-
-
-<h3 id="DynamicRouter-DynamicRouterinCamel2.5onwards">Dynamic Router in Camel 2.5 onwards</h3><p>From Camel 2.5 the <a shape="rect" href="dynamic-router.html">Dynamic Router</a> will set a property (Exchange.SLIP_ENDPOINT) on the <a shape="rect" href="exchange.html">Exchange</a> which contains the current endpoint as it advanced though the slip. This allows you to know how far we have processed in the slip. (It's a slip because the <a shape="rect" href="dynamic-router.html">Dynamic Router</a> implementation is based on top of <a shape="rect" href="routing-slip.html">Routing Slip</a>).</p><h4 id="DynamicRouter-JavaDSL">Java DSL</h4><p>In Java DSL you can use the <code>dynamicRouter</code> as shown below:</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(&quot;direct:start&quot;)
-    // use a bean as the dynamic router
-    .dynamicRouter(method(DynamicRouterTest.class, &quot;slip&quot;));
-]]></script>
-</div></div><p>Which will leverage a <a shape="rect" href="bean.html">Bean</a> to compute the slip <em>on-the-fly</em>, which could be implemented as follows:</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[
-/**
- * Use this method to compute dynamic where we should route next.
- *
- * @param body the message body
- * @return endpoints to go, or &lt;tt&gt;null&lt;/tt&gt; to indicate the end
- */
-public String slip(String body) {
-    bodies.add(body);
-    invoked++;
-
-    if (invoked == 1) {
-        return &quot;mock:a&quot;;
-    } else if (invoked == 2) {
-        return &quot;mock:b,mock:c&quot;;
-    } else if (invoked == 3) {
-        return &quot;direct:foo&quot;;
-    } else if (invoked == 4) {
-        return &quot;mock:result&quot;;
-    }
+</rich-text-body><h3 id="DynamicRouter-DynamicRouterinCamel2.5onwards">Dynamic Router in Camel 2.5 onwards</h3><p>From Camel 2.5 the <a shape="rect" href="dynamic-router.html">Dynamic Router</a> will set a property (Exchange.SLIP_ENDPOINT) on the <a shape="rect" href="exchange.html">Exchange</a> which contains the current endpoint as it advanced though the slip. This allows you to know how far we have processed in the slip. (It's a slip because the <a shape="rect" href="dynamic-router.html">Dynamic Router</a> implementation is based on top of <a shape="rect" href="routing-slip.html">Routing Slip</a>).</p><h4 id="DynamicRouter-JavaDSL">Java DSL</h4><p>In Java DSL you can use the <code>dynamicRouter</code> as shown below:</p><plain-text-body>{snippet:id=e1|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DynamicRouterTest.java}</plain-text-body><p>Which will leverage a <a shape="rect" href="bean.html">Bean</a> to compute the slip <em>on-the-fly</em>, which
  could be implemented as follows:</p><plain-text-body>{snippet:id=e2|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DynamicRouterTest.java}</plain-text-body><p>Mind that this example is only for show and tell. The current implementation is not thread safe. You would have to store the state on the <a shape="rect" href="exchange.html">Exchange</a>, to ensure thread safety, as shown below:</p><plain-text-body>{snippet:id=e2|lang=java|url=camel/trunk/camel-core/src/test/java/org/apache/camel/processor/DynamicRouterExchangePropertiesTest.java}</plain-text-body><p>You could also store state as message headers, but they are not guaranteed to be preserved during routing, where as properties on the <a shape="rect" href="exchange.html">Exchange</a> are. Although there was a bug in the method call expression, see the warning below.</p><parameter ac:name="title">Using beans to store state</parameter><rich-text-body><p>Mind that in Camel 2.9.2 or older, when using 
 a <a shape="rect" href="bean.html">Bean</a> the state is not propagated, so you will have to use a <a shape="rect" href="processor.html">Processor</a> instead. This is fixed in Camel 2.9.3 onwards.</p></rich-text-body><h4 id="DynamicRouter-SpringXML">Spring XML</h4><p>The same example in Spring XML would be:</p><plain-text-body>{snippet:id=e1|lang=xml|url=camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/SpringDynamicRouterTest.xml}</plain-text-body><h4 id="DynamicRouter-@DynamicRouterannotation">@DynamicRouter annotation</h4><p>You can also use the <code>@DynamicRouter</code> annotation, for example the Camel 2.4 example below could be written as follows. The <code>route</code> method would then be invoked repeatedly as the message is processed dynamically. The idea is to return the next endpoint uri where to go. Return <code>null</code> to indicate the end. You can return multiple endpoints if you like, just as the <a shape="rect" href="routi
 ng-slip.html">Routing Slip</a>, where each endpoint is separated by a delimiter.</p><parameter ac:name="">java</parameter><plain-text-body>public class MyDynamicRouter {
 
-    // no more so return null
-    return null;
-}
-]]></script>
-</div></div><p>Mind that this example is only for show and tell. The current implementation is not thread safe. You would have to store the state on the <a shape="rect" href="exchange.html">Exchange</a>, to ensure thread safety, as shown below:</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[
-/**
- * Use this method to compute dynamic where we should route next.
- *
- * @param body the message body
- * @param properties the exchange properties where we can store state between invocations
- * @return endpoints to go, or &lt;tt&gt;null&lt;/tt&gt; to indicate the end
- */
-public String slip(String body, @ExchangeProperties Map&lt;String, Object&gt; properties) {
-    bodies.add(body);
-
-    // get the state from the exchange properties and keep track how many times
-    // we have been invoked
-    int invoked = 0;
-    Object current = properties.get(&quot;invoked&quot;);
-    if (current != null) {
-        invoked = Integer.valueOf(current.toString());
-    }
-    invoked++;
-    // and store the state back on the properties
-    properties.put(&quot;invoked&quot;, invoked);
-
-    if (invoked == 1) {
-        return &quot;mock:a&quot;;
-    } else if (invoked == 2) {
-        return &quot;mock:b,mock:c&quot;;
-    } else if (invoked == 3) {
-        return &quot;direct:foo&quot;;
-    } else if (invoked == 4) {
-        return &quot;mock:result&quot;;
-    }
-
-    // no more so return null
-    return null;
-}
-]]></script>
-</div></div><p>You could also store state as message headers, but they are not guaranteed to be preserved during routing, where as properties on the <a shape="rect" href="exchange.html">Exchange</a> are. Although there was a bug in the method call expression, see the warning below.</p><div class="confluence-information-macro confluence-information-macro-warning"><p class="title">Using beans to store state</p><span class="aui-icon aui-icon-small aui-iconfont-error confluence-information-macro-icon"></span><div class="confluence-information-macro-body"><p>Mind that in Camel 2.9.2 or older, when using a <a shape="rect" href="bean.html">Bean</a> the state is not propagated, so you will have to use a <a shape="rect" href="processor.html">Processor</a> instead. This is fixed in Camel 2.9.3 onwards.</p></div></div><h4 id="DynamicRouter-SpringXML">Spring XML</h4><p>The same example in Spring XML would be:</p><div class="code panel pdl" style="border-width: 1px;"><div class="codeContent pane
 lContent pdl">
-<script class="brush: xml; gutter: false; theme: Default" type="syntaxhighlighter"><![CDATA[
-&lt;bean id=&quot;mySlip&quot; class=&quot;org.apache.camel.processor.DynamicRouterTest&quot;/&gt;
-
-&lt;camelContext xmlns=&quot;http://camel.apache.org/schema/spring&quot;&gt;
-    &lt;route&gt;
-        &lt;from uri=&quot;direct:start&quot;/&gt;
-        &lt;dynamicRouter&gt;
-            &lt;!-- use a method call on a bean as dynamic router --&gt;
-            &lt;method ref=&quot;mySlip&quot; method=&quot;slip&quot;/&gt;
-        &lt;/dynamicRouter&gt;
-    &lt;/route&gt;
-
-    &lt;route&gt;
-        &lt;from uri=&quot;direct:foo&quot;/&gt;
-        &lt;transform&gt;&lt;constant&gt;Bye World&lt;/constant&gt;&lt;/transform&gt;
-    &lt;/route&gt;
-
-&lt;/camelContext&gt;
-]]></script>
-</div></div><h4 id="DynamicRouter-@DynamicRouterannotation">@DynamicRouter annotation</h4><p>You can also use the <code>@DynamicRouter</code> annotation, for example the Camel 2.4 example below could be written as follows. The <code>route</code> method would then be invoked repeatedly as the message is processed dynamically. The idea is to return the next endpoint uri where to go. Return <code>null</code> to indicate the end. You can return multiple endpoints if you like, just as the <a shape="rect" href="routing-slip.html">Routing Slip</a>, where each endpoint is separated by a delimiter.</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[public class MyDynamicRouter {
-
-    @Consume(uri = &quot;activemq:foo&quot;)
+    @Consume(uri = "activemq:foo")
     @DynamicRouter
-    public String route(@XPath(&quot;/customer/id&quot;) String customerId, @Header(&quot;Location&quot;) String location, Document body) {
+    public String route(@XPath("/customer/id") String customerId, @Header("Location") String location, Document body) {
         // query a database to find the best match of the endpoint based on the input parameteres
         // return the next endpoint uri, where to go. Return null to indicate the end.
     }
 }
-]]></script>
-</div></div><h3 id="DynamicRouter-DynamicRouterinCamel2.4orolder">Dynamic Router in Camel 2.4 or older</h3><p>The simplest way to implement this is to use the <a shape="rect" href="recipientlist-annotation.html">RecipientList Annotation</a> on a Bean method to determine where to route the message.</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[public class MyDynamicRouter {
+</plain-text-body><h3 id="DynamicRouter-DynamicRouterinCamel2.4orolder">Dynamic Router in Camel 2.4 or older</h3><p>The simplest way to implement this is to use the <a shape="rect" href="recipientlist-annotation.html">RecipientList Annotation</a> on a Bean method to determine where to route the message.</p><parameter ac:name="">java</parameter><plain-text-body>public class MyDynamicRouter {
 
-    @Consume(uri = &quot;activemq:foo&quot;)
+    @Consume(uri = "activemq:foo")
     @RecipientList
-    public List&lt;String&gt; route(@XPath(&quot;/customer/id&quot;) String customerId, @Header(&quot;Location&quot;) String location, Document body) {
+    public List&lt;String&gt; route(@XPath("/customer/id") String customerId, @Header("Location") String location, Document body) {
         // query a database to find the best match of the endpoint based on the input parameteres
         ...
     }
 }
-]]></script>
-</div></div><p>In the above we can use the <a shape="rect" href="parameter-binding-annotations.html">Parameter Binding Annotations</a> to bind different parts of the <a shape="rect" href="message.html">Message</a> to method parameters or use an <a shape="rect" href="expression.html">Expression</a> such as using <a shape="rect" href="xpath.html">XPath</a> or <a shape="rect" href="xquery.html">XQuery</a>.</p><p>The method can be invoked in a number of ways as described in the <a shape="rect" href="bean-integration.html">Bean Integration</a> such as</p><ul><li><a shape="rect" href="pojo-producing.html">POJO Producing</a></li><li><a shape="rect" href="spring-remoting.html">Spring Remoting</a></li><li><a shape="rect" href="bean.html">Bean</a> component</li></ul><p></p><h4 id="DynamicRouter-UsingThisPattern">Using This Pattern</h4>
-
-<p>If you would like to use this EIP Pattern then please read the <a shape="rect" href="getting-started.html">Getting Started</a>, you may also find the <a shape="rect" href="architecture.html">Architecture</a> useful particularly the description of <a shape="rect" href="endpoint.html">Endpoint</a> and <a shape="rect" href="uris.html">URIs</a>. Then you could try out some of the <a shape="rect" href="examples.html">Examples</a> first before trying this pattern out.</p></div>
+</plain-text-body><p>In the above we can use the <a shape="rect" href="parameter-binding-annotations.html">Parameter Binding Annotations</a> to bind different parts of the <a shape="rect" href="message.html">Message</a> to method parameters or use an <a shape="rect" href="expression.html">Expression</a> such as using <a shape="rect" href="xpath.html">XPath</a> or <a shape="rect" href="xquery.html">XQuery</a>.</p><p>The method can be invoked in a number of ways as described in the <a shape="rect" href="bean-integration.html">Bean Integration</a> such as</p><ul><li><a shape="rect" href="pojo-producing.html">POJO Producing</a></li><li><a shape="rect" href="spring-remoting.html">Spring Remoting</a></li><li><a shape="rect" href="bean.html">Bean</a> component</li></ul><p><parameter ac:name=""><a shape="rect" href="using-this-pattern.html">Using This Pattern</a></parameter></p></div>
         </td>
         <td valign="top">
           <div class="navigation">