本文节选自《疯狂工作流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585
前面对DMN规范作了一个简单的讲解,本小节将带领大家开发第一个Activiti的规则项目,目的让大家对Activiti的规则引擎有一个初步了解,在成功运行第一个规则项目后,对DMN规范以及Activiti的DMN实现就不会感觉神秘。
与本书前面章节的项目一样,新建一个普通的Java项目,后缀为.dmn的文件存放在resource/dmn目录,同样依赖common-lib/lib目录(不包括子目录)下的jar包。除了依赖Activiti的jar包外,由于规则引擎使用了liqui、mvel等项目,因此还要导入这些项目的包,项目结构以及所使用的jar包如图15-1所示。
图15-1项目结构
需要注意的是,在导入common-lib/lib的包时,不要把源代码的包也导入到项目中,例如把规则引擎的源代码包(activiti-dmn-engine-6.0.0-sources.jar)导到环境中,在运行时,会出现以下异常:org.activiti.dmn.engine.ActivitiDmnException: Error initialising dmn data model。
图15-1中的resource目录,有一份activiti.dmn.cfg.xml的配置文件,该文件包含规则引擎的基础配置,我们将在后面章节中讲述。
在默认情况下,规则引擎会读取ClassPath下的activiti.dmn.cfg.xml,对于该文件,大家可能觉得比较熟悉,这个文件名,就是流程引擎配置文件的名称中间加入了dmn字母。而相对于配置文件的内容,几乎也是与流程引擎一样。代码清单15-7是本例中所使用的配置文件。
代码清单15-7:codes\15\15.3\first-dmn\resource\activiti.dmn.cfg.xml
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
class="org.activiti.dmn.engine.impl.cfg.StandaloneDmnEngineConfiguration">
规则引擎的配置文件,几乎与流程引擎的配置文件一样,配置一个dmnEngineConfiguration的bean,为该bean设置JDBC的连接属性。规则引擎有哪些配置,将在下面章节中讲述。
本例中定义一个最简单的规则,当传入的年龄参数大于等于18时,就返回“成年人”字符串,如果年龄参数小于18,就返回“小孩”字符串。代码清单15-8为本例的规则文件。
代码清单15-8:codes\15\15.3\first-dmn\resource\dmn\first.dmn
id="simple" name="Simple" namespace="http://activiti.org/dmn">
e>
规则文件中,定义了一个输入参数、一个输出结果和两个规则,在前面章节已经对相关的DMN元素作了讲解,在此不再赘述。
两个引擎不仅仅在配置上类似,连API的使用也非常相似。如果在本书前面的章节中,熟练掌握了Activiti工作流引擎的API,那么在学习使用规则引擎的API也不会太难。代码清单15-9中为规则的运行代码。
代码清单15-9:codes\15\15.3\first-dmn\src\org\crazyit\activiti\FirstDmn.java
public class FirstDmn {
public static void main(String[] args) {
//根据默认配置创建引擎的配置实例
DmnEngineConfiguration config = DmnEngineConfiguration
.createDmnEngineConfigurationFromResourceDefault();
//创建规则引擎
DmnEngine engine = config.buildDmnEngine();
//获取规则的存储服务组件
DmnRepositoryService rService = engine.getDmnRepositoryService();
//获取规则服务组件
DmnRuleService ruleService = engine.getDmnRuleService();
//进行规则 部署
DmnDeployment dep = rService.createDeployment()
.addClasspathResource("dmn/first.dmn").deploy();
//进行数据查询
DmnDecisionTable dt = rService.createDecisionTableQuery()
.deploymentId(dep.getId()).singleResult();
//初始化参数
Map
params.put("personAge", 19);
//传入参数执行决策,并返回结果
RuleEngineExecutionResult result = ruleService.executeDecisionByKey(
dt.getKey(), params);
//控制台输出结果
System.out.println(result.getResultVariables().get("myResult"));
//重新设置参数
params.put("personAge", 5);
//重新执行决策
result = ruleService.executeDecisionByKey(dt.getKey(), params);
//控制台重新输出结果
System.out.println(result.getResultVariables().get("myResult"));
}
}
如代码清单15-9所示,先读取默认的配置文件来创建DmnEngineConfiguration实例,以该实例获取规则引擎DmnEngine实例,再以DmnEngine为基础,获取两个服务组件:DmnRepositoryService和DmnRuleService。DmnRepositoryService主要负责引擎资源的部署,DmnRuleService则提供规则的相关服务,例如可以执行规则、查询规则等。
代码清单15-9中,使用了DmnRepositoryService将first.dmn规则文件部署到引擎中,再根据部署的id去查询DmnDecisionTable实例。代码清单15-9中的粗体字代码,使用DmnRuleService来执行决策并返回结果,由于我们在DMN文件中配置了,需要有一个名称为personAge的输入参数,因此要新建一个Map实例来保存该参数。
在以上例子中,第一次使用DmnRuleService来执行决策时,传入的“personAge”参数值为19,第二次执行决策时,传入的参数值为5,运行代码清单15-9,输出如下:
成年人
小孩
到此,Activiti的第一个应用已经成功运行,根据本小节可知,规则引擎与流程非常相似,配置的读取、规则引擎的创建、服务组件的获取方式、数据查询以及运行,与Activiti流程引擎如出一辙。如果熟悉Activiti流程引擎的话,规则引擎的API将很快掌握。
本文节选自《疯狂Workflow讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
工作流Activiti6电子书:http://blog.csdn.net/boxiong86/article/details/78488562
工作流Activiti6教学视频:http://blog.csdn.net/boxiong86/article/details/78608585