论坛首页 Java企业应用论坛

Drools:规则流简介

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

规则流 <o:p></o:p>

作者: Kris Verlaenen <o:p></o:p>

<o:p> </o:p>

JBoss规则引擎中已经加入了一个新的特性,允许用户建立一个流程图来定义规则集进行评估的顺序。本文列举一些怎样使用规则流的例子。规则流将在Drools4.0版本中发布,对此特别期望的用户可以在最新的M2M3版本中看到它。JBoss规则引擎已经提供了一些功能来定义规则的执行顺序,例如salienceactivation groups等等。当处理海量的规则时,管理规则激发的顺序会变得很复杂。规则流允许你指定一个规则评估的流程。这允许你指定哪些规则应该按照先后顺序或并发的评估,指定规则评估的先决条件等等。这里有规则流的两个例子:<o:p></o:p>

<o:p> </o:p>

<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><o:p></o:p>

1: 图中的规则流显示了一个两个规则组简单的先后顺序执行流程,确认在处理订单之前要先对订单进行检查。<o:p></o:p>

 
<o:p></o:p>

2: 更高级的规则流显示了并发、条件控制(例如处理订单的规则集只有在订单检查没有发现问题后才会执行)和循环的概念<o:p></o:p>


JBoss
规则引擎IDE已经扩展以支持建立这些规则流:<o:p></o:p>

* 有一个新的编辑器用来建立规则流文件(*.rf,如下图所示。当你保存rf文件时,一个关联的模型文件(*.rfm)文件也同时建立,它包含了规则流的定义信息。Rf文件包含了图形信息。<o:p></o:p>

* 有一个新的建立规则流文件的向导

 

规则流定义可以被加入到RuleBase,与规则加入的方式几乎一样<o:p></o:p>


//
建立Package包含所有规则
final PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( new InputStreamReader(
getClass().getResourceAsStream( "rules.drl" ) ) );
final Package pkg = builder.getPackage();

//
建立一个包含规则流的过程
ProcessBuilder processBuilder = new ProcessBuilder();
processBuilder.addProcessFromFile(new InputStreamReader(
getClass().getResourceAsStream( "ruleflow.rfm" ) ) );

//
将包与过程加入RuleBase
final RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
ruleBase.addProcess( processBuilder.getProcesses()[0]);

//
RuleBase建立一个新的working memory
final WorkingMemory workingMemory = ruleBase.newWorkingMemory();<o:p></o:p>


//
规则流可以通过startProcess开始执行<o:p></o:p>


//
在这里增加需要设置到working memory 中的元素, 然后开始
//
规则流开始执行最初的规则集
workingMemory.startProcess(1);<o:p></o:p>


使用规则流的更多细节会在不久被加入。<o:p></o:p>

<o:p> </o:p>

论坛首页 Java企业应用版

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