`
hxpwork
  • 浏览: 111331 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

Drools:规则引擎与Web Services

阅读更多
 

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建立。
分享到:
评论

相关推荐

    kie drools6.4 web规则引擎tomcat7配置

    kie drools的Web规则引擎可以与其他Java EE应用服务器(如JBoss EAP)或云环境(如OpenShift)一起使用,但这里我们专注于在Tomcat 7上的部署。 总的来说,kie drools 6.4与Tomcat 7的结合为业务规则管理提供了高效...

    RulEST:流口水规则引擎 RESTful Web 服务

    一个drools规则引擎RESTful Web Services。目的是让用户可以通过resuful web service来使用drools规则引擎。 要求 Java JDK 1.7 Gradle 构建和运行 获取源代码 $ git clone ...

    基于规则引擎的消息中心模块的设计与实现

    - **规则引擎集成**:论文引入了Drools规则引擎,并将其扩展为一个独立的项目Xdrools。Xdrools不仅作为消息中心模块的核心引擎,还覆盖了物流平台业务逻辑层的部分公共非功能性需求。 - **API设计**:为了方便开发者...

    Drools4.0官方使用手册中文

    2.5. Drools 规则引擎 22 2.5.1. 概述 23 2.5.2. 编制 24 2.5.3. RuleBase 30 2.5.4. WorkingMemory 和有状态/无状态Sessions 33 2.5.5. StatefulSession 38 2.5.6. StatelessSession 40 2.5.7. Agenda 41 2.5.8. ...

    帮助网友解决一个drools的问题

    drools 是一个强大的规则引擎,它基于Java语言,主要用于实现业务规则自动化。在这个场景中,网友遇到的问题可能与Drools的使用、配置或者规则编写有关。由于没有具体的问题描述,我们将从一般的角度来探讨Drools的...

    JBPM流程引擎设计 工作流资料

    5. **规则集成**:JBPM集成了Drools规则引擎,使得业务流程可以灵活地根据预定义的规则进行决策。这使得流程的执行不仅依赖于固定逻辑,还能动态响应业务环境的变化。 6. **监控与调试**:JBPM提供了强大的监控工具...

    jbpm4.4最小依赖jar包

    2. **Drools**:jbpm4.4中的规则引擎使用了Drools 5.x版本,它是一个强大的规则推理引擎,可以将业务逻辑以规则的形式表达,便于管理和维护。Drools提供了规则定义、规则运行时管理以及规则执行报告等功能。 3. **...

    tomcat 部署 Workbench 和 kie-server tomcat

    这里我们将基于drools 7.10.0版本进行操作,drools是一个强大的规则引擎,kie-server则是其服务接口。 首先,理解Tomcat 8.5:它是Apache Tomcat服务器的一个版本,符合Java Servlet 4.0、JavaServer Pages (JSP) ...

    JBPM4.4 lib

    8. **jbpm-drools**:集成了Drools规则引擎,用于在流程中执行业务规则。 这些库文件对于理解和使用JBPM4.4至关重要,它们提供了完整的业务流程管理功能,包括流程建模、执行、监控、规则处理、任务分配以及与各种...

    jbpm需要的jar包

    3. **规则引擎**:jbpm集成了Drools规则引擎,使得业务流程可以根据预定义的规则进行决策。这使得开发者可以将复杂的业务逻辑以规则的形式表达,从而与流程分离,便于维护。 4. **持久化机制**:jbpm使用JPA(Java ...

    eclipse相关插件安装步骤

    在本文中,我们将详细介绍如何在Eclipse IDE中安装一系列关键插件,这些插件对于Java开发者,特别是专注于Web开发、Maven项目管理、版本控制、ORM框架和规则引擎的开发者非常有用。以下是一步步的安装步骤: 1. **...

    jbpm-kie-services-6.1.0.Beta4.zip

    KIE Services允许开发人员通过RESTful接口或者Java API来与jBPM引擎进行通信,实现流程的启动、查询、干预和终止等功能。 【voms-api-java.zip】描述的是VO(Virtual Organization)Management System(VOMS)的...

    jbpm4基本jar包

    4. **规则引擎**:jbpm4集成了Red Hat的JBoss Drools规则引擎,使得流程决策可以根据预定义的业务规则动态调整。 5. **事件处理**:jbpm4支持事件驱动的流程,如超时事件、信号事件等,使得流程可以根据外部条件...

    jbpm-3.1.2.zip_jbpm_jbpm 3.1.2_jbpm-3.1.2.rar_jbpm3.1.2_工作流

    此外,熟悉Drools规则引擎的使用,能帮助开发者更好地利用jBpm实现智能决策。 总之,jBpm 3.1.2是业务流程自动化领域的一个强大工具,它为开发高效、灵活的工作流应用提供了坚实的基础。无论是对于企业内部的流程...

    jbpm开发指南

    5. **规则引擎**: 结合Drools,提供业务规则的管理和服务,使流程决策更加灵活。 ### 三、jbpm开发环境搭建 要开始jbpm开发,首先需要安装以下组件: 1. **Eclipse IDE**: 集成jbpm插件,提供图形化流程设计。 2....

    MVNO技术方案

    - **规则引擎**:使用JDK的JS引擎或Drools等工具进行业务规则管理。 - **工作流**:基于Activiti或Jbpm实现业务流程自动化。 - **数据库**:选用MySQL作为主数据库。 - **应用服务器**:使用Tomcat。 - **负载均衡**...

    jbpm-常用的所有jar包

    9. **drools-** 开头的jar包:Drools是Red Hat的规则引擎,jbpm与其紧密集成,用于在流程中执行业务规则。 10. **guvnor-** 开头的jar包:Guvnor是jbpm的一部分,提供了规则和流程资产的版本控制、管理和部署功能。...

    JBPM JAR包1

    5. **规则集成**: JBPM集成了Drools规则引擎,允许在流程中嵌入业务规则,实现灵活的决策逻辑。 6. **事件处理**: 支持事件驱动的流程,可以捕获和处理系统内外的事件,如定时事件、信号事件等。 7. **监控和管理*...

    jbpm相关的jar

    jbpm还包括了一个规则引擎(Drools),这是Red Hat的一个规则管理系统,能够处理复杂的业务规则。在流程执行过程中,可以通过规则引擎进行决策判断,根据当前流程状态和输入数据动态调整流程行为。 为了便于集成和...

Global site tag (gtag.js) - Google Analytics