论坛首页 Java企业应用论坛

Drools:规则引擎与Web Services

浏览 3561 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-07-20  
 

JBoss规则引擎与Web Services <o:p></o:p>

作者: Mark Proctor <o:p></o:p>

我最近刚刚完成了一个项目,其中JBoss规则引擎通过Web Services来提供使用。因此我写下其中的一些细节。<o:p></o:p>

在这个特殊的项目中,只有有效负载(payload)中的根对象被设置,整个payload不被分成更小的关联对象设置到Working Memory中,通常这样被认为是最佳实践方式;无论怎样,我们在这里演示给你看怎样有效率的在嵌套的XML有效负载中使用‘from’

我所理解的步骤可以简单定义如下:<o:p></o:p>

  1. 为你的模型建立一个XSD<o:p></o:p>
  2. 使用JAXB's XJC产生类<o:p></o:p>
  3. 在你的XML有效负载中解包(Unmarshal),并设置root对象<o:p></o:p>
  4. 在你的规则中使用from对模型导航<o:p></o:p>
  5. 得到修改后的模型和封包(marshal<o:p></o:p>


为你的模型建立XSD

<o:p></o:p>

一开始你需要使用XSD来描述你的模式,看起来如下:

 xml 代码

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2.  <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="creditscore" targetNamespace="creditscore">  
  3.    <xs:complexType name="root">  
  4.      <xs:sequence>  
  5.        <xs:element name="division" type="xs:string"/>  
  6.        <xs:element name="occupancy" type="xs:string"/>  
  7.        <xs:element name="occupancyAdjustment" type="xs:double"/>  
  8.        <xs:element name="creditScore" type="CreditScore" minOccurs="0"/>          
  9.      </xs:sequence>  
  10.    </xs:complexType>  
  11.   
  12.  <xs:complexType name="CreditScore">  
  13.    <xs:sequence>  
  14.      <xs:element name="programGroup" type="xs:string"/>  
  15.      <xs:element name="lienType" type="xs:string"/>  
  16.      <xs:element name="division" type="xs:string"/>  
  17.      <xs:element name="score" type="xs:double"/>  
  18.    </xs:sequence>  
  19.  </xs:complexType>  
  20.   
  21.  <xs:element name="Root" type="root"/>  
  22. </xs:schema>  

Pojo

Sun网站https://jaxb.dev.java.net/可获得最新的JAXB参考实现,我使用jaxb<st1:chsdate w:st="on" isrocdate="False" year="1899" day="30" islunardate="False" month="12">2.1.3</st1:chsdate>。从命令行执行下面的命令:<o:p></o:p>

jaxb-ri-20070413\bin\xjc -p org.domain -d c:\folder MyModel.xsd  <o:p></o:p>

这建立了三个对象,ObjectFactoryRootCreditScore两个类。看起来如下:<o:p></o:p>

<o:p> </o:p>

<o:p>
java 代码
  1. @XmlAccessorType(XmlAccessType.FIELD)   
  2. @XmlType(name = "root", propOrder = {"division""occupancy""occupancyAdjustment""creditScore1""creditScore2"})   
  3. public class Root {   
  4. @XmlElement(required = true)   
  5. protected String            division;   
  6. @XmlElement(required = true)   
  7. protected String            occupancy;   
  8. protected double            occupancyAdjustment;   
  9. protected CreditScore       creditScore1;   
  10. protected List creditScore2;   
  11.   
  12. public String getDivision() {   
  13.    return division;   
  14. }   
  15.   
  16. public void setDivision(String value) {   
  17.    this.division = value;   
  18. }   
  19.   
  20. public String getOccupancy() {   
  21.    return occupancy;   
  22. }   
  23.   
  24. public void setOccupancy(String value) {   
  25.    this.occupancy = value;   
  26. }   
  27.   
  28. public double getOccupancyAdjustment() {   
  29.    return occupancyAdjustment;   
  30. }   
  31.   
  32. public void setOccupancyAdjustment(double value) {   
  33.    this.occupancyAdjustment = value;   
  34. }   
  35.   
  36. public CreditScore getCreditScore1() {   
  37.    return creditScore1;   
  38. }   
  39.   
  40. public void setCreditScore1(CreditScore value) {   
  41.    this.creditScore1 = value;   
  42. }   
  43.   
  44. public List getCreditScore2() {   
  45.    if ( creditScore2 == null ) {   
  46.        creditScore2 = new ArrayList();   
  47.    }   
  48.    return this.creditScore2;   
  49. }   
  50. }   
  51.   
  52. @XmlAccessorType(XmlAccessType.FIELD)   
  53. @XmlType(name = "CreditScore", propOrder = {"programGroup""lienType""division""score"})   
  54. public class CreditScore {   
  55.   
  56. @XmlElement(required = true)   
  57. protected String programGroup;   
  58. @XmlElement(required = true)   
  59. protected String lienType;   
  60. @XmlElement(required = true)   
  61. protected String division;   
  62. protected double score;   
  63.   
  64. public String getProgramGroup() {   
  65.    return programGroup;   
  66. }   
  67.   
  68. public void setProgramGroup(String value) {   
  69.    this.programGroup = value;   
  70. }   
  71.   
  72. public String getLienType() {   
  73.    return lienType;   
  74. }   
  75.   
  76. public void setLienType(String value) {   
  77.    this.lienType = value;   
  78. }   
  79.   
  80. public String getDivision() {   
  81.    return division;   
  82. }   
  83.   
  84. public void setDivision(String value) {   
  85.    this.division = value;   
  86. }   
  87.   
  88. public double getScore() {   
  89.    return score;   
  90. }   
  91.   
  92. public void setScore(double value) {   
  93.    this.score = value;   
  94. }   
  95. }   
  96.   

 

在你的XML有效负载中解包(Unmarshal),并设置Root对象

<o:p></o:p>

你现在可以用JAXB解包你的XML负载:<o:p></o:p>

<o:p> </o:p>

<o:p>
java 代码
</o:p>
<o:p>
  1. JAXBContextImpl jc = (JAXBContextImpl) JAXBContext.newInstance( "org.domain" );   
  2. Unmarshaller unmarshaller = jc.createUnmarshaller();   
  3. JAXBElement element = ( JAXBElement ) unmarshaller.unmarshal( new File( XML_FILE ) );   
  4. Root root = ( Root ) element.getValue();  

 

在你的规则中使用from对模型导航<o:p></o:p>


'from'
Drools4.0中是一个新的元素,它允许规则对working memory以外的数据上进行规则推论。我们可以使用‘from’对模型中的子对象进行导航<o:p></o:p>

<o:p> </o:p>

<o:p></o:p>得到修改后的模型和封包(marshal<o:p></o:p>

 

java 代码

  1. package creditscore   
  2.   
  3. import creditscore.CreditScore   
  4.   
  5. rule "Credit_Score_Adjustments_0"  
  6.    dialect "mvel"  
  7.    no-loop true  
  8. when   
  9.    r : Root( division=="wholesale",   
  10.              occupancy=="Investors" )   
  11.    cs : CreditScore( programGroup=="ACMEPowerBuyerGroup",   
  12.                     lienType=="FIRST_TD; SECOND_TD",   
  13.                     division=="Wholesale",   
  14.                     score >= 500,   
  15.                     score <= 579) from r.creditscore   
  16. then   
  17.    cs.score = cs.score + 1;   
  18.    modify(cs);   
  19. end  


<o:p> </o:p>

<o:p>
java 代码
</o:p>
<o:p>
  1. RuleBase ruleBase = RuleBaseFactory.newRuleBase();   
  2. ruleBase.addPackage( pkg );         
  3.   
  4. StatelessSession session = ruleBase.newStatelessSession();   
  5.       
  6. StatelessSessionResult results = session.executeWithResults( new Object[] { root }  );         
  7.   
  8. Root returnedRoot = ( Root ) results.iterateObjects().next();   
  9. Marshaller marshaller = jc.createMarshaller();           
  10. marshaller.marshal( new JAXBElement( new QName("org.domain""Root"), returnedRoot.getClass(), returnedRoot ), System.out );  

 

</o:p></o:p></o:p>模型现在可以使用JAXB's XJC建立。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics