一个任务需要多个角色进行审批或者表决,根据这些审批结果来决定流程的走向。实现以上任务,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实现会签功能相关推荐

  1. java modify的使用方法图解,经过JDT修改(Modify)Java代码的流程步骤

    通过JDT修改(Modify)Java代码的流程步骤 1.ICompilationUnit originalUnit = ...;// Get original compilation unit 获取 ...

  2. 教你如何使用Java代码从网页中爬取数据到数据库中——网络爬虫精华篇

    文章目录 1:网络爬虫介绍 2:HttpClients类介绍 2.1 HttpGet参数问题 2.2 HttpPost参数问题 2.3 连接池技术问题 3:Jsoup介绍 4:动手实践如何抓取网页上数 ...

  3. java代码在jsp中怎么写_在jsp中写java代码

    该服务器上的所有的访问者的所有 jsp 页面 D.该服务器上的所有的访问者的所有 jsp 页面和 Java 程序 6.在 JSP 中调用 JavaBean 时不会用到的标记是( )...... jav ...

  4. Java代码---求数组中的平均值

    Java代码-求数组中的平均值 /*** 求数组中的平均值*/ class Demo5 {public static void main(String[] args) {int[] array = { ...

  5. Java代码判断数据库中某张表是否存在

    最近在开发一个同步数据的统计任务的时候遇到一个问题:要在Java代码中判断数据库中某张表是否存在,查资料后,总结了以下两种方法: 1.使用JdbcTemplate bean public boolea ...

  6. java 代码冲突检测_Java中常见的代码冲突

    java 代码冲突检测 在工作中,最近我对现有Java项目进行了代码清理. 完成该练习后,我可以看到在代码中一次又一次地发生了一组常见的代码冲突. 因此,我想出了此类常见违规的清单,并与同行共享,以提 ...

  7. java 代码锁_Java中的Lock锁

    Lock锁介绍: 在java中可以使用 synchronized 来实现多线程下对象的同步访问,为了获得更加灵活使用场景.高效的性能,java还提供了Lock接口及其实现类ReentrantLock和 ...

  8. 一行Java代码实现游戏中交换装备

    摘要:JDK 1.5 开始 JUC 包下提供的 Exchanger 类可用于两个线程之间交换信息. 本文分享自华为云社区<一行Java代码实现两玩家交换装备[并发编程]>,作者:陈皮的Ja ...

  9. oracle是java代码块,Oracle中施行java代码

    Oracle中执行java代码 1.在ORACLE数据库中创建功能类(实现签名): create or replace and compile java source named TestName a ...

  10. 初探JAVA代码在虚拟机中的运行机制

    前言 从这篇文章开始,后面我们将持续介绍JAVA虚拟机的工作原理.作为一名Android程序员,我们都知道Java代码有很多种运行方式,比如:可以在命令行中运行,可以在开发工具中运行,可以以jar文件 ...

最新文章

  1. 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
  2. 不可变的意思是什么?
  3. Github 的清点对象算法
  4. Jeecg入门篇,高手掠过
  5. 全新玖五社区系统整站源码
  6. 部分用户称苹果iPad Air 5产品质量下降 外壳有异响
  7. 如何使frame能居中显示
  8. 黑客雇佣组织开发出新型的Windows 隐秘后门
  9. POP3协议学习笔记
  10. 日本性价比旅馆分析报告
  11. html5小猫钓鱼游戏思路,小猫钓鱼的游戏算法
  12. 矩阵键盘——按下矩阵按键,数码管显示出位置对应的字符(0123 4567 89Ab CdEF)
  13. 并行机台模型Parallel Machine Models (Deterministic)-LPT算法实现
  14. Android 5.X 新特性详解(一)MD主题、Palette、视图阴影、Tinting(着色)和Clipping(裁剪)
  15. Photoshop中的填充功能
  16. 【人工智能笔记】第三十节:注意力原理分析,及tensorflow 2.0 实现
  17. 盘点 深度学习妖怪 之 激活函数妖
  18. codeblocks配置glut
  19. thinkphp6对接阿里云短信服务完成定时发送短信功能
  20. windows 更新失败 你的设备中缺少重要的安全和质量修复。

热门文章

  1. clover删除多余引导_clover如何删除无用启动项_常见问题解析,clover
  2. android 模拟xp,使用Bochs模拟器瞬间安卓变XP教程
  3. 鸿蒙手机如何录屏,两种方式教你如何在微信时录制屏幕视频。
  4. SpringSecurity框架用法简介
  5. 电路滤波器——(一)RLC无源滤波器
  6. C盘可用空间无法完全压缩卷解决方法
  7. 一个手机号码可以申请二个微信号吗?如何申请?
  8. 我为什么放弃网易博客
  9. 电脑结构和CPU、内存、硬盘三者之间的关系
  10. 多目标优化 MOP (三):遗传算法 SPEA2+SDE 2014