疯狂Activiti6.0连载(13)DMN的XML规范
来源:互联网 发布:东莞制造业知乎 编辑:程序博客网 时间:2024/06/14 21:15
本文节选自《疯狂工作流讲义(第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的XML规范
DMN规范的官方网址为:http://www.omg.org/spec/DMN/,在官方网站上可以获取到DMN的规范文档、DMN的XML Schema文档和样例文档。笔者已经将以上三份文档下载,并保存到代码目录,以下为这三份文档的代码路径:
规范文档:codes\15\15.2\DMN规范.pdf
XML Schema:codes\15\15.2\dmn.xsd
样例文档:codes\15\15.2\example.xml
决策
在DMN规范中,根节点为definitions,该节点下可以出现import、itemDefinition、drgElement等元素,其中drgElement是一个抽象元素,decision元素继承于drgElement。一个decision表示一次决策,可以为它设置name、id、label属性,按照DMN规范,name属性是必需的,而其他属性则是可选的,但作为decision的唯一标识,建议id也需要设置。一个definitions下可以定义0个或多个decision。代码清单15-2定义了一个decision元素。
代码清单15-2:codes\15\15.2\decision.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">
</decision>
</definitions>
一个decision元素由question、allowedAnswers、expression等元素组成,其中expression元素表示决策逻辑,expression是一个抽象元素,DMN规范中,decision元素下的expression可出现0次或1次。
决策表
一个decisionTable元素表示一个决策表,decisionTable继承于expression元素,因此在decision元素下,decisionTable只允许出现0次或1次,这是DMN定义的规范,在Activiti的实现中,decision元素下如果不提供decisionTable,会报出异常。代码清单15-3定义了一个decisionTable元素以及它的几个子元素。
代码清单15-3:codes\15\15.2\decisionTable.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/>
<output/>
<rule></rule>
</decisionTable>
</decision>
</definitions>
根据 DMN规范,一个decision下最多只有一个decisionTable,虽然规范中定义可以出现0次,但这样做就失去了意义,如果不提供decisionTable,Activiti的规则引擎会报出异常,信息为:java.lang.IllegalArgumentException: no decision table present in decision。
决策表元素有四个属性:hitPolicy、aggregation、preferredOrientation和outputLabel,其中hitPolicy属性用于定义规则冲突策略。
元素decisionTable下的input、output和rule子元素,可以出现多次,其中规范中定义了output元素最少出现一次,也就是意味在规范中,一次业务决策必须产出一个结果。在Activiti的初步实现中,decisionTalbe元素下,input、output和rule三个子元素都必须出现一次。
输入参数
在decisionTable元素下,可以添加多个input元素来声明输入参数,为input元素增加inputExpression元素来声明输入参数的类型以及名称等信息,代码清单15-4中定义了输出参数。
代码清单15-4:codes\15\15.2\input.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="inputId">
<inputExpression id="inputExpressionId" typeRef="string">
<text>personName</text>
</inputExpression>
</input>
<output/>
<rule></rule>
</decisionTable>
</decision>
</definitions>
代码清单15-4的粗体部分,定义了一个参数名称为“personName”的输入参数,类型字符串。需要注意的,参数名是persionName,而不是inputId。
输出结果
每个决策表至少有一个输出结果,使用output元素定义输出参数的名称以及数据类型。代码清单15-5定义了输出结果。
代码清单15-5:codes\15\15.2\output.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="inputId">
<inputExpression id="inputExpressionId" typeRef="string">
<text>personName</text>
</inputExpression>
</input>
<output id="resultId" label="Output 1" name="resultName" typeRef="string" />
<rule></rule>
</decisionTable>
</decision>
</definitions>
代码清单15-5的粗体字代码,定义了一个名称为“resultName”的输出结果,类型为字符串类型。需要注意的是,获取结果时,要根据name属性来获取,而不是id属性。
规则
在决策表元素下可以定义多个rule元素,rule元素下可以添加inputEntry与outputEntry元素,其中inputEntry元素下支持使用MVEL表达式来实现业务规则的判断逻辑,而outputEntry元素则表示规则结果的输出,一个rule下可以出现0个或多个inputEntry,而outputEntry最少出现1次。代码清单15-6中定义两个rule。
代码清章15-6:codes\15\15.2\rule.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" hitPolicy="UNIQUE">
<input id="input1">
<inputExpression id="inputExpression1" typeRef="number">
<text>personAge</text>
</inputExpression>
</input>
<input id="input2">
<inputExpression id="inputExpression2" typeRef="string">
<text>personName</text>
</inputExpression>
</input>
<output id="outputId" label="Output 1" name="myResult" typeRef="string" />
<rule>
<inputEntry id="inputEntry2">
<text><![CDATA[ > 18 ]]></text>
</inputEntry>
<inputEntry id="inputEntry2_2">
<text><![CDATA[ .equals('Angus') ]]></text>
</inputEntry>
<outputEntry id="outputEntry2">
<text>'Man Angus'</text>
</outputEntry>
</rule>
<rule>
<inputEntry id="inputEntry1">
<text><![CDATA[ <= 18 ]]></text>
</inputEntry>
<outputEntry id="outputEntry1">
<text>'Child'</text>
</outputEntry>
</rule>
</decisionTable>
</decision>
</definitions>
代码清单15-6中,定义了两个两个输入参数、一个输出结果以及两个规则,第一规则触发条件为第1个参数值大于18、第2个参数值等于“Angus”,两个条件都符合时,返回 “Man Angus”字符串。第二个规则触发条件则是参数1的值小于等于18。
目前Activiti还没有完全实现DMN规范,只是有一个大概的轮廓,本书的主要内容为Activiti,下面将开始介绍Activiti关于DMN规范的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.0连载(13)DMN的XML规范
- 疯狂Activiti6连载(12)DMN规范概述
- 疯狂Activiti6.0连载(15)DMN规则匹配表达式
- 疯狂Activiti6.0连载(14)Activiti运行第一个DMN应用
- 疯狂Activiti6连载(11)Activiti6的流程控制逻辑
- 疯狂Activiti6.0连载(21)Activiti的Web Service
- 疯狂Activiti6连载(5)流程引擎的创建
- 疯狂Activiti6连载(7)Activiti的设计模式
- 疯狂Activiti6.0连载(16) Drools介绍与运行
- 疯狂Activiti6.0连载(17) Drools规则语法概述
- 疯狂Activiti6.0连载(18) Activiti与Drools整合
- 疯狂Activiti6.0连载(19)Activiti整合Spring
- 疯狂Activiti6.0连载(20)Activiti与Spring Boot
- 疯狂Activiti6.0连载(22)流程存储Web Service
- 疯狂Activiti6.0连载(24)BPMN开始事件
- 疯狂Activiti6.0连载(25)BPMN结束事件
- 疯狂Activiti6.0连载(26)BPMN边界事件
- 疯狂Activiti6.0连载(27)BPMN中间事件
- 清除浮动方式总结
- H-Bomb
- 运维小结之关于ssh登录问题的解决方法
- [洛谷P1315]观光公交
- Java之定义and启动线程
- 疯狂Activiti6.0连载(13)DMN的XML规范
- 配置单机RocektMq踩过的那些坑
- 2017.11.3总结
- CSS 继承
- 记忆网络之Gated End-To-End Memory Networks
- MySQL explain执行计划解读
- 一个简单地程序示例剖析类加载机制
- 洛谷 3932 浮游大陆的68号岛 前缀和
- bzoj5056: OI游戏