<p>在第二章開始講Camel的路由配置以及路由經常使用模式。</p> <h3>Camel的路由配置有三種方式:</h3> <p>1.java DSL (純java方式)建立RouteBuilder</p> <p><a href="http://static.oschina.net/uploads/img/201306/02141322_TlsL.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141325_BcWq.png" width="414" height="224" /></a></p> <p>2.Spring DSL(純spring方式) </p> <p><a href="http://static.oschina.net/uploads/img/201306/02141326_P36Q.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141327_epoH.png" width="439" height="123" /></a></p> <p>3.定義bean的形式(Java+Spring)</p> <p><a href="http://static.oschina.net/uploads/img/201306/02141327_AfZO.png"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141328_Cb1c.png" width="434" height="73" /></a></p> <h3>路由經常使用模式</h3> <h4><em>1.Using a content-based router(基於內容的路由)</em></h4> <p><a href="http://static.oschina.net/uploads/img/201306/02141329_WHi6.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141331_q8JC.png" width="547" height="254" /></a></p> <p>如上圖:路由到下一個節點時須要根據文件類型來判斷是xmlOrders仍是csvOrdersks能夠經過choice…..when的形式來定義</p> <p>headerCamel的表達式經常使用的有constant,simple,header,body.</p> <p><em>from("jms:incomingOrders")       <br />.<font color="#ff0000">choice()</font>                               <br />    <font color="#ff0000">.when</font>(header("CamelFileName") <br />    .endsWith(".xml"))           <br />        .to("jms:xmlOrders")     <br />    <font color="#ff0000">.when</font>(header("CamelFileName") <br />    .endsWith(".csv"))           <br />        .to("jms:csvOrders");</em>    <br /></p> <p> </p> <h4><em>2.Using message filters(消息過濾)</em></h4> <p><a href="http://static.oschina.net/uploads/img/201306/02141331_5dM8.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141333_pQrg.png" width="496" height="159" /></a></p> <p>如上圖:若是消息(xml)order節點包含test屬性則自動過濾掉。經過filter處理,若是是xml形式的消息可用xpath來解析消息</p> <p><em><route> <br />  <from uri="jms:xmlOrders"/> <br />  <font color="#ff0000"><filter> <br /></font>    <xpath>/order[not(@test)]</xpath> <br />    <process ref="orderLogger"/> <br /><font color="#ff0000">  </filter> <br /></font></route></em></p> <h4><em>3.Using multicasting(多點廣播)</em></h4> <p><a href="http://static.oschina.net/uploads/img/201306/02141334_DNiE.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141335_FVRt.png" width="483" height="164" /></a></p> <p>如上圖,xmlOrders收到的消息要同時發送到accounting和production兩個隊列中去。經過multicast()來實現。</p> <p><em>ExecutorService executor = Executors.newFixedThreadPool(16); <br />from("jms:xmlOrders") <br />   <font color="#ff0000"> .multicast().</font>parallelProcessing().executorService(executor) <br />    .to("jms:accounting", "jms:production");</em></p> <p>注:能夠不指定線程池,系統默認會建立一個線程池大小 爲10:</p> <p><em>from("jms:xmlOrders") <br />    .multicast().parallelProcessing() <br />    .to("jms:accounting", "jms:production");</em></p> <h4><em>4.Using recipient lists(收件人列表模式)</em></h4> <p><a href="http://static.oschina.net/uploads/img/201306/02141336_P3Wu.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141336_hjv7.png" width="457" height="200" /></a></p> <p>如上圖,根據收件人列表來決定發送到哪些消息隊列中去。</p> <p><em>from("jms:xmlOrders") <br />.setHeader("customer", xpath("/order/@customer")) <br />.process(new Processor() { <br />    public void process(Exchange exchange) throws Exception { <br />        String recipients = "jms:accounting"; <br />        String customer = <br />            exchange.getIn().getHeader("customer", String.class); <br />        if (customer.equals("honda")) { <br />            recipients += ",jms:production"; <br />        } <br />        exchange.getIn().setHeader("recipients", recipients); <br />    } <br />}) <br />.recipientList(header("recipients"));</em></p> <p><strong>recipientList也支持註解的形式:</strong></p> <p><em>from("jms:xmlOrders").bean(RecipientListBean.class);</em></p> <p><em>public class RecipientListBean { <br />    <font color="#ff0000">@RecipientList <br /></font>    public String[] route(@XPath("/order/@customer") String customer) { <br />        if (isGoldCustomer(customer)) { <br />            return new String[] {"jms:accounting", "jms:production"}; <br />        } else { <br />            return new String[] {"jms:accounting"}; <br />        } <br />    }</em></p> <p><em>    private boolean isGoldCustomer(String customer) { <br />        return customer.equals("honda"); <br />    } <br />}</em></p> <h4><em>6.Using the wireTap method(消息監聽,複製)</em></h4> <p><a href="http://static.oschina.net/uploads/img/201306/02141337_3IY8.png"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://static.oschina.net/uploads/img/201306/02141338_SxxA.png" width="408" height="196" /></a></p> <p>如上圖,在消息送到目的地的過程當中對消息複製一份送到Tapdestination.</p> <p><em>from("jms:incomingOrders") <br />.wireTap("jms:orderAudit") <br />.choice() <br />    .when(header("CamelFileName").endsWith(".xml")) <br />        .to("jms:xmlOrders") <br />    .when(header("CamelFileName").regex("^.*(csv|csl)$")) <br />        .to("jms:csvOrders") <br />    .otherwise() <br />        .to("jms:badOrders");</em></p>java