Drools 5.1.1_DOC (53)
Drools 5.1.1_DOC_Drools Flow
第9章 特殊域流程
我们统一的规则和流程框架的目标之一是允许用户利用在一个具体应用域中简化了开发的特殊域扩展扩充默认的编程结构。虽然Drools提供用于创建特殊域规则语言的结构已经有一段时间了,而这个教程描述则是通向特殊域流程的第一步。
大多数流程语言提供一些通用动作(节点)结构,允许插入自定义用户动作。然而这些动作通常是低级的,用户需要编写定制代码用于实现应该被合并在流程中的工作。该代码也被紧密连接到一个特定的目标环境,所以使在不同的上下文中重用流程变得困难。
特 殊域语言针对一个具体的应用域,因此可以提供与用户设法解决的问题紧密相关的结构。这使该流程容易理解和自文档化(self-documenting)。 我们会展示给你如何定义特殊域工作项(work item )——代表需要被执行的原子工作单位。这些工作项以一种声明的方式指定应该在一个流程的上下文中被执行的工作,即,在一个更高的级别上(非代码)指定应该 执行什么 (而不是为什么),并且隐藏实现的细节。
所以我们希望工作项是:
-
特殊域的
-
声明式的(是什么,而非为什么)
-
高级的(非代码)
-
可定制上下文的
用户可能轻松地定义他们自己的特殊域工作项的集合,并且集成它们在我们的流程语言中。例如下图所示的,在一个医疗上下文中的一个流程例子。该流程包括特殊域工作项,用于订购护理任务(如,测血压),开处方药,和通知保健提供者。
让 我们通过展示给你如何包括一个简单的用于发送通知的工作项开始。一个工作项用声明的方式表示一个工作的原子单位。通过唯一的名字和附加参数定义它,这些参 数可以被用来更详细描述工作。工作项在被执行后也可以返回信息,指定结果。因此,我们的通知工作项可以被定义,使用一个带四个参数的工作定义,并且没有结 果:
Name: "Notification"
Parameters
From [String]
To [String]
Message [String]
Priority [String]
所 有工作定义必须在项目的类型路径中的一个或多个文件配置中指定,在那儿所有属性用名字-值对指定。参数和结果被映射,并且每个参数的名字也被映射为期望的 数据类型。注意,这个匹配文件也包括一些附加用户界面信息,如图标和工作项的显示名字。(为了在配置文件中读取,我们使用了MVEL,它允许我们做更高级 的配置文件)。我们的 MyWorkDefinitions.conf文件看起像这样:
import org.drools.process.core.datatype.impl.type.StringDataType;
[
// the Notification work item
[
"name" : "Notification",
"parameters" : [
"Message" : new StringDataType(),
"From" : new StringDataType(),
"To" : new StringDataType(),
"Priority" : new StringDataType(),
],
"displayName" : "Notification",
"icon" : "icons/notification.gif"
]
]
Drools 配置API可以被用来为你的项目注册工作定义文件,使用drools.workDefinitions属性,它表示包含工作定义的文件的一个列表(使用空 格分开)。例如,在你的项目的META-INF目录中包含一个 drools.rulebase.conf 文件,添加下面的行:
drools.workDefinitions = MyWorkDefinitions.conf
一旦你的工作定义已经被创建和注册,我们就可以在你的流程中开始使用它。流程编辑器在调色板包含了一个间隔部分,显示已经为该项目(project)定义的不同的工作项(work items)。

使用拖放操作,在你的流程内可以创建一个通知节点。使用属性视图可以填写属性。
除了由这个工作项定义的属性之外,所有工作项还有以下三个属性:
-
Parameter Mapping(参数映射):允许你映射在流程中的一个变量的值到工作项的一个参数。这允许你根据实际流程实例的当前状态自定义 工作项(例如,通知的优先权priority可以由某些特殊流程的信息决定)。
-
Result Mapping(结果映射):允许你映射一个结果(一旦一个工作项已经被执行,返回的)到流程的一个变量。这允许你在注射的剩余部分使用结果。
-
Wait for completion(等待完成):默认时,在继续流程之前,流程等待,直到请求的工作项已经被完成。在工作项已经被请求之后,它也可以通过设置 "wait for completion"为false,立即继续(不等待结果)。
Drools 引擎包含了一个WorkItemManager,其负责在当需要时执行工作项。 WorkItemManager负责委托工作项给 WorkItemHandlers,由它执行工作项,并在完成工作项时通知WorkItemManager。为执行notification工作项,应该 创建一个NotificationWorkItemHandle(实现WorkItemHandler接口):
package com.sample;
import org.drools.process.instance.WorkItem;
import org.drools.process.instance.WorkItemHandler;
import org.drools.process.instance.WorkItemManager;
public class NotificationWorkItemHandler implements WorkItemHandler {
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
// extract parameters
String from = (String) workItem.getParameter("From");
String to = (String) workItem.getParameter("To");
String message = (String) workItem.getParameter("Message");
String priority = (String) workItem.getParameter("Priority");
// send email
EmailService service = ServiceRegistry.getInstance().getEmailService();
service.sendEmail(from, to, "Notification", message);
// notify manager that work item has been completed
manager.completeWorkItem(workItem.getId(), null);
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
// Do nothing, notifications cannot be aborted
}
}
这 个 WorkItemHandler以邮件方式发送一个通知,然后立即通知WorkItemManager工作项已经完成。注意,并非所有工作项都可以直 接完成。在执行一个工作项需要花费一些时间的情况下,执行可以异步继续,并且可以稍后工作项管理器。在这种情形下,在它已经完成之前也可以中止一个工作 项。可以使用中止方法指定如何中止这个工作项。
WorkItemHandlers应该被注册在WorkItemManager,使用以下 API:
workingMemory.getWorkItemManager().registerWorkItemHandler( "Notification", new NotificationWorkItemHandler());
从流程本身解耦工作项的执行,有以下优势:
-
流程更有声明性,指定应该执行什么,而非为什么。
-
通过适配工作项处理程序,可以实现对环境的改变。流程本身不应该被改变。还可以在不同的环境中使用相同的流程,在那儿工作项处理程序负责集成正确的服务。
-
跨流程和项目共享工作项处理程序是容易的(如果代码嵌在流程本身中,这是非常困难的)。
-
可以根据上下文使用不同的工作项处理程序。例如,在测试或模拟期间,不必实际执行工作项。接下来的部分展示了一个例子,如何在测试期间使用指定的工作项处理程序。
根据上下文定制执行,更容易管理在环境中的变化(通过改变处理程序),跨上下文共享流程(使用不同的处理程序),测试,模拟(自定义测试处理程序)。
我 们的流程框架是基于(已经众所周知) Process Virtual Machine (流程虚拟器——PVM),流程框架可以被用来作为多流程语言的基础。这允许用户更容易创始自己的流程语言,由流程框架提供通用的服务(例如,持久化,审 计),可以被流程语言设计者使用(或重用)。流程用一个节点图来表示,每个节点描述流程逻辑的一部分。为表达各种不同的功能使用不同类型的节点,如创建或 合并平行流(分枝和联合),调用一个子流程,调用外部服务等等。我们的目标之一是创建一个真正可插式流程语言,语言设计者可以轻松地插入他们自己的节点实 现。


浙公网安备 33010602011771号