擴展camel功能,使它支持SDO

背景


      camel 已經具備了通過多種方式(在camel中稱爲language )訪問exchange的header、property和body,比如
bean,constant,simple,xpath,jxpath,ognl,mvel,scripting等。這些方式可以很容易地操作exchange的內容。如果exchange中包含的內容是一個sdo實例,也就是一個DataObject,那麼camel如何去操作它呢?根據我們的理解,DataObject也是一個JavaBean,因爲jxpath 可以直接處理JavaBean,除此之外jxpath還可以處理Map,DOM,Servlet等,所以使用jxpath不就可以操作sdo了嗎?


實例分析


      下面是截取的部分exchange的內容,可以看到它的BodyType和Body。


Headers:{JMSTimestamp=1258701583453, JMSDeliveryMode=1, JMSMessageID=ID:honnom-1258701582234-0:0:1:2:1, JMSXGroupID=null,
JMSPriority=4, JMSType=null, JMSCorrelationID=null, JMSDestination=queue://in, JMSRedelivered=false, JMSReplyTo=null, JMSExpiration=0},
BodyType:com.honnom.sdo.impl.DataObjectImpl, Body:<supermarketType __type="sdo:http://www.example.com/supermarket#supermarketType" __id="0">
<Name __type="java:java.lang.String">NGS</Name><Address __type="sdo:http://www.example.com/supermarket#addressType" __id="2">
<Street __type="java:java.lang.String">ZhangJiang</Street><City __type="java:java.lang.String">ShangHai</City>
<State __type="java:java.lang.String">China</State><Zip __type="java:java.lang.String">201204</Zip></Address>
<Customer __type="sdo:http://www.example.com/supermarket#customerType" __collection="list" __collectionid="1" __id="3" __index="0">
<Name __type="java:java.lang.String">Tom</Name><Gender __type="java:java.lang.String">Man</Gender><Age __type="java:java.lang.String">15</Age>
<Fee/></Customer><Customer __type="sdo:http://www.example.com/supermarket#customerType" __collection="list" __collectionid="1" __id="4" __index="1">
<Name __type="java:java.lang.String">Jim</Name><Gender __type="java:java.lang.String">Man</Gender><Age __type="java:java.lang.String">25
</Age><Fee/></Customer><Customer __type="sdo:http://www.example.com/supermarket#customerType" __collection="list"
__collectionid="1" __id="5" __index="2"><Name __type="java:java.lang.String">Jessica</Name><Gender __type="java:java.lang.String">Woman</Gender>
<Age __type="java:java.lang.String">15</Age> <Fee/></Customer></supermarketType>


      配置camle-config.xml的路由規則:<when><jxpath>in/body/Customer[3]/Age &lt;= 16</jxpath><to uri="jms:queue:honnom" /></when> 。這個規則的意思是如果該exchange的body內容中的Customer[3]的Age的值小於或等於16,那麼會將該exchage發送到隊列honnom。

      運行結果是隊列honnom上沒有接收到任何消息,也就是說jxpath認爲該消息不符合該表達式,但從exchange的Body可以看到Customer[3]的Age值爲15,小於16 ,應該是符合jxpath表達式的。所以jxpath不能正確的路由sdo。

解決方案

 

     爲了解決這個問題,必須實現一個新的組件來支持對sdo的解析,在此命名爲camle-sxpath。實現該組件的主要內容包括如下。

     1.在camel-config.xml中新增<expath> 元素。<expath> 表示將使用camle-sxpath解析exchange。

     2.實現EXPathLanguage.java,支持expression和predicate。

     3.實現EXPathExpression.java,支持對expression和predicate的evaluate。

     4.在SDL中支持expath()方法。


實現效果

 

    將上文提到的路由規則修改爲<when><expath>in/body/Customer[3]/Age &lt;= 16</expath><to uri="jms:queue:honnom" /></when> 即可。可以在隊列honnom上接收到該消息,說明對camle-sxpath的實現初步完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章