扩展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的实现初步完成。

你可能感兴趣的:(java,xml,bean,jms,Exchange)