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

为何在Drools中使用MVEL

阅读更多
 

为何在Drools中使用MVEL <o:p></o:p>

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

我目前正在努力工作以实现插件式的语言系统,它与Drools2.0中的语义模块有些类似。使用这种系统,人们可以用任何他们喜欢的语言来编写Drl语言实现,可以用这种语言建立他们的断言、返回值、Eval和推论。我们将支持两种语言实现:JavaMVELhttp://mvel.codehaus.org/当然大家问的第一个问题会是为什么选择MVEL而不是GroovyJython等等,我将原因列举如下:<o:p></o:p>

  • 反射/字节码(JIT)编译和执行模式<o:p></o:p>
    • 对于大型系统,我们需要避免产生过多的字节码,但是对于性能敏感区域字节码仍然是一个选择<o:p></o:p>
  • 快速反射模式<o:p></o:p>
    • 我们最开始使用自己的语言JFDI,它被设计成一个简单并且快速的基于反射的语言,核心是所有的工作在编译时已经完成,运行时只是一系列的反射调用。这一设计已经完全在MVEL中实现,因此它的反射性能非常好。而其它语言放弃反射模式使用字节码来获得合理的性能。<o:p></o:p>
  • 插件式转换器<o:p></o:p>
    • 字典式转换太慢,MVEL可以通过提供的转换器直接解决这个问题,这样我们可以用数组提升性能。<o:p></o:p>
  • 规模<o:p></o:p>
    • MVEL 当前小于 350K<o:p></o:p>
  • 自定义的语言扩展<o:p></o:p>
    • MVEL扩展了语言,通过特殊代码块嵌入以支持对规则友好的构建。因此我可以将“modify (person) ( age += 1, location = "london" )”作为一个事务模块看待,这样我可以在整个模块的前后运行拦截机制。这使得宏的应用更为简单,我们可以定义我们自己的关键字并将它扩展到MVEL代码中。<o:p></o:p>
  • 静态类型/推断类型或者动态模式<o:p></o:p>
    • 变量可以被无类型化并完全动态进行<o:p></o:p>
    • 变量可以是静态类型或者类型能够被推断,支持Casting<o:p></o:p>
    • 对于类型模式可以选择验证器,不允许动态变量并且确认所有类型和方法调用都是正确的,这有助于:<o:p></o:p>
      • 编制时间校验器<o:p></o:p>
      • 代码补完<o:p></o:p>
      • 重构<o:p></o:p>
  • 支持可配置的语言特性<o:p></o:p>
    • 语言特性可以被关闭<o:p></o:p>
    • 我们不想在“then”部分强制使用流结构,没有‘if’‘switch’等等。规则应该是宣告式的,‘何时做那件事’而不是‘何时可能做那件事’<o:p></o:p>

MVEL遵从BSF(脚本语言框架),不久也将会支持ELJSP 2.0 表达式标准实现)。MVEL已经是EL的超集,但是它仍然不支持一些深奥的特性如用不同的方式表达等式

<o:p>补充一点:MVEL对比OGNL在某些情况下有10倍以上的性能提升</o:p>

<o:p> </o:p>

分享到:
评论
2 楼 hxpwork 2007-07-22  
要看你对返回值的期待是什么,如果指的是应用程序获得规则引擎执行后的结果。那可以通过Query命令从Working Memory中查询。另外被设置到规则引擎中的对象其实保留的是引用,也就是说,引擎对对象的修改将同时反映到应用的对象中。这也是一种返回值的方式。
1 楼 ahu05zhang 2007-07-22  
愚昧的问一下,Drools规则里的动作可以有返回值吗

相关推荐

    规则引擎Drools使用手册(中文)

    - **WorkingMemory创建方式变更**:在Drools 4.0中引入了StatefulSession和 StatelessSession两种不同的会话类型,以取代原来的单一WorkingMemory类型。 - **WorkingMemory操作方法变更**:为了避免关键字冲突,部分...

    mvel2-2.1.0.drools16.jar

    mvel2-2.1.0.drools16.jar mvel2-2.1.0.drools16.jar

    drools使用的jar包

    drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行官方drools-distribution-7.7.0.Final drools使用的jar包,运行...

    Drools规则引擎使用demo

    Drools是一款强大的规则引擎,由Red ...通过这个"Drools规则引擎使用demo",你可以学习如何配置、加载规则,以及如何在Java应用程序中使用Drools进行规则的执行和事实的管理。这将为你构建智能决策系统提供坚实的基础。

    Drools4.0官方使用手册(中文).pdf

    ### Drools4.0新特性概览 Drools4.0是继Drools3.0.x...总的来说,Drools4.0的更新为业务规则处理提供了更强大、灵活且高效的工具集,同时也要求开发者在迁移过程中对代码进行适当的调整,以充分利用新版带来的优势。

    drools规则引擎4.0中文使用手册

    而在Drools 4.0.x中,则需要使用`rulebase.newStatefulSession()`创建有状态的Rule Session。 - **WorkingMemory操作**:为了避免关键字冲突,部分WorkingMemory的操作方法名称发生了改变,例如`assertObject()`...

    Drools7 demo

    如果你在使用过程中遇到任何问题,这个示例项目将为你提供参考,帮助你更好地理解和应用Drools7的功能。通过研究这个示例,你可以学习如何创建、加载和执行规则,以及如何利用Drools7的新特性来解决实际的业务挑战。

    drools的简单入门案例.doc

    在给出的例子中,引入了 `drools-bom`、`drools-compiler` 和 `drools-mvel` 的 jar 包,以及 `logback-classic` 作为日志处理库。`drools-bom` 是 Drools 的 Bill Of Materials(BOM),它定义了所有依赖的版本,而...

    drools6.0的实例

    在drools 6.0中,你可以使用Java、MVEL或Groovy语法来编写规则。 规则的基本结构包括三个部分:LHS(左-hand side,即事实),RHS(右-hand side,即动作)和条件。LHS定义了规则触发的条件,当这些条件满足时,RHS...

    drools4.0 使用相关的jar包

    antlr-runtime.jar drools-compiler.jar drools-core.jar drools-decisiontables.jar drools-jsr94.jar droolsService.jar jsr94.jar jxl.jar mvel.jar xpp3.jar

    Drools最小jar包依赖

    Drools是一款强大的规则引擎,它允许开发者在Java应用程序中嵌入复杂的业务规则。这个“Drools最小jar包依赖”是指为了启动和运行一个基本的Drools项目,所需要的一些核心库。这些jar包提供了Drools的核心功能,使得...

    Packt.Drools.Developers.Cookbook.Jan.2012

    6. **最佳实践与案例研究**:分享了在不同行业和场景中使用Drools的成功案例,以及推荐的最佳实践。 ### 结论 《Packt.Drools.Developers.Cookbook.Jan.2012》是一本全面而深入的资源,对于希望利用JBoss Drools...

    drools中Fact的equality modes.doc

    在 drools 中,事实(Fact)是业务逻辑中的实体或对象,它们被插入到工作内存(Working Memory)中,供规则引擎进行匹配和处理。本文将详细讨论 drools 中的事实平等模式(equality modes),以及如何配置和实现这些...

    Drools4.0官方使用手册中文

    ### Drools 4.0 官方使用手册中文版概览 #### 一、Drools 4.0 的新特性介绍 ##### 1.1 语言表达式增强 Drools 4.0 在语言表达式方面进行了大幅度的改进,使得规则编写更加灵活和高效。以下是一些显著的变化: - ...

    drools语法详解.doc

    使用 `import` 命令引入需要在规则中使用的类,如 `import com.sample.DroolsTest.Message;`。这使得你可以在规则中直接使用这些类的实例和方法,而无需全限定名。 3. **全局变量(Global)**: `global` 关键字...

    DROOLS语法详解.txt

    为了在规则执行过程中使用全局变量,需要在工作内存中设置相应的值: ```java List list = new ArrayList(); WorkingMemory wm = rulebase.newStatefulSession(); wm.setGlobal("myGlobalList", list); ``` #### ...

Global site tag (gtag.js) - Google Analytics