本文节选自《疯狂工做流讲义(第2版)》html
京东购买地址:https://item.jd.com/12246565.htmlgit
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397框架
工做流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577spa
在第14章,咱们讲解了Activiti与规则引擎的整合使用,确切来讲,是Activiti与Drools规则引擎的整合。在Activiti6版本发布后,Activiti开始实现DMN规范,换言之,Activiti正在实现本身的规则引擎,虽然还没有完成,但已具雏形。本章将讲述DMN规范以及初步实现的Activit规则引擎。.net
笔者成书时,Activiti的规则引擎并无正式发布,官方文档、API中没有找到相关的资料,本章内容为笔者参考Activiti规则引擎模块的源代码编写而成,在之后的Activiti版本中,规则引擎的实现及发布的文档,有可能与本书所描述的内容有所冲突,望读者了解该状况。code
DMN是英文Decision Model and Notation的缩写,直译意为决策模型与图形。根据前章节可知,BPMN是OMG公司发布的工做流规范,而DMN一样是OMG公司发布规范,该规范主要用于定义业务决策的模型和图形,1.0版本发布于2015年,目前最新的是1.1版本,发布于2016年。视频
BPMN主要用于规范业务流程,业务决策的逻辑由PMML等规范来定义,例如在某些业务流程中,须要由多个决策来决定流程走向,而每一个决策都要根据自身的规则来决定,而且每一个决策之间可能存在关联,此时在BPMN与PMML之间出现了空白,DMN规范出现前,决策者没法参与到业务中。为了填补模型上的空白,新增了DMN规范,定义决策的规范以及图形,DMN规范至关于业务流程模型与决策逻辑模型之间的桥梁。xml
虽然DMN只做为工做流与决策逻辑的桥梁,但实际上,规范中也包含决策逻辑部分,同时也兼容PMML规范所定义的表达式语言。换言之,实现DMN规范的框架,同时也会具备业务规则的处理能力。htm
Activiti做为一个工做流引擎,与规则引擎Drools原本没有可比之处,它们之间更像互补关系,可是目前Activiti正在实现DMN规范,Drools则实现了PMML规范,这样就意味着,Activiti的工做引擎完成后,也包含了规则引擎的功能,根据DMN规范可知,DMN规范的实现者,也会对PMML提供支持。如此一来,Activiti的规则引擎与Drools将产生竞争关系。blog
JBoss旗下有工做流引擎jBPM,有规则引擎Drools,Activiti自己就是工做流引擎,再加上这次更新所加入的规则引擎,估计在不久的未来,Activiti在工做流引擎以及规则引擎领域,能与JBoss平起平坐。
DMN主要定义决策模型,与BPMN规范相似,OMG发布的DMN规范含有对应的XML约束。当前版本的Activiti实现了decision部分,所以本章只讲述DMN中的decision部分。DMN的XML文档,通常状况下文件名后缀为dmn。代码清单15-1是一份简单的DMN文档。
代码清单15-1:codes\15\15.1\sample.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="string"> <text>input1</text> </inputExpression> </input> <output id="output1" label="Output 1" name="output1" typeRef="string" /> <rule> <inputEntry id="inputEntry1"> <text><![CDATA[.startsWith('Angus')]]></text> </inputEntry> <outputEntry id="outputEntry1"> <text>'Hello, man!'</text> </outputEntry> </rule> <rule> <inputEntry id="inputEntry2"> <text><![CDATA[.startsWith('Paris')]]></text> </inputEntry> <outputEntry id="outputEntry2"> <text>'Hello, baby!'</text> </outputEntry> </rule> </decisionTable> </decision> </definitions>
代码清单15-1中的XML文档,定义了一个decision节点,该节点中含有一个输入参数、一个输出结果和两个规则。注意代码清单的粗体字代码,使用了startsWith方法,定义了若是参数字符串以“Angus”开头,则触发第一个规则,若是参数字符以“Paris”开头,则触发第二个规则。关于XML文档中各个元素的描述,将在后面章节中讲述。
本文节选自《疯狂工做流讲义(第2版)》
京东购买地址:https://item.jd.com/12246565.html
疯狂Activiti电子书:https://my.oschina.net/JavaLaw/blog/1570397
工做流Activiti教学视频:https://my.oschina.net/JavaLaw/blog/1577577
本书代码目录:https://gitee.com/yangenxiong/CrazyActiviti