工作流模拟某公司请假流程情景如下:
   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)相关推荐

  1. 如何在 SAP BTP 上 手动执行 workflow

    官网地址: https://developers.sap.com/tutorials/cp-starter-ibpm-employeeonboarding-5-run.html 访问 SAP Busi ...

  2. oracle定时任务会漂移,定时任务与手动执行脚本时的一个重要注意事项

    今天在linux环境下做了一个定时任务,用java程序到oracle中查询数据, 手动执行脚本没有问题,但是定时任务执行时却一直报错: - java.sql.SQLException: ORA-006 ...

  3. activiti异步执行_对基于消息队列的Activiti异步执行器进行基准测试

    activiti异步执行 一点历史 永无休止的一件事是,Activiti在某些非常大的规模的大型组织中的使用方式. 过去,这导致了各种优化和重构,其中包括异步执行器-替换旧的作业执行器. 对于未启动的 ...

  4. activiti自定义_在Activiti中执行自定义查询

    activiti自定义 (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想要共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询 ...

  5. 在Activiti中执行自定义查询

    (这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想共享它了) Activiti API允许使用高级API与数据库进行交互. 例如,对于检索数据,查询API和本机查询API的用 ...

  6. contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常

    原因: crontab 没有去读环境变量,需要再脚本中手动引入环境变量,可以用source 也可以用export 写死环境变量. 为了定时监控Linux系统CPU.内存.负载的使用情况,写了个Shel ...

  7. php artisan 计划任务,Laravel 定时任务 任务调度 可手动执行

    1.创建一个命令 php artisan make:command TestCommand 执行成功后会提示: Console command created successfully. 生成了一个新 ...

  8. crontab执行脚本发邮件中文乱码,手动执行没有问题

    今天写了个脚本,定时给指定邮箱发送邮件,手动执行的时候没有问题,但添加到计划任务后发送的邮件就中文乱码,变成一个不知名的附件形式: 上网查了下原因 产生原因: 这是因为Unix/Linux下使用cro ...

  9. Qt在手动执行xxx.exe时报错:由于找不到Qt5xxx.dll,无法继续执行代码。重新安装程序可能解决此问题。

    一.问题描述. Qt在手动执行xxx.exe时报错:"由于找不到Qt5xxx.dll,无法继续执行代码.重新安装程序可能解决此问题.". 二.问题分析. 执行程序依赖库文件Qt5x ...

最新文章

  1. 同事把实数作为 HashMap 的key,领导发飙了...
  2. SAP PM 初级系列1 – 定义维护工厂和维护计划工厂
  3. 起风了2019-12-26
  4. 阿諾爾德的「常微分方程」中對「單參變換羣」的定義好像有問題
  5. Webdriver API (二)
  6. HTML设置允许冒泡,html css hover也会冒泡
  7. hdu 5045 Contest(状态压缩DP)
  8. 网管型光纤收发器功能介绍
  9. 论文阅读笔记二十八:You Only Look Once: Unified,Real-Time Object Detection(YOLO v1 CVPR2015)...
  10. 【java】蔡勒公式计算星期(switch语句方法和数组方法)
  11. 2017 年,最热开源静态网站生成器 TOP 20 揭晓!
  12. 如何成为数据分析师?数据分析师的职业路线是什么样的?
  13. JavaScript 和 Macromedia Flash 之间的通信示例
  14. cisco路由器各接口模块代表的含义是什么
  15. Unity3d基础教程7-灯光(灯光阴影参数设置及lightmapping制作)
  16. GNU工具链(GNU Toolchain)学习
  17. 测试用例经典设计方法之 因果图法
  18. 什么是Verilog HDL?
  19. C++ 偏微分数值计算库_SymPy 符号计算基本教程
  20. Windows照片查看器无法显示此照片,因为计算机上的可用内存可能不足

热门文章

  1. 【资源下载】清华姚班、普林斯顿博士、斯坦福大学助理教授马腾宇博士论文下载——2018ACM最佳博士论文提名
  2. 计算机专业必备电子书单
  3. 推荐系统遇上深度学习(一)--FM模型理论和实践
  4. LQR轨迹跟踪算法Python/Matlab算法实现_代码(2)
  5. GIS和RS里面的一些小问题
  6. apache php 工作模式,PHP Apache中两种工作方式区别(CGI模式、Apache 模块DLL)
  7. mac 用户 文件夹 权限_WIN7局域网文件分权限共享设置方法
  8. JDK时区与电脑系统时区不一致,导致时间new date不对
  9. jsp进入另一个jsp分块之后js代码失效_一个架构师的缓存修炼之路
  10. 爬虫-通过正则表达式爬取学校选课网站的课程