java代码实现流程中的会签_Activiti实现会签功能
一个任务需要多个角色进行审批或者表决,根据这些审批结果来决定流程的走向。实现以上任务,activiti已经提供了支持,可以使用BPMN规范的多实例活动来实现。
1.Activiti多实例:
多实例节点是在业务流程中定义重复环节的一个方法。 从开发角度讲,多实例和循环是一样的: 它可以根据给定的集合,为每个元素执行一个环节甚至一个完整的子流程, 既可以顺序依次执行也可以并发同步执行。
多实例是在一个普通的节点上添加了额外的属性定义 (所以叫做'多实例特性'),这样运行时节点就会执行多次。 下面的节点都可以成为一个多实例节点:
User Task
Script Task
Java Service Task
Web Service Task
Business Rule Task
Email Task
Manual Task
Receive Task
(Embedded) Sub-Process
Call Activity
根据规范的要求,每个上级流程为每个实例创建分支时都要提供如下变量:
nrOfInstances:实例总数
nrOfActiveInstances:当前活动的,比如,还没完成的,实例数量。 对于顺序执行的多实例,值一直为1。
nrOfCompletedInstances:已经完成实例的数目。
可以通过execution.getVariable(x)方法获得这些变量。
另外,每个创建的分支都会有分支级别的本地变量(比如,其他实例不可见, 不会保存到流程实例级别):
loopCounter:表示特定实例的在循环的索引值。可以使用activiti的elementIndexVariable属性修改loopCounter的变量名。
图形标记
如果节点是多实例的,会在节点底部显示三条短线。 三条竖线表示实例会并行执行。 三条横线表示顺序执行。
Xml内容
要把一个节点设置为多实例,节点xml元素必须设置一个multiInstanceLoopCharacteristics子元素。
...
isSequential属性表示节点是进行 顺序执行还是并行执行。
实例的数量会在进入节点时计算一次。 有一些方法配置它。一种方法是使用loopCardinality子元素直接指定一个数字。
5
也可以使用结果为整数的表达式:
${nrOfOrders-nrOfCancellations}
另一个定义实例数目的方法是,通过loopDataInputRef子元素,设置一个类型为集合的流程变量名。 对于集合中的每个元素,都会创建一个实例。 也可以通过inputDataItem子元素指定集合。 下面的代码演示了这些配置:
assigneeList
假设assigneeList变量包含这些值[kermit, gonzo, foziee]。 在上面代码中,三个用户任务会同时创建。每个分支都会拥有一个用名为assignee的流程变量, 这个变量会包含集合中的对应元素,在例子中会用来设置用户任务的分配者。
loopDataInputRef和inputDataItem的缺点是1)名字不好记, 2)根据BPMN 2.0格式定义,它们不能包含表达式。activiti通过在 multiInstanceCharacteristics中设置 collection和 elementVariable属性解决了这个问题:
多实例节点在所有实例都完成时才会结束。也可以指定一个表达式在每个实例结束时执行。 如果表达式返回true,所有其他的实例都会销毁,多实例节点也会结束,流程会继续执行。 这个表达式必须定义在completionCondition子元素中。
${nrOfCompletedInstances/nrOfInstances >= 0.6 }
在这里例子中,会为assigneeList集合的每个元素创建一个并行的实例。 当60%的任务完成时,其他任务就会删除,流程继续执行。
以上内容为Activiti用户手册的内容,下面实现一个简单地流程
2.流程实现
流程图为:
properties:
XML:
${nrOfCompletedInstances/nrOfInstances >= 0.6 }
发布流程:
Deployment deployment = repositoryService.createDeployment()
.addClasspathResource("com/chq/ssh/test/activiti/deploy/huiqian.bpmn20.xml")
.deploy();
启动流程:
List assigneeList=new ArrayList(); //分配任务的人员
assigneeList.add("tom");
assigneeList.add("jeck");
assigneeList.add("mary");
Map vars = new HashMap(); //参数
vars.put("assigneeList", assigneeList);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("huiqian",vars);
查询任务:
这时查询以上三个人的任务,都会显示有“会签”这个任务
List tasks = taskService.createTaskQuery().taskAssignee("mary").list();
完成任务:
会签节点设置的:${nrOfCompletedInstances/nrOfInstances >= 0.6 } 所有任务完成超过60%,剩余的任务就会删除,表示会签通过。
上面一共设置了三个任务,当两个完成时,超过60%。流程结束
java代码实现流程中的会签_Activiti实现会签功能相关推荐
- java modify的使用方法图解,经过JDT修改(Modify)Java代码的流程步骤
通过JDT修改(Modify)Java代码的流程步骤 1.ICompilationUnit originalUnit = ...;// Get original compilation unit 获取 ...
- 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇
文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...
- java代码在jsp中怎么写_在jsp中写java代码
该服务器上的所有的访问者的所有 jsp 页面 D.该服务器上的所有的访问者的所有 jsp 页面和 Java 程序 6.在 JSP 中调用 JavaBean 时不会用到的标记是( )...... jav ...
- Java代码---求数组中的平均值
Java代码-求数组中的平均值 /*** 求数组中的平均值*/ class Demo5 {public static void main(String[] args) {int[] array = { ...
- Java代码判断数据库中某张表是否存在
最近在开发一个同步数据的统计任务的时候遇到一个问题:要在Java代码中判断数据库中某张表是否存在,查资料后,总结了以下两种方法: 1.使用JdbcTemplate bean public boolea ...
- java 代码冲突检测_Java中常见的代码冲突
java 代码冲突检测 在工作中,最近我对现有Java项目进行了代码清理. 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突. 因此,我想出了此类常见违规的清单,并与同行共享,以提 ...
- java 代码锁_Java中的Lock锁
Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...
- 一行Java代码实现游戏中交换装备
摘要:JDK 1.5 开始 JUC 包下提供的 Exchanger 类可用于两个线程之间交换信息. 本文分享自华为云社区<一行Java代码实现两玩家交换装备[并发编程]>,作者:陈皮的Ja ...
- oracle是java代码块,Oracle中施行java代码
Oracle中执行java代码 1.在ORACLE数据库中创建功能类(实现签名): create or replace and compile java source named TestName a ...
- 初探JAVA代码在虚拟机中的运行机制
前言 从这篇文章开始,后面我们将持续介绍JAVA虚拟机的工作原理.作为一名Android程序员,我们都知道Java代码有很多种运行方式,比如:可以在命令行中运行,可以在开发工具中运行,可以以jar文件 ...
最新文章
- 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
- 不可变的意思是什么?
- Github 的清点对象算法
- Jeecg入门篇,高手掠过
- 全新玖五社区系统整站源码
- 部分用户称苹果iPad Air 5产品质量下降 外壳有异响
- 如何使frame能居中显示
- 黑客雇佣组织开发出新型的Windows 隐秘后门
- POP3协议学习笔记
- 日本性价比旅馆分析报告
- html5小猫钓鱼游戏思路,小猫钓鱼的游戏算法
- 矩阵键盘——按下矩阵按键,数码管显示出位置对应的字符(0123 4567 89Ab CdEF)
- 并行机台模型Parallel Machine Models (Deterministic)-LPT算法实现
- Android 5.X 新特性详解(一)MD主题、Palette、视图阴影、Tinting(着色)和Clipping(裁剪)
- Photoshop中的填充功能
- 【人工智能笔记】第三十节:注意力原理分析,及tensorflow 2.0 实现
- 盘点 深度学习妖怪 之 激活函数妖
- codeblocks配置glut
- thinkphp6对接阿里云短信服务完成定时发送短信功能
- windows 更新失败 你的设备中缺少重要的安全和质量修复。