Activiti手动执行的应用(UserTask)
工作流模拟某公司请假流程情景如下:
1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假。
2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监批准
流程图:
流程配置:
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test"> <process id="UserExecuteTask" name="UserExecuteTask"> <startEvent id="startevent1" name="Start"></startEvent> <parallelGateway id="parallelgateway1" name="多种请假方式"></parallelGateway> <userTask id="servicetask1" name="项目经理同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener"/> </extensionElements> </userTask> <userTask id="servicetask2" name="产品经理同意"> <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener"/> </extensionElements> </userTask> <userTask id="servicetask3" name="项目组长同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener"/> </extensionElements> </userTask> <parallelGateway id="parallelgateway2" name="First Join"></parallelGateway> <userTask id="servicetask4" name="项目总监同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener"/> </extensionElements> </userTask> <parallelGateway id="parallelgateway3" name="人事判断"></parallelGateway> <userTask id="servicetask5" name="人事部门同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.HumanResouceUserTaskListener"/> </extensionElements> </userTask> <endEvent id="endevent1" name="End"></endEvent> <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="parallelgateway1"></sequenceFlow> <sequenceFlow id="flow2" name="" sourceRef="parallelgateway1" targetRef="servicetask1"></sequenceFlow> <sequenceFlow id="flow3" name="" sourceRef="parallelgateway1" targetRef="servicetask2"></sequenceFlow> <sequenceFlow id="flow4" name="" sourceRef="parallelgateway1" targetRef="servicetask3"></sequenceFlow> <sequenceFlow id="flow5" name="" sourceRef="servicetask1" targetRef="parallelgateway2"></sequenceFlow> <sequenceFlow id="flow6" name="" sourceRef="servicetask2" targetRef="parallelgateway2"></sequenceFlow> <sequenceFlow id="flow7" name="" sourceRef="servicetask3" targetRef="parallelgateway3"></sequenceFlow> <sequenceFlow id="flow8" name="" sourceRef="parallelgateway2" targetRef="servicetask4"></sequenceFlow> <sequenceFlow id="flow9" name="" sourceRef="servicetask4" targetRef="parallelgateway3"></sequenceFlow> <sequenceFlow id="flow10" name="" sourceRef="parallelgateway3" targetRef="servicetask5"></sequenceFlow> <sequenceFlow id="flow11" name="" sourceRef="servicetask5" targetRef="endevent1"></sequenceFlow> </process> </definitions>
流程实现:
package com.easyway.workflow.activiti.gateway; import java.util.logging.Logger; /** * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。 *上述流程定义中,4个任务结点对应的处理类 * *<activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。 * *<userTask id="servicetask2" name="产品经理同意"> <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener"/> </extensionElements> </userTask> * * * 项目经理审批过程 * @author longgangbai * * * 2011-12-17 下午07:45:47 */ public class DeveloperManagerUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(DeveloperManagerUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask delegateTask) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + delegateTask.getVariables()); delegateTask.setVariable("项目经理", "请假天数大约3天,同意请假。"); log.info("项目经理,请假天数大约3天,同意请假。."); } }
package com.easyway.workflow.activiti.gateway; import java.util.logging.Logger; /** * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 * *<activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。 * <userTask id="servicetask5" name="人事部门同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.HumanResouceUserTaskListener"/> </extensionElements> </userTask> * 人事部门审批过程 * @author longgangbai * * 2011-12-17 下午07:45:47 */ public class HumanResouceUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(HumanResouceUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask delegateTask) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + delegateTask.getVariables()); delegateTask.setVariable("人事部门", "请假天数大约3天,同意请假。"); log.info("人事部门 ,请假天数大约3天,同意请假。"); } }
package com.easyway.workflow.activiti.gateway; import java.util.logging.Logger; /** * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 * * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。 * 配置如下 * <userTask id="servicetask4" name="项目总监同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener"/> </extensionElements> </userTask> * * * 项目总监审批过程 * @author longgangbai * * 2011-12-17 下午07:45:47 */ public class ProductBossUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(ProductBossUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask execution) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + execution.getVariables()); execution.setVariable("项目总监", "请假天数大约3天,同意请假。"); log.info("项目总监,请假天数大约3天,同意请假。"); } }
package com.easyway.workflow.activiti.gateway; import java.util.logging.Logger; /** * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。 * * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。 * * 配置如下 * <userTask id="servicetask1" name="项目经理同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener"/> </extensionElements> </userTask> * 产品经理审批过程 * @author longgangbai * * 2011-12-17 下午07:45:47 */ public class ProductManagerUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(ProductManagerUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask execution) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + execution.getVariables()); execution.setVariable("产品经理", "请假天数大约3天,同意请假。"); log.info("产品经理,请假天数大约3天,同意请假。"); } }
package com.easyway.workflow.activiti.gateway; import java.util.logging.Logger; /** * * * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。 * * * 配置如下: * <userTask id="servicetask3" name="项目组长同意" > <extensionElements> <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener"/> </extensionElements> </userTask> * 项目组长批准请假 * 模拟当开发人员请假小于3天,组长比准 * @author longgangbai * * 2011-12-17 上午09:07:37 */ public class TeamLeaderUserTaskListener implements TaskListener { private final Logger log = Logger.getLogger(TeamLeaderUserTaskListener.class.getName()); /* (non-Javadoc) * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask) */ @Override public void notify(DelegateTask execution) { try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } log.info("variavles=" + execution.getVariables()); execution.setVariable("项目组长", "请假天数小于3天,同意请假。"); log.info("项目组长,请假天数小于3天,同意请假。"); } }
package com.easyway.workflow.activiti.gateway; import junit.framework.TestCase; /** * 主要是在测试之前做一些初始化工作,主要包括流程引擎实例 * 的构建,及其流程提供的基本服务。 * 目的:让开发者熟悉工作流使用过程使用的几个步骤 * 1.加载相关的工作流全局配置文件activiti.cfg.xml配置文件信息 * 2.获取工作流相关的服务(RepositoryService,RuntimeService, * TaskService,HistoryService,FormService,ManagementService, * IdentityService等) * 2.加载工作流文件*.bpmn20.xml信息 * * 3.部署工作流 * 部署工作流由多种方式,在以后会相继讲解 * * @author longgangbai * * 2011-12-17 下午07:48:59 */ public abstract class AbstractTest extends TestCase { private ProcessEngine processEngine; protected String deploymentId; protected RepositoryService repositoryService; protected RuntimeService runtimeService; protected TaskService taskService; protected FormService formService; protected HistoryService historyService; protected IdentityService identityService; protected ManagementService managementService; /** * 测试用例开始初始化工作 * 1.创建相关的工作流程对象ProcessEngine * 2.创建相关的服务 * 3. */ @Override protected void setUp() throws Exception { super.setUp(); //由于ProcessEngine为线程安全性对象,整个项目可以共用一个 if(processEngine==null) { //此处使用此种方法调用的activiti的配置文件为 classpath路径下的activiti.cfg.xml //采用的H2的数据库 processEngine = ProcessEngines.getDefaultProcessEngine(); } //获取工作流的各种服务信息 repositoryService = processEngine.getRepositoryService(); runtimeService = processEngine.getRuntimeService(); taskService = processEngine.getTaskService(); formService = processEngine.getFormService(); historyService = processEngine.getHistoryService(); identityService = processEngine.getIdentityService(); managementService = processEngine.getManagementService(); //调用扩展的初始化工作 initialize(); } /** * test销毁方法 */ @Override protected void tearDown() throws Exception { super.tearDown(); destroy(); } /** * 便于子类的工作的初始化的扩展工作 * * * @throws Exception */ protected abstract void initialize() throws Exception; /** * 便于子类的工作的销毁的扩展工作 * * @throws Exception */ protected abstract void destroy() throws Exception; }
/** package com.easyway.workflow.activiti.gateway; import java.util.Date; /** * 测试实例如下 * * @author longgangbai * * 2011-12-18 上午12:00:03 */ public class ParallelGatewayTest extends AbstractTest { private String deploymentId; private Date start = null; private Date end = null; @Override protected void initialize() throws Exception { deploymentId = repositoryService.createDeployment() .addClasspathResource("diagrams/UserExecuteTask.bpmn20.xml") .deploy().getId(); } @Override protected void destroy() throws Exception { repositoryService.deleteDeployment(deploymentId, true); } @Deployment public void testUnbalancedForkJoin() { //获取流程实例对象 ProcessInstance pi = runtimeService.startProcessInstanceByKey("UserExecuteTask"); //获取任务服务对象的查询 TaskQuery query = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc(); //获取所有的任务 List<Task> tasks = query.list(); assertEquals(3, tasks.size()); start = new Date(); for(Task task : tasks) { //执行任务 taskService.complete(task.getId()); System.out.println("name =+"+task.getName()); end = new Date(); System.out.println("" + (end.getTime()-start.getTime()) + "ms."); } //查询任务 tasks = query.list(); assertEquals(1, tasks.size()); for(Task task : tasks) { taskService.complete(task.getId()); System.out.println("name =+"+task.getName()); end = new Date(); System.out.println("" + (end.getTime()-start.getTime()) + "ms."); } end = new Date(); System.out.println("" + (end.getTime()-start.getTime()) + "ms."); } }
运行结果:
2011-12-18 13:15:29 org.activiti.engine.ProcessEngines initProcessEnginFromResource 信息: initializing process engine for resource jar:file:/C:/activiti-rest/activiti-cfg.jar!/activiti.cfg.xml 2011-12-18 13:15:32 org.activiti.engine.impl.ProcessEngineImpl <init> 信息: ProcessEngine default created 2011-12-18 13:15:32 org.activiti.engine.ProcessEngines initProcessEnginFromResource 信息: initialised process engine default 2011-12-18 13:15:32 org.activiti.engine.impl.jobexecutor.JobAcquisitionThread run 信息: JobAcquisitionThread starting to acquire jobs 2011-12-18 13:15:32 org.activiti.engine.impl.bpmn.deployer.BpmnDeployer deploy 信息: Processing resource diagrams/UserExecuteTask.bpmn20.xml 2011-12-18 13:15:33 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes 信息: XMLSchema currently not supported as typeLanguage 2011-12-18 13:15:33 org.activiti.engine.impl.bpmn.parser.BpmnParse parseDefinitionsAttributes 信息: XPath currently not supported as expressionLanguage 2011-12-18 13:15:43 com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener notify 信息: variavles={} 2011-12-18 13:15:43 com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener notify 信息: 产品经理,请假天数大约3天,同意请假。 name =+产品经理同意 10094ms. 2011-12-18 13:15:53 com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener notify 信息: variavles={产品经理=请假天数大约3天,同意请假。} 2011-12-18 13:15:53 com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener notify 信息: 项目组长,请假天数小于3天,同意请假。 name =+项目组长同意 20172ms. 2011-12-18 13:16:03 com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener notify 信息: variavles={项目组长=请假天数小于3天,同意请假。, 产品经理=请假天数大约3天,同意请假。} 2011-12-18 13:16:03 com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener notify 信息: 项目经理,请假天数大约3天,同意请假。. name =+项目经理同意 30313ms. 2011-12-18 13:16:13 com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener notify 信息: variavles={项目组长=请假天数小于3天,同意请假。, 项目经理=请假天数大约3天,同意请假。, 产品经理=请假天数大约3天,同意请假。} 2011-12-18 13:16:13 com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener notify 信息: 项目总监,请假天数大约3天,同意请假。 name =+项目总监同意 40485ms. 40485ms.
转载于:https://www.cnblogs.com/liaojie970/p/8976051.html
Activiti手动执行的应用(UserTask)相关推荐
- 如何在 SAP BTP 上 手动执行 workflow
官网地址: https://developers.sap.com/tutorials/cp-starter-ibpm-employeeonboarding-5-run.html 访问 SAP Busi ...
- oracle定时任务会漂移,定时任务与手动执行脚本时的一个重要注意事项
今天在linux环境下做了一个定时任务,用java程序到oracle中查询数据, 手动执行脚本没有问题,但是定时任务执行时却一直报错: - java.sql.SQLException: ORA-006 ...
- activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试
activiti异步执行 一点历史 永无休止的一件事是,Activiti在某些非常大的规模的大型组织中的使用方式. 过去,这导致了各种优化和重构,其中包括异步执行器-替换旧的作业执行器. 对于未启动的 ...
- activiti自定义_在Activiti中执行自定义查询
activiti自定义 (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询 ...
- 在Activiti中执行自定义查询
(这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询API和本机查询API的用 ...
- contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常
原因: crontab 没有去读环境变量,需要再脚本中手动引入环境变量,可以用source 也可以用export 写死环境变量. 为了定时监控Linux系统CPU.内存.负载的使用情况,写了个Shel ...
- php artisan 计划任务,Laravel 定时任务 任务调度 可手动执行
1.创建一个命令 php artisan make:command TestCommand 执行成功后会提示: Console command created successfully. 生成了一个新 ...
- crontab执行脚本发邮件中文乱码,手动执行没有问题
今天写了个脚本,定时给指定邮箱发送邮件,手动执行的时候没有问题,但添加到计划任务后发送的邮件就中文乱码,变成一个不知名的附件形式: 上网查了下原因 产生原因: 这是因为Unix/Linux下使用cro ...
- Qt在手动执行xxx.exe时报错:由于找不到Qt5xxx.dll,无法继续执行代码。重新安装程序可能解决此问题。
一.问题描述. Qt在手动执行xxx.exe时报错:"由于找不到Qt5xxx.dll,无法继续执行代码.重新安装程序可能解决此问题.". 二.问题分析. 执行程序依赖库文件Qt5x ...
最新文章
- 同事把实数作为 HashMap 的key,领导发飙了...
- SAP PM 初级系列1 – 定义维护工厂和维护计划工厂
- 起风了2019-12-26
- 阿諾爾德的「常微分方程」中對「單參變換羣」的定義好像有問題
- Webdriver API (二)
- HTML设置允许冒泡,html css hover也会冒泡
- hdu 5045 Contest(状态压缩DP)
- 网管型光纤收发器功能介绍
- 论文阅读笔记二十八:You Only Look Once: Unified,Real-Time Object Detection(YOLO v1 CVPR2015)...
- 【java】蔡勒公式计算星期(switch语句方法和数组方法)
- 2017 年,最热开源静态网站生成器 TOP 20 揭晓!
- 如何成为数据分析师?数据分析师的职业路线是什么样的?
- JavaScript 和 Macromedia Flash 之间的通信示例
- cisco路由器各接口模块代表的含义是什么
- Unity3d基础教程7-灯光(灯光阴影参数设置及lightmapping制作)
- GNU工具链(GNU Toolchain)学习
- 测试用例经典设计方法之 因果图法
- 什么是Verilog HDL?
- C++ 偏微分数值计算库_SymPy 符号计算基本教程
- Windows照片查看器无法显示此照片,因为计算机上的可用内存可能不足
热门文章
- 【资源下载】清华姚班、普林斯顿博士、斯坦福大学助理教授马腾宇博士论文下载——2018ACM最佳博士论文提名
- 计算机专业必备电子书单
- 推荐系统遇上深度学习(一)--FM模型理论和实践
- LQR轨迹跟踪算法Python/Matlab算法实现_代码(2)
- GIS和RS里面的一些小问题
- apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)
- mac 用户 文件夹 权限_WIN7局域网文件分权限共享设置方法
- JDK时区与电脑系统时区不一致,导致时间new date不对
- jsp进入另一个jsp分块之后js代码失效_一个架构师的缓存修炼之路
- 爬虫-通过正则表达式爬取学校选课网站的课程