Drools 5.1.1_DOC (47)

Drools 5.1.1_DOC_Drools Flow

 

4.3         不同节点类型的详细解释

 

一个规则流程是一个流程图,使用路线连接不同类型的节点。流程本身暴露了以下属性:

 

l         Id: 流程唯一的id.

l         Name: 流程显示的名字。

l         Version: 流程的版本号。

l         Package: 定义流程所在的包(命名空间)。

l         Variables: 在你的流程的执行期间,定义变量来存储数据。详情请看“数据” 章节。

l         Swimlanes: 指定负责人类任务执行的参与者。详情请看 “人类任务” 章节。

l         Exception Handlers: 当在流程中发生故障时,指定行为。详情请看“异常” 章节。

l         Connection Layout:使用线路布局(connection layout)属性,在画布上指定如何显现线路:

u       'Manual' 总是用直接从起点到终点的线(可以使用虚线)画出你的线路。

u       'Shortest path' 是相似的,但是它试图解决在起点和终点间遭遇的任何障碍,避免线交叉节点。

u       'Manhattan' 只使用水平线和垂线画线路。

 

规则流程支持不同类型的节点:

图4.4 不同类型的规则流节点

 

  1. Start事件: 规则流的起点。一个规则流应该严格地有一个开始节点,它不能有输入连接,并且应该只有一个输出连接。只要启动一个规则流,执行将在这个节点开始,并且自动连续到连接到开始节点的第一个节点,依此类推。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Triggers: 一个开始节点也可以指定附加的触发器,用于自动启动流程。例如,一个“约束”触发器,如果一个给定的规则或约束被满足,会自动启动流程,或者,一个“事件”触发器,如果发出了一个特殊事件,会自动启动流程。注意,目前在图形编辑器中不能指定这。现在只能手动更新流程XML。

l         MetaData: 相关于这个节点的元数据。

 

  1. End事件:规则流的终点。一个规则流应该有一个或多个终点节点。 终点节点应该有一个输入连接,而没有输出连接。它包括下面的属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Terminate: 一个终点节点可以终止整个流程(默认),或只终止该路径。如果流程被终止,在这个规则流中仍然是活动的所有节点被取消。非终止终点节点(Non-terminating End nodes)只是结束了某些路径,而其他并联路径仍然继续。

l         MetaData: 相关于这个节点的元数据。

 

  1. 规则任务 (或RuleFlowGroup): 表示一组需要被计算的规则。当达到该节点时,这些规则被计算。一个规则流组节点应该有一个输入连接和一个输出连接。在规则的首部(header)中使用ruleflow-group属性,规则可以成为一个特殊规则流组的一部分。当达到在规则流中的一个规则流组节点时,引擎将开始执行是相应ruleflow-group(如果有)的一部分的规则。如果在这个规则流组中没有更多的活动规则,执行将自动连续到下一个节点。这意味着,在一个规则流组中执行期间,由于其他规则使事实改变,属于当前活动规则流组的新活动可能被添加到议程(Agenda)。注意,如果规则流遭遇一个在那时没有活动规则的规则流组时,它将连续到下一个节点。如果规则流组已经被激活,规则流组将保持活动,并且如果规则流组的所有活动规则已经完成,执行才会继续。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         RuleFlowGroup: 规则流组的名字,表示这个规则流组节点的规则集合。

l         Timers: 链接到这个节点的计时器。详情请看“计时器”章节。

l         MetaData: 相关于这个节点的元数据。

 

  1. 分枝门(或Split):  允许你在规则流中创建分枝。一个分枝节点应该有一个输入连接和两个或多个输出连接。 目前支持三种分枝节点:

 

l         AND 指控制流将同时在所有输出连接继续。

l         XOR 指将精确地选择其中一个输出连接。通过计算链接到每个输出连接的约束来做出决定。约束使用与规则左手边相同的语法被指定。求值为true的最低优先级数的约束被选择。注意,在运行时,你应该确保至少有一个输出连接求值为true (如果在运行时规则流不能找到至少一个输入连接,它将抛出一个异常)。例如,你可以使用一个始终为true(默认)的线路,它使用一个高优先级数指定,如果没有获得其他线路时,它总是应该发生。

l         OR 指条件求值为true的所有输出连接被选择。条件相似于XOR分枝,除无优先级被考虑外。注意,在运行时,你应该确保至少有一个输出连接会被求值为true,因为如果不能确定一个输出连接,规则流会抛出一个异常。

 

它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Type: 分枝点的类型,即,AND,XOR,或OR(见上)。

l         Constraints: 链接到每个输出连接的约束(在(X)OR分枝情况下)。

l         MetaData: 相关于这个节点的元数据。

 

  1. 收敛门 (或Join):  允许你同步多个分枝。联合节点应该有两个或多个输入连接和一个输出连接。目前支持四种分枝:

 

l         AND 指在继续之前将等待,直到所有输入分枝被完成。

l         XOR 指一旦它的其中一个输入分枝已经完成,它马上继续。如果超过了一个的输入连接触发它,它将触发每个这些触发的下一个节点。

l         Discriminator(鉴别器) 指如果它的其中一个输入分枝已经完成,它将继续。 完成的其他输入分枝被注册,直到所有线路已经完成。在这点时,节点将被重置,因此 在它的输入分枝已经被完成一次时,能够再次触发它。

l         n-of-m 指它的m中的n输入分枝已经被完成,它将继续。变量n可以是被硬编码为一个固定值,或引用流程变量,其将包含了等待的输入分枝数。

 

它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Type: 分枝点的类型,即,AND,XOR,或Discriminator(见上)。

l         n: 等待的输入分枝数(在一个n-of-m联合的情况下)。

l         MetaData: 相关于这个节点的元数据。

 

  1. State:  代 表一个等待状态。一个状态应该有一个输入连接,并且有一个或多个输出连接。对于每个输出连接,可以指定一个规则约束,它定义流程在这个状态应该等待多久, 然后再继续。例如,在一个订单录入应用程序中的一个约束,可以指定流程应该等待,直到在给定的订单中没再发现有错误。约束使用与规则左手边相同的语法指 定。当达到在规则流中的一个状态,引擎将检查关联的约束。如果其中一个约束直接求值为true,流将立即继续。否则,如果其中一个约束以后被满足,例如在插入、更新或从工作内存中删除一个事实时,流将继续。使用ksession.signalEvent("signal", "name"),也可以手动通知让它的进程到下一个状态,在这里"name" 应该是被选择线路的约束,或者是应该移动到的节点的名字。一个状态包含下面的属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Constraints: 定义在什么时候流程可以离开这个状态,继续每个输出连接。

l         Timers: 链接到节点的计时器。详情请看“计时器”章节。

l         On-entry和on-exit动作: 分别执行进入或退出这个节点的动作。

l         MetaData: 相关于这个节点的元数据。

 

  1. 可重用子流( SubFlow): 表示从这个流程内调用另外一个流程。一个子流程节点应该有一个输入连接和一个输出连接。当达到规则流程中的一个SubFlow节点时,引擎将利用给定的id启动流程。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         ProcessId: 应该被执行的流程id。

l         Wait for completion: 如果这个属性为true,要是那个SubFlow流程终止了它的执行(完成或中止),SubFlow节点才会继续;否则在启动子流程后,它将立即继续。

l         Independent: 如果这个属性为true,子流程作为一个独立的流程被启动,这意味着如果这个流程达到一个End节点时,SubFlow流程不会被终止;否则,流程的终止(或中止)会取消活动的子流程。

l         Parameter in/out mapping: 一个SubFlow节点也可以定义变量的in-和out-映射。当启动流程时,在这个流程中的变量的值,与在"in"映射中给定的变量名字会被用来作为参数(用关联的参数名字)。当子流程已经完成时,在子流程中的变量的值,与在"out"映射中给定的变量名字会被复制成这个流程的变量。注意,只当"Wait for completion"被设置为true时,你才可以使用"out"映射。

l         Timers: 链接到节点的计时器。详情请看“计时器”章节。

l         On-entry和on-exit动作: 分别执行进入或退出这个节点的动作。

l         MetaData: 相关于这个节点的元数据。

 

  1. 脚本任务(Action):表示在这个规则流中的将被执行的一个动作。一个动作节点应该有一个输入连接和一个输出连接。关联的动作指定应该执行什么,方言用于编码动作(即,Java或 MVEL)和实际动作的代码。 这个代码可以访问任何全局变量,指向KnowledgeHelper对象的预定变量 drools(例如,它可以通过调用drools.getWorkingMemory()检索工作内存),和引用ProcessContext对象的变量 kcontext (例如,它可以被用来访问当前的 ProcessInstance或NodeInstance,获取和设置变量)。当到达在规则流中的一个动作节点时,它将执行动作,然后继续下一个节点。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Action: 关联这个动作节点的动作。

l         MetaData: 相关于这个节点的元数据。

 

  1. Timer事件: 表示一个定时器,它可以在给定的一段时间后触发一次或多次。一个定时器节点有一个输入连接和一个输出连接。计时器延迟指定计时器在触发首次之前应该等待多长的时间(毫秒)。计时器周期指定在两个连续触发之间的时间。0周期意味着计时器只应被触发一次。当到达在规则流中的计时器节点,它将启动关联的计时器。如果计时器节点被取消(例如,完成或中止了流程),计时器被取消。详情请参考 “计时器”章节。计时器节点包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Timer delay: 在触发首次之前应该等待的延迟(毫秒)。

l         Timer period: 在两个连续触发之间的周期(毫秒)。如果周期为0,计时器只应被触发一次。

l         MetaData: 相关于这个节点的元数据。

 

  1. 错误事件 (Fault): 一 个故障节点可以被用于表明在流程中的异常条件。它应该有一个输入连接,而没有输出连接。当到达在规则流中的一个故障节点时,它将用给定的名字抛出一个故 障。流程将搜索能够处理这类故障的相应异常处理程序。如果没有发现故障处理器,流程实例将会被中止。一个故障节点包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         FaultName: 故障名字。这个名字用于搜索能够处理这类故障的相应异常处理程序。

l         FaultVariable: 变量名字,包含与这个故障关联的数据。这个数据也被传送给异常处理程序(如果发现一个)。

l         MetaData: 相关于这个节点的元数据。

 

  1. (消息) Event:  一个事件节点可以被用来响应在流程执行期间的内部或外部事件。一个事件节点应该没有输入连接,且有一个输出连接。它指定预期的事件类型。只要好个事件类型被侦测到, 连接到这个事件节点的节点将会被触发。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         EventType: 预期的事件类型。

l         VariableName: 变量名字,在这个事件发生时,它包含与这个事件关联的数据(如果有)。

l         Scope: 一个事件可以只用于侦听内部事件,即,使用processInstance.signalEvent(String type, Object data)直接发信号通知这个流程实例的事件。当一个事件节点被定义为外部时,它也将侦听使用workingMemory.signalEvent(String type, Object event)直接发信通知流程引擎的外部事件。

l         MetaData: 相关于这个节点的元数据。

 

  1. 用户任务 (Human Task):  流程也可以调用需要由人类参与者执行的任务。一个人类任务节点代表由一个人类参与者执行的一个原子任务。它应该有一个输入连接和一个输出连接。人类任务节点可以用来与泳道(Swimlanes)组合,便于指派人类任务给相似的参与者。详情请参考“人类任务”章节。一个人类任务节点实际上只不过是一个特殊类型的工作项目节点("Human Task"类型)。人类任务节点包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         TaskName: 人类任务的名字。

l         Priority: 一个整数,指明人类任务的优先级。

l         Comment: 与人类任务关联的注释

l         ActorId: 负责执行人类任务的参与者id。一个参与者id的列表可以用逗号(',')作为分隔符。

l         Skippable: 指定是否人类任务可以被跳过,即,是否参与者可以决定不执行该任务。

l         Content: 与这个任务关联的数据。

l         Swimlane: 这个人类任务的泳道是一部分。泳道使分配多个人类任务给相同的参与者变得容易。有关如何使用泳道的详情,请看人类任务章节。

l         Wait for completion: 如果这个属性为true,如果人类任务已经被终止(即,被完成或达到任何终端状态),该人类任务节点才会继续;否则,在创建该人类任务后,它会立即继续。

l         On-entry and on-exit actions: 分别执行进入或退出这个节点的动作。

l         Parameter mapping: 允许复制流程变量的值到人类任务的参数。当创建人类任务,值就会被复制。

l         Result mapping: 允许复制人类任务的结果参数的值到一个流程变量。当人类任务完成,值就会被复制。注意,当"Wait for completion"被设置为ture时,你才能够使用结果映射。一个人类任务有一个结果变量"Result",它包含由人类参与者返回的数据。变量"ActorId"包含那个实际执行任务的参与者id。

l         Timers: 链接到节点的计时器。详情请参考“计时器”章节。

l         MetaData: 相关于这个节点的元数据。

 

  1. 子流程 (Composite): 一个复合节点是一个包含了其他的节点的节点,因此,它充当了节点容器。它不仅允许在这种复合节点内嵌入部分流程,而且也允许附加变量和在这个容器内所有节点可访问的异常处理程序的定义。一个复合节点应该有一个输入连接和一个输出连接。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         StartNodeId:  当这个节点被触发时,应该被触发的节点的id(在这个节点容器内)。

l         EndNodeId: 在这个节点内,表示该流终点的节点的id(在这个节点容器内)。当完成这个节点时,复合节点也将被完成,并且触发它的输出连接。在这个复合节点内部的所有其他的节点会被取消。

l         Variables: 在这个节点执行期间可以定义附加变量来存储数据。详情请看“数据”章节。

l         Exception Handlers: 指定当在这个节点容器内发生故障时的行为。详情请看“异常”章节。

 

  1. 多个实例(ForEach):  一个ForEach节点是一个特殊类型的复合节点,它允许你多次执行包含的流程,在一个集合中的每个元素一次。一个ForEach节点应该有一个输入连接和一个输出连接。一个ForEach节点等待内嵌的每个集合元素的流程完成,然后再继续。它包含以下属性:

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         StartNodeId:  在集合中的每个元素应该被触发的节点的id(在这个节点容器内)。

l         EndNodeId: 在这个节点内,表示该流终点的节点的id(在这个节点容器内)。当完成这个节点时,对于当前集合元素的ForEach节点也将被完成。如果集合被用尽,输出连接被触发。在这个复合节点内部的所有其他执行节点会被取消。

l         CollectionExpression:  一个变量的名字,代表应该被遍历元素的集合。集合类型应该是java.util.Collection。

l         VariableName: 变量名字,包含来自集合的当前元素。它授予在复合节点内部的节点访问被选择的元素。

 

  1. WorkItem (Service Task): 代表在这个流程中应该被执行的一个(抽象)的工作单元。所有在流程引擎外部被执行的工作,应该用一个WorkItem节 点表示(以一个声明方式)。不同类型的工作项目被预定义,例如,发送电子邮件,记录一条消息,等等。用户可以使用唯一的名字和定义与这个工作类型相关联的 参数(输入)和结果(输出),定义特殊域工作项目。有关在你的流程中如何定义和使用工作项目的例子的详细解释和说明,请参考“特殊域流程”章节。当达到流 程中的一个WorkItem节点时,关联的工作项目被执行。一个WorkItem节点应该有一个输入连接和一个输出连接。

 

l         Id: 节点的id(在一个节点容器内,它是唯一的)。

l         Name: 节点的显示名字。

l         Wait for completion: 如果这个属性为true,要是创建的工作项目已经终止(完成或中止)它的执行,WorkItem节点才会继续;否则,在启动工作项目后,它将立即继续。

l         Parameter mapping: 允许复制流程变量的值到工作项目的参数。当创建工作项目,值就会被复制。

l         Result mapping: 允许复制工作项目的结果参数的值到一个流程变量。每种类型的工作都可以定义在工作项目完成后会(潜在地)被返回的结果参数。一个结果映射可以用于复制给定结果参数的值给在这个流程中的给定变量。例如,"FileFinder"工作项目,返回在结果参数的文件内匹配给定搜索条件的文件的一个列表。然后这个文件列表可以被绑定到在流程内使用的一个流程变量。当工作项目完成,值才会被复制。注意,当"Wait for completion"被设置为ture时,你才能够使用结果映射。

l         On-entry and on-exit actions: 分别执行进入或退出这个节点的动作。

l         Timers: 链接到节点的计时器。详情请参考“计时器”章节。

l         Additional parameters: 每种类型的工作项目都可以定义有关于那种工作类型的附加参数。例如,“Emai”工作项目定义诸如From,To, Subject 和Body的附加参数。用户可以直接为这些参数提供值,或者定义一个参数映射,它将复制在这个流程中的给定变量的值到给定的参数;如果两个都被指定,映射具有优先权。String类型的参数可以使用 #{expression} ,在字符串中嵌入一个值。当创建工作项目时,该值会被检索,而且替代表达式将用在变量上调用toString() 的值替换。表达式可以只是一个变量的名字(在这个情况下,它解析为该变量的值),但也可以是更高级的MVEL表达式,例如,#{person.name.firstname}。

l         MetaData: 相关于这个节点的元数据。

posted @ 2011-11-09 17:26  skyme  阅读(563)  评论(1编辑  收藏  举报