疯狂Activiti6.0连载(14)Activiti运行第一个DMN应用

本文介绍了如何在Activiti6中运行第一个DMN决策应用,包括建立项目、配置规则引擎、编写DMN文件及加载运行。通过示例代码展示了规则的部署、执行及结果获取,揭示了规则引擎与流程引擎的相似之处。

  本文节选自《疯狂工作流讲义(第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

Activiti运行第一个DMN应用

前面对DMN规范作了一个简单的讲解,本小节将带领大家开发第一个Activiti的规则项目,目的让大家对Activiti的规则引擎有一个初步了解,在成功运行第一个规则项目后,对DMN规范以及ActivitiDMN实现就不会感觉神秘。

建立项目

与本书前面章节的项目一样,新建一个普通的Java项目,后缀为.dmn的文件存放在resource/dmn目录,同样依赖common-lib/lib目录(不包括子目录)下的jar包。除了依赖Activitijar包外,由于规则引擎使用了liquimvel等项目,因此还要导入这些项目的包,项目结构以及所使用的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-7codes\15\15.3\first-dmn\resource\activiti.dmn.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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">

 

<bean id="dmnEngineConfiguration"

class="org.activiti.dmn.engine.impl.cfg.StandaloneDmnEngineConfiguration">

<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />

<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />

<property name="jdbcUsername" value="root" />

<property name="jdbcPassword" value="123456" />

</bean>

 

</beans>

规则引擎的配置文件,几乎与流程引擎的配置文件一样,配置一个dmnEngineConfigurationbean,为该bean设置JDBC的连接属性。规则引擎有哪些配置,将在下面章节中讲述。

编写DMN文件

本例中定义一最简单的规则,当传入的年龄参数大于等于18时,就返回“成年人”字符串,如果年龄参数小于18,就返回“小孩”字符串。代码清单15-8为本例的规则文件。

代码清单15-8codes\15\15.3\first-dmn\resource\dmn\first.dmn

<?xml version="1.0" encoding="UTF-8"?>

<definitions xmlns="http://www.omg.org/spec/DMN/20151130"

id="simple" name="Simple" namespace="http://activiti.org/dmn">

<decision id="decision1" name="Simple decision">

<decisionTable id="decisionTable">

<input id="input1">

<inputExpression id="inputExpression1" typeRef="number">

<text>personAge</text>

</inputExpression>

</input>

<output id="outputId" label="Output 1" name="myResult" typeRef="string" />

<rule>

<inputEntry id="inputEntry2">

<text><![CDATA[ >= 18 ]]></text>

</inputEntry>

<outputEntry id="outputEntry2">

<text>'成年人'</text>

</outputEntry>

</rule>

<rule>

<inputEntry id="inputEntry1">

<text><![CDATA[ < 18 ]]></text>

</inputEntry>

<outputEntry id="outputEntry1">

<text>'小孩'</text>

</outputEntry>

</rule>

</decisionTable>

</decision>

</definitions>

规则文件中,定义了一个输入参数、一个输出结果和两个规则,在前面章节已经对相关的DMN元素作了讲解,在此不再赘述。

加载与运行DMN文件

两个引擎不仅仅在配置上类似,连API的使用也非常相似。如果在本书前面的章节中,熟练掌握了Activiti工作流引擎的API,那么在学习使用规则引擎的API也不会太难。代码清单15-9中为规则的运行代码。

代码清单15-9codes\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<String, Object> params = new HashMap<String, Object>();

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为基础,获取两个服务组件:DmnRepositoryServiceDmnRuleServiceDmnRepositoryService主要负责引擎资源的部署,DmnRuleService则提供规则的相关服务,例如可以执行规则、查询规则等。

代码清单15-9中,使用了DmnRepositoryServicefirst.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

Activiti6最大的变化点就是对代码进行了重构,该版本修复以往的Bug并不多,但内部实现相对来说变化比较大。其突出的变化如下所示: 新增两款新引擎,Form引擎和DMN引擎(动态引擎)。其中DMN引擎允许开发人员创建自己的决策表。可以通过变量和定义的规则方式从决策表中计算结果。这些决策表的数据可以被rule task调用,决策表与流程实例是完全隔离的,相互之间不需要知道对方的存在。Form引擎可以通过Activiti6 UI界面进行配置,通俗一点的理解就是Activiti6将Form表单独立出来了。Form表单信息可以以JSON格式进行定义和使用。Activiti6 UI 默认包括新的规则引擎和表单引擎。 新增ad-hoc子流程。可以参考文章(ad-hoc子流程使用)。 作业执行器被重构。Activiti6版本仅保留了Activiti5版本中的异步作业执行器(async executor)。定时作业被划分了四个不同的表:executable jobs, timer jobs, suspended jobs 和deadletter jobs。引擎可以更快的执行作业。定时器作业在新的版本存储于单独的表中,一个线程会定时轮训需要执行的作业,快到期的作业会被添加到suspended jobs表中。重试的作业已经被干掉了,需要重试的作业会被添加到deadletter jobs表中。这样的重构意义主要是为了提高查询效率,可以执行的作业可以很快的被查询出来。 作业执行器通过消息队列的方式进行,关于这一点可以参考随后的文章。 瞬态变量的引入。瞬态变量不会存储到 Activiti 变量表中,但仍为单一的事务持续时间执行。比如可以在REST服务之间进行调用的时候使用,或者使用于Java service task。 引入了事务依赖监听器,可以参考Activiti依赖事务监听器(上)的讲解。 Activiti 6 UI 程序中,添加了DMN编辑器。 对于多实例节点而言,添加了终止多实例节点的相关方法。这个特性允许开发人员使用API结束多实例所有节点的执行。 优化补偿活动行为和在子流程中的使用。 在运行流程实例以及执行实例中添加了开始时间以及启动流程实例的人字段。在ru_task中增加了任务的认领时间(claim time)。 妥善解决数据库架构 (oracle/postgres) 的使用。 修复历史数据捕获。 大量重构 Activiti 6 UI 应用程序,例如应用程序中定义现在部署作为正常的活动部署,没有为其单独的应用程序定义表。 改进Activiti 6 QA中的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大仙的程序空间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值