jboss esb基于Drools的Content Based Routing

转自: http://www.jbosschina.org/thread-255-1-1.html
找了好久才找到jboss soa 基于内容的路由,拷贝过来和大家一起分享一下。

基于Drools的Content Based Routing

ContentBasedRouting,  Drools,  JBossESB,  CBR,  MessageFilter
1.
JBossESB中,基于内容的路由器(CBR)使用JBoss Rules作为它的规则评估引擎。JBossESB通过以下三步整合Drools

制定一个路由ruleSet,使用JBoss Rules DRL实现的


规则引擎使用的数据是ESB消息内容。ESB的消息内容可以是序列化的xml或者对象。


规则引擎处理后的结果作为目标服务。

当一个消息发送到CBR,一个特定的ruleSet就会对消息内容进行评估然后返回一系列服务目标。下面将会讨论规则集会怎么被选定,消息内容怎么评估以及怎么处理目标结果。
2.

 

JBossESB包装了三种略有不同的路由动作类。每个动作类都实现了一种企业整合模式。JbossESB Wiki中包含了关于企业整合模式的更多详细信息。

 

 

   org.jboss.soa.esb.actions.ContentBasedRouter

 

 

    基于内容路由方式的实现。它是根据消息内容以及对应的ruleSet将消息路由到一个或者多个目标服务。CBR在目标都不符合给定规则集的评估结果时会抛出异常。这样会终止任何管道处理,因此他应当是管道中最后一个动作。

 

 

org.jboss.soa.esb.actions.ContentBasedWireTap

 

 

         WireTap方式的实现。WireTap是一种企业整合方式,在这种方式中消息的副本会被发送到一个控制通道。CBR-WT和基于内容路由在功能上是相同的,但是它不会终止管道,这将使它十分适合做一种监听。

 

 

   org.jboss.soa.esb.actions.MessageFilter

 

 

    消息过滤的实现方式。这种方式适合不符合内容要求的规则可以直接扔掉的场景。CBR-MF和基于内容路由在功能上是相同的,当这种方式不会在目标都不符合给定规则集的评估结果时抛出异常。所以,这只是对消息进行了简单的过滤。

 

 

 

 

 

 

 

 

下面实现一个ContentBasedRouter的例子

 

 

 

 

 

 

 

MyJMSListenerAction.java                ------------------action class

 

 

RouteExpressShipping.java               ------------------action class
RouteNormalShipping.java                ------------------action class

SendJMSMessage.java                                                    -------------------------------测试类,发送不同的消息

SimpleCBRRules-XPath.drl                                             -------------------------------规则集
jbm-queue-service.xml                                                    -------------------------------这里是定义启动所需要的Queue
jndi.properties                                                                   -------------------------------jndi配置文件
jboss-esb.xml                                                                      -------------------------------esb配置文件
deployment.xml                                                                -------------------------------在这里定义对其他包或者服务的依赖,或者配置classloader

 

 

SampleOrder.xml                                                              -------------------------------一个简单的xml文件,包含订单信息

 


 

介绍一下整个流程:测试类读取xml中的文本信息,将其发送到服务(category="MyFirstCBRServicesESB" name="FirstCBRServiceESB" ),该服务使用了基于内容的路由action,这个action指定了规则集(ruleset)SimpleCBRRules-XPath.drl  ,规则集会对xml中包含的订单总额信息进行是否大于50的判断,从而动态路由到目标服务。目标服务各自使用RouteNormalShipping.java和RouteExpressShipping.java两个自定义动作类输出相关信息

 

 


 

 


 

 

按照上面的步骤,我们先看规则集。这个规则集处理的信息主要是xml,所有使用了xpath与描述语言

 

 


 

 

SimpleCBRRules-XPath.drl   

 

 

  1.  

  2.  

  3. #created on: Nov 8, 2006

  4. package com.jboss.soa.esb.routing.cbr

  5. #list any import classes here.

  6. #需要因对类Message和MessageType

  7. import org.jboss.soa.esb.message.Message;

  8. import org.jboss.soa.esb.message.format.MessageType;

  9. #指定xpath

  10. expander XPathLanguage.dsl

  11. #declare any global variables here.

  12. #这里是必须要定义的,返回的就是目标服务列表。

  13. global java.util.List destinations;

  14.  

  15. rule "Routing Rule using XPATH"

  16.  

  17.  when

  18.   #查看xml信息中的totalAmount是不是大于50

  19.   xpathGreaterThan "/Order/@totalAmount", "50.0"

  20.  then 

  21.  Log : "EXPRESS";

  22.   Log : "EXPRESS";

  23.   Log : "Really It's EXPRESS Shipping";

  24.   Destination : "express";

  25.  

  26. end

  27. rule "Routing Rule using XPATH less"

  28. when

  29. xpathLessThan "/Order/@totalAmount", "50.0"

  30. then

  31.  Log : "NORMAL";

  32.   Log : "NORMAL";

  33.   Log : "Really It's NORMAL Shipping";

  34.   Destination : "normal";

  35. end

复制代码

 

 



 

下面看以下jboss-esb.xml中关于service部分的配置

 


 

 

  1.  

  2. <services>

  3.  

  4. <!-- ESB CBR Service -->

  5. <service 

  6. category="MyFirstCBRServicesESB" 

  7. name="FirstCBRServiceESB" 

  8. description="ESB Listener" >

  9. <listeners>

  10. <!-- Gateway -->

  11. <jms-listener name="the-gateway"

  12. busidref="quickstartGwChannel"

  13. is-gateway="true"

  14. /> 

  15. <jms-listener name="XPathContentBasedRouter"

  16. busidref="quickstartEsbChannel"> 

  17. </jms-listener>

  18. </listeners>

  19. <actions mep="OneWay">

  20.  

  21. <action class="org.jboss.soa.esb.actions.ContentBasedRouter" name="ContentBasedRouter">

  22. <!--这一部分就是设定ruleset-->

  23. <property name="ruleSet" value="SimpleCBRRules-XPath.drl"/>

  24. <property name="ruleLanguage" value="XPathLanguage.dsl"/>

  25. <property name="ruleReload" value="true"/>

  26. <!--这一部分就是设定返回的目标,根据xml我们知道规则会返回“express”,所以就会路由到服务ExpressShippingService-->

  27. <property name="destinations">

  28. <route-to destination-name="express" service-category="ExpressShipping" service-name="ExpressShippingService"/>

  29. <route-to destination-name="normal" service-category="NormalShipping" service-name="NormalShippingService"/>

  30. </property> 

  31. </action>

  32. </actions>

  33. </service>

  34.  

  35. <!-- Normal Shipping -->

  36. <service

  37. category="NormalShipping"

  38. name="NormalShippingService"

  39. description="Normal Shipping Service">

  40. <listeners>

  41. <jms-listener

  42. name="CBRNormalShipping"

  43. busidref="CBRNormalShipping"/>

  44. </listeners>

  45. <actions mep="OneWay">

  46. <action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>

  47. <action name="displayMessageAction" 

  48. class="org.jboss.soa.esb.samples.quickstart.simplecbr.MyJMSListenerAction" 

  49. process="displayMessage" 

  50. /> 

  51. <!-- This can be replaced with notification -->

  52. <action name="route"

  53. class="org.jboss.soa.esb.samples.quickstart.simplecbr.RouteNormalShipping"

  54. process="sendResponse"

  55. /> 

  56. </actions>

  57. </service>

  58.  

  59. <!-- Express Shipping -->

  60. <service

  61. category="ExpressShipping"

  62. name="ExpressShippingService"

  63. description="Express Shipping Service">

  64. <listeners>

  65. <jms-listener

  66. name="CBRExpressFreeShipping"

  67. busidref="CBRExpressFreeShipping"/>

  68. </listeners>

  69. <actions mep="OneWay">

  70. <action name="testStore" class="org.jboss.soa.esb.actions.TestMessageStore"/>

  71. <action name="displayMessageAction" 

  72. class="org.jboss.soa.esb.samples.quickstart.simplecbr.MyJMSListenerAction" 

  73. process="displayMessage" 

  74. /> 

  75. <!-- This can be replaced with notification -->

  76. <action name="route"

  77. class="org.jboss.soa.esb.samples.quickstart.simplecbr.RouteExpressShipping"

  78. process="sendResponse"

  79. /> 

  80. </actions>

  81. </service>

  82. </services>

复制代码

 

 

 

 

你可能感兴趣的:(jboss,ESB,路由,基于内容路由)