Flowable决策任务(decision task)

摘要: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,决策任务使用基本已经讲解完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/522850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PyODPS 安装常见问题解决

摘要&#xff1a; 本文将用户安装 PyODPS 时遇到的常见问题列举如下&#xff0c;希望在遇到类似问题时可供借鉴。在参考下列步骤之前&#xff0c;请首先尝试卸载并重装 PyODPS。卸载的步骤为执行“pip uninstall pyodps”。 点此查看原文&#xff1a;http://click.aliyun.com/m…

flowable理论(一)工作流理论

文章目录一、工作流是什么&#xff1f;二、为什么要用工作流&#xff1f;三、市面上有哪些工作流&#xff1a;四、工作流的规范一、工作流是什么&#xff1f; 工作流是将一组任务组织起来以完成某个经营过程&#xff1a;定义了任务的触发顺序和触发条件&#xff0c;每个任务可…

5G精华问答 | 5G技术已经成熟了吗?

1G时我们用手机打电话&#xff0c;2G时我们能互发短信、看文字信息&#xff0c;3G时上网看图片&#xff0c;而4G时我们看视频和直播&#xff0c;从1G到4G&#xff0c;不仅信号越来越好&#xff0c;安全性越来越高&#xff0c;上网也越来越快了。1Q&#xff1a;5G技术已经成熟了…

python局部变量含义_Python的变量

1. 概念Python变量是用于存储值所在的内存位置。换句话说&#xff0c;python程序中的变量将数据提供给计算机进行处理。Python中的每个值都有一个数据类型。Python中不同的数据类型是Number&#xff0c;List&#xff0c;Tuple&#xff0c;String&#xff0c;Dictionary等。变量…

PyODPS DataFrame:统一的数据查询语言

摘要&#xff1a; 前几天&#xff0c;PyODPS发布了0.7版本&#xff0c;这篇文章给大家介绍下PyODPS新版本带来的重要特性。 之前也有若干篇文章介绍过了&#xff0c;我们PyODPS DataFrame是延迟执行的&#xff0c;在调用立即执行的方法&#xff0c;比如execute、persist等之前&…

flowable理论(三)flowable简介

flowable 2017发布&#xff0c;主创人员来自Activiti团队&#xff0c;目前支持BPMN和CMMN、DMN规范、它的主要含有五个引擎和一个官方自带的Modeler流程设计器&#xff0c;以及一套数据库表&#xff0c;以及发布版本&#xff08;5个war)/源代码等&#xff1a; 文章目录一、五大…

AliOS Things 持续集成(CI)系统介绍

摘要&#xff1a; AliOS Things在快速的迭代进化之中&#xff0c;如何保证提交的代码质量&#xff0c;并保证在各个硬件平台上的稳定性&#xff0c;是一个非常大的挑战。同时物联网硬件碎片化&#xff0c;资源紧张&#xff0c;对持续集成&#xff08;CI&#xff09;系统也提出了…

从青铜到王者,助力企业轻松上云的四大绝招!

戳蓝字“CSDN云计算”关注我们哦!IBM在7月份发生了很多大事&#xff0c;其中这两件你知道吗&#xff1f;第一&#xff0c;IBM&#xff08;NYSE: IBM&#xff09;与美国电话电报公司&#xff08;AT&T&#xff09;&#xff08;NYSE: T&#xff09;达成一项为期多年的战略联盟…

python模块用法教程_Python学习之asyncore模块用法实例教程

本文以实例分析了Python中asyncore模块的原理及用法&#xff0c;分享给大家供大家参考。具体分析如下&#xff1a;asyncore库是python的一个标准库&#xff0c;它是一个异步socket的包装。我们操作网络的时候可以直接使用socket等底层的库&#xff0c;但是asyncore使得我们可以…

PyODPS开发中的最佳实践

摘要&#xff1a; PyODPS支持用 Python 来对 MaxCompute 对象进行操作&#xff0c;它提供了 DataFrame API 来用类似 pandas 的接口进行大规模数据分析以及预处理&#xff0c;并且可以用 ml 模块来执行机器学习算法。 点此查看原文&#xff1a;http://click.aliyun.com/m/41091…

flowable实战(一)flowable与spring boot集成

文章目录一、添加依赖pom.xml二、关掉认证和Mapper接口的扫描三、添加数据库连接池一、添加依赖pom.xml <dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>${flowable.version…

PyODPS 中使用 Python UDF

摘要&#xff1a; PyODPS 中使用 Python UDF 包含两方面&#xff0c;一个是直接使用&#xff0c;也就是在 MaxCompute SQL 中使用&#xff1b;一个是间接的方式&#xff0c;也就是 PyODPS DataFrame&#xff0c;这种方式你不需要直接写 Python UDF&#xff0c;而是写普通的 Pyt…

无服务器计算,如何节省时间和成本?

戳蓝字“CSDN云计算”关注我们哦&#xff01;译者 | 风车云马出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcould&#xff09;为了解决面临的业务问题&#xff0c;通常需要开发人员花费一定的时间编写完代码&#xff0c;再交由运维工程师确保正常的运行&#xff0c;整个过程…

gen文件下有两个R.java_android工程gen目录中R.java包名是怎么确定

新建一个工程&#xff0c;包名用的com.mythroad.adskiller, 后来觉得不好&#xff0c;又改成com.mythroad.adsinscepter,但是我发现gen下的R.java文件的包名还是原来的com.mythroad.adskiller。甚至手动新建了R.java,包名为com.mythroad.adsinscepter&#xff0c;我把com.mythr…

flowable实战(二)flowable流程模型管理接口

文章目录一、流程模型资源二、流程模型资源的部署&#xff1a;2.1. 流程资源xml部署&#xff1a;2.2. zip/bar打包&#xff0c;多个流程资源文件部署&#xff1a;2.3. Model部署三、部署有关的数据库表四、流程模型的常见管理接口4.1. 部署api4.2.验证部署4.3.获取所有部署api4…

玩转CocoaPods

摘要&#xff1a; 作者&#xff1a;阿里-移动云-大前端 CocoaPods作为iOS的依赖管理工具&#xff0c;已然成为iOS开发的标准工具&#xff08;官方给出的数据&#xff0c;超过42W个库和300W个App使用了CocoaPods&#xff09;。 本篇文章&#xff0c;非讲述CocoaPods的教学文章&a…

一张图看懂阿里云新发布的物联网设备上云神器——HiTSDB + IoT套件

近日&#xff0c;阿里云针对物联网企业遇到的设备认证困难、安全问题突出等问题&#xff0c;发布了HiTSDB IoT 套件的一体化解决方案&#xff0c;能够支持物联设备快速上云&#xff0c;高效设备管理&#xff0c;数据安全&#xff0c;低成本海量数据存储&#xff0c;实时掌握设备…

flowable实战(三)flowable流程实例管理接口

文章目录一、流程实例的管理接口常见功能&#xff1a;1.启动一个流程&#xff08;即创建一个流程实例&#xff09;2.本人发起的流程实例3.本人参与的流程实例4.挂起/激活流程实例5.提前终止流程实例&#xff08;或又叫撤销流程&#xff09;6.彻底删除流程实例7.流程图查看8.判断…

java jtable不可编辑_java – 使JTable单元不可编辑

当用户双击时,我试图使JTable的所有单元格都不可编辑.我已经阅读了很多论坛帖子,一般的共识是创建一个新的表模型类,扩展DefaultTableModel然后重写方法isCellEditable(int row,int column).我做了所有这些,现在当我运行我的程序(小程序)时,没有任何东西出现在单元格中.注意我这…

Spark精华问答 | 谈谈spark中的宽窄依赖

总的来说&#xff0c;Spark采用更先进的架构&#xff0c;使得灵活性、易用性、性能等方面都比Hadoop更有优势&#xff0c;有取代Hadoop的趋势&#xff0c;但其稳定性有待进一步提高。我总结&#xff0c;具体表现在如下几个方面。1Q&#xff1a;Spark RDD是什么&#xff1f;A&am…