摘要:Flowable中引入了一个decision task(我们可以将其称之为决策任务)。在讲解decision task之前,我们不妨看一下dmn引擎。因为如果大家不了解dmn,那肯定不知道如何使用decision task了。
dmn是decision Modeling Notation几个单词的缩写,他强调的是决策方式建立模型,而不是过度依赖文档方式建立模型。bpmn强调的是文档流程模型,而dmn强强调的是决策模型。这也是bpmn与dmn最大的不同之处。接下来,我们分步骤看一下如何使用dmn以及decision task。
文章目录
- 一、dmn使用/定义/规则
- 1. dmn引擎使用
- 2. dmn文件定义
- 3. 执行 dmn规则
- 二、决策任务使用
- 2.1. 部署流程文档
- 2.2. 启动流程实例
一、dmn使用/定义/规则
1. dmn引擎使用
首先,我们需要引入一些dmn引擎的包,pom.xml信息如下:
<dependency><groupId>org.flowable</groupId><artifactId>flowable-dmn-engine-configurator</artifactId><version>${flowable.version}</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-dmn-engine</artifactId><version>${flowable.version}</version></dependency>
2. dmn文件定义
dmn强强调的是决策模型,因此我们可能会大量的定义决策模型文件,比如现在我有一个最最简单的需求,现在有三个变量,变量的名称分别是input1、output1、output2。假如我们使用这个规则,比如input1>10 则output1=test,output2=1;input1=10 则output1=test3,output2=3;input1<10 则output1=test2,output2=2;假如这个规则让我们自己定义规则文件,我们该如何定义呢?首先我们需要定义一个decision元素,该元素可以定义的属性如下:
id="decision" name="Simple decision" 三个变量如何定义呢?实例代码如下:<decisionTable id="decisionTable"><input><inputExpression id="input1" typeRef="number"><text>input1</text></inputExpression></input><output id="output1" label="Output 1" name="output1" typeRef="string" /><output id="output2" label="Output 2" name="output2" typeRef="number" />
input1>10 则output1=test,output2=1;input1=10 则output1=test3,output2=3;input1<10 则output1=test2,output2=2;这应该是三个规则,哪我们就可以定义三个规则,示例代码如下:
<rule><inputEntry id="inputEntry1"><text><![CDATA[> 10]]></text></inputEntry><outputEntry id="outputEntry1_1"><text>'test'</text></outputEntry><outputEntry id="outputEntry2_1"><text>1</text></outputEntry></rule><rule><inputEntry id="inputEntry2"><text><![CDATA[< 10]]></text></inputEntry><outputEntry id="outputEntry1_2"><text>'test2'</text></outputEntry><outputEntry id="outputEntry2_2"><text>2</text></outputEntry></rule><rule><inputEntry id="inputEntry3"><text><![CDATA[== 10]]></text></inputEntry><outputEntry id="outputEntry1_3"><text>'test3'</text></outputEntry><outputEntry id="outputEntry2_3"><text>3</text></outputEntry></rule>
上面我们分别定义了三个rule元素(规则),相信大家也能猜测到每个规则的含义。inputEntry是输入的元素,outputEntry是输出的元素。上述的dmn文件完整代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/DMN/20151101" id="simple" name="Simple" namespace="http://flowable.org/dmn"><decision id="decision" name="Simple decision"><decisionTable id="decisionTable"><input><inputExpression id="input1" typeRef="number"><text>input1</text></inputExpression></input><output id="output1" label="Output 1" name="output1" typeRef="string" /><output id="output2" label="Output 2" name="output2" typeRef="number" /><rule><inputEntry id="inputEntry1"><text><![CDATA[> 10]]></text></inputEntry><outputEntry id="outputEntry1_1"><text>'test'</text></outputEntry><outputEntry id="outputEntry2_1"><text>1</text></outputEntry></rule><rule><inputEntry id="inputEntry2"><text><![CDATA[< 10]]></text></inputEntry><outputEntry id="outputEntry1_2"><text>'test2'</text></outputEntry><outputEntry id="outputEntry2_2"><text>2</text></outputEntry></rule><rule><inputEntry id="inputEntry3"><text><![CDATA[== 10]]></text></inputEntry><outputEntry id="outputEntry1_3"><text>'test3'</text></outputEntry><outputEntry id="outputEntry2_3"><text>3</text></outputEntry></rule></decisionTable></decision></definitions>
dmn文件部署
dmn文件跟bpmn设计出来的流程文档操作步骤基本类似,也是需要部署该规则文件的,示例代码如下:
String resource = "com/shareniu/shareniu_flowable_study/dmn/DeploymentTest.testDeployWithXmlSuffix.dmn.xml";dmnRepositoryService.createDeployment().addClasspathResource(resource).deploy();
部署上述代码之后,数据库ACT_DMN_DEPLOYMENT表数据变化如下。
select * from ACT_DMN_DEPLOYMENT;
3. 执行 dmn规则
下面,我们开始执行定义的规则文件,实例代码如下:
@Test
public void executeDecisionByKey() {Map<String, Object> inputVariables = new HashMap<>();inputVariables.put("input1", 11);List<Map<String, Object>> result = ruleService.executeDecisionByKey("decision", inputVariables);System.out.println(result);
}
运行上述代码,程序的输出如下:
[{output1=test, output2=1.0}]
我们将input1的值修改为10,再次运行上述代码,输出信息如下:
[{output1=test3, output2=3.0}]
通过上面的实例,我们发现自定义的决策规则是完全可以执行的,并符合我们的预期效果。
二、决策任务使用
接下来,我们看一下如何在流程文档中使用decision task。相关的流程图如下:
上图中,我们定义了一个决策表和一个任务节点,请注意决策任务是不会等待,也就是说当流程实例经过决策任务的时候,计算完毕决策任务对应的决策规则之后实例继续往下走。上图中的决策任务xml定义如下:
<serviceTask id="sid-64DC19A4-1CBA-45C6-859F-83F3EE44C7F4" name="决策表" flowable:type="dmn"><extensionElements><flowable:field name="decisionTableReferenceKey"><flowable:string><![CDATA[decision]]></flowable:string></flowable:field><flowable:field name="decisionTaskThrowErrorOnNoHits"><flowable:string><![CDATA[false]]></flowable:string></flowable:field></extensionElements></serviceTask>
上述的xml中,decisionTableReferenceKey定义的值是我们上文中提到的 中的id值。
2.1. 部署流程文档
@Test
public void addBytes() {byte[] bytes = IoUtil.readInputStream(ProcessengineTest.class.getClassLoader()
.getResourceAsStream("com/shareniu/shareniu_flowable_study/dmn/decision.bpmn20.xml"), "decision.bpmn");String resourceName = "decision.bpmn";Deployment deployment = repositoryService.createDeployment().addBytes(resourceName, bytes).deploy();System.out.println(deployment);
}
2.2. 启动流程实例
接下来,开始启动流程实例如下所示:
@Test
public void startProcessInstanceByKey() {String processDefinitionKey = "decision";Map<String, Object> var = new HashMap<>();var.put("input1", 11);runtimeService.startProcessInstanceByKey(processDefinitionKey, var);
}
ACT_RU_VARIABLE表新增的输入如下:
换言之,决策任务确实已经执行了,并且将规则的执行结果outputEntry元素的值作为变量进行使用了。
ACT_RU_TASK表新增的输入如下:
ok,决策任务使用基本已经讲解完毕。