工作流模拟某公司请假流程情景如下:
   1.开发人员请假流程,如果开发人员请假,如果请假天数小于3天,组长批准,人事批准即可请假。
   2.如果请假大约三天,需要项目经理或者产品经理批准,并且项目总监批准

流程图:

流程配置:

流程实现:

  1. package com.easyway.workflow.activiti.gateway;
  2.  
  3. import java.util.logging.Logger;
  4. /**
  5. * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。
  6. * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:
    在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。
  7. *上述流程定义中,4个任务结点对应的处理类
  8. *
  9. *<activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:
    在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。
  10. *
  11. *<userTask id="servicetask2" name="产品经理同意">
  12. <extensionElements>
  13. <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductManagerUserTaskListener"/>
  14. </extensionElements>
  15. </userTask>
  16. *
  17. *
  18. * 项目经理审批过程
  19. * @author longgangbai
  20. *
  21. *
  22. * 2011-12-17 下午07:45:47
  23. */
  24. public class DeveloperManagerUserTaskListener implements TaskListener
  25. {
  26.  
  27. private final Logger log = Logger.getLogger(DeveloperManagerUserTaskListener.class.getName());
  28.  
  29. /* (non-Javadoc)
  30. * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask)
  31. */
  32. @Override
  33. public void notify(DelegateTask delegateTask) {
  34. try {
  35. Thread.sleep(10000);
  36. } catch (InterruptedException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. log.info("variavles=" + delegateTask.getVariables());
  41. delegateTask.setVariable("项目经理", "请假天数大约3天,同意请假。");
  42. log.info("项目经理,请假天数大约3天,同意请假。.");
  43.  
  44. }
  45. }
  1. package com.easyway.workflow.activiti.gateway;
  2.  
  3. import java.util.logging.Logger;
  4. /**
  5. * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。
  6. *
  7. * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:
    在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。
  8.  
  9. * 配置如下
  10. * <userTask id="servicetask4" name="项目总监同意" >
  11. <extensionElements>
  12. <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.ProductBossUserTaskListener"/>
  13. </extensionElements>
  14. </userTask>
  15. *
  16. *
  17. * 项目总监审批过程
  18. * @author longgangbai
  19. *
  20. * 2011-12-17 下午07:45:47
  21. */
  22. public class ProductBossUserTaskListener implements TaskListener {
  23.  
  24. private final Logger log = Logger.getLogger(ProductBossUserTaskListener.class.getName());
  25.  
  26. /* (non-Javadoc)
  27. * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask)
  28. */
  29. @Override
  30. public void notify(DelegateTask execution) {
  31. try {
  32. Thread.sleep(10000);
  33. } catch (InterruptedException e) {
  34. // TODO Auto-generated catch block
  35. e.printStackTrace();
  36. }
  37. log.info("variavles=" + execution.getVariables());
  38. execution.setVariable("项目总监", "请假天数大约3天,同意请假。");
  39. log.info("项目总监,请假天数大约3天,同意请假。");
  40.  
  41. }
  42. }
  1. package com.easyway.workflow.activiti.gateway;
  2.  
  3. import java.util.logging.Logger;
  4. /**
  5. * execute方法的参数DelegateExecution execution可以在流程中各个结点之间传递流程变量。
  6. *
  7. * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:
    在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。
  8.  
  9. *
  10. * 配置如下
  11. * <userTask id="servicetask1" name="项目经理同意" >
  12. <extensionElements>
  13. <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.DeveloperManagerUserTaskListener"/>
  14. </extensionElements>
  15. </userTask>
  16. * 产品经理审批过程
  17. * @author longgangbai
  18. *
  19. * 2011-12-17 下午07:45:47
  20. */
  21. public class ProductManagerUserTaskListener implements TaskListener {
  22.  
  23. private final Logger log = Logger.getLogger(ProductManagerUserTaskListener.class.getName());
  24.  
  25. /* (non-Javadoc)
  26. * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask)
  27. */
  28. @Override
  29. public void notify(DelegateTask execution) {
  30. try {
  31. Thread.sleep(10000);
  32. } catch (InterruptedException e) {
  33. // TODO Auto-generated catch block
  34. e.printStackTrace();
  35. }
  36. log.info("variavles=" + execution.getVariables());
  37. execution.setVariable("产品经理", "请假天数大约3天,同意请假。");
  38. log.info("产品经理,请假天数大约3天,同意请假。");
  39.  
  40. }
  41. }
  1. package com.easyway.workflow.activiti.gateway;
  2.  
  3. import java.util.logging.Logger;
  4. /**
  5. *
  6. *
  7. * <activiti:taskListener>元素的event属性,它一共包含三种事件:"create"、"assignment"、"complete",分别表示结点执行处理逻辑的时机为:
    在处理类实例化时、在结点处理逻辑被指派时、在结点处理逻辑执行完成时,可以根据自己的需要进行指定。
  8. *
  9. *
  10. * 配置如下:
  11. * <userTask id="servicetask3" name="项目组长同意" >
  12. <extensionElements>
  13. <activiti:taskListener event="complete" class="com.easyway.workflow.activiti.gateway.TeamLeaderUserTaskListener"/>
  14. </extensionElements>
  15. </userTask>
  16.  
  17. * 项目组长批准请假
  18. * 模拟当开发人员请假小于3天,组长比准
  19. * @author longgangbai
  20. *
  21. * 2011-12-17 上午09:07:37
  22. */
  23. public class TeamLeaderUserTaskListener implements TaskListener {
  24.  
  25. private final Logger log = Logger.getLogger(TeamLeaderUserTaskListener.class.getName());
  26.  
  27. /* (non-Javadoc)
  28. * @see org.activiti.engine.delegate.TaskListener#notify(org.activiti.engine.delegate.DelegateTask)
  29. */
  30. @Override
  31. public void notify(DelegateTask execution) {
  32. try {
  33. Thread.sleep(10000);
  34. } catch (InterruptedException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. log.info("variavles=" + execution.getVariables());
  39. execution.setVariable("项目组长", "请假天数小于3天,同意请假。");
  40. log.info("项目组长,请假天数小于3天,同意请假。");
  41. }
  42. }
  1. package com.easyway.workflow.activiti.gateway;
  2.  
  3. import junit.framework.TestCase;
  4. /**
  5. * 主要是在测试之前做一些初始化工作,主要包括流程引擎实例
  6. * 的构建,及其流程提供的基本服务。
  7. * 目的:让开发者熟悉工作流使用过程使用的几个步骤
  8. * 1.加载相关的工作流全局配置文件activiti.cfg.xml配置文件信息
  9. * 2.获取工作流相关的服务(RepositoryService,RuntimeService,
  10. * TaskService,HistoryService,FormService,ManagementService,
  11. * IdentityService等)
  12. * 2.加载工作流文件*.bpmn20.xml信息
  13. *
  14. * 3.部署工作流
  15. * 部署工作流由多种方式,在以后会相继讲解
  16. *
  17. * @author longgangbai
  18. *
  19. * 2011-12-17 下午07:48:59
  20. */
  21. public abstract class AbstractTest extends TestCase {
  22.  
  23. private ProcessEngine processEngine;
  24. protected String deploymentId;
  25. protected RepositoryService repositoryService;
  26. protected RuntimeService runtimeService;
  27. protected TaskService taskService;
  28. protected FormService formService;
  29. protected HistoryService historyService;
  30. protected IdentityService identityService;
  31. protected ManagementService managementService;
  32.  
  33. /**
  34. * 测试用例开始初始化工作
  35. * 1.创建相关的工作流程对象ProcessEngine
  36. * 2.创建相关的服务
  37. * 3.
  38. */
  39. @Override
  40. protected void setUp() throws Exception {
  41. super.setUp();
  42. //由于ProcessEngine为线程安全性对象,整个项目可以共用一个
  43. if(processEngine==null) {
  44. //此处使用此种方法调用的activiti的配置文件为 classpath路径下的activiti.cfg.xml
  45. //采用的H2的数据库
  46. processEngine = ProcessEngines.getDefaultProcessEngine();
  47. }
  48. //获取工作流的各种服务信息
  49. repositoryService = processEngine.getRepositoryService();
  50. runtimeService = processEngine.getRuntimeService();
  51. taskService = processEngine.getTaskService();
  52. formService = processEngine.getFormService();
  53. historyService = processEngine.getHistoryService();
  54. identityService = processEngine.getIdentityService();
  55. managementService = processEngine.getManagementService();
  56. //调用扩展的初始化工作
  57. initialize();
  58.  
  59. }
  60.  
  61. /**
  62. * test销毁方法
  63. */
  64. @Override
  65. protected void tearDown() throws Exception {
  66. super.tearDown();
  67. destroy();
  68. }
  69.  
  70. /**
  71. * 便于子类的工作的初始化的扩展工作
  72. *
  73. *
  74. * @throws Exception
  75. */
  76. protected abstract void initialize() throws Exception;
  77. /**
  78. * 便于子类的工作的销毁的扩展工作
  79. *
  80. * @throws Exception
  81. */
  82. protected abstract void destroy() throws Exception;
  83. }
  1. /**
  2. package com.easyway.workflow.activiti.gateway;
  3. import java.util.Date;
  4. /**
  5. * 测试实例如下
  6. *
  7. * @author longgangbai
  8. *
  9. * 2011-12-18 上午12:00:03
  10. */
  11. public class ParallelGatewayTest extends AbstractTest {
  12. private String deploymentId;
  13. private Date start = null;
  14. private Date end = null;
  15.  
  16. @Override
  17. protected void initialize() throws Exception {
  18. deploymentId = repositoryService.createDeployment()
  19. .addClasspathResource("diagrams/UserExecuteTask.bpmn20.xml")
  20. .deploy().getId();
  21. }
  22.  
  23. @Override
  24. protected void destroy() throws Exception {
  25. repositoryService.deleteDeployment(deploymentId, true);
  26. }
  27.  
  28. @Deployment
  29. public void testUnbalancedForkJoin() {
  30. //获取流程实例对象
  31. ProcessInstance pi = runtimeService.startProcessInstanceByKey("UserExecuteTask");
  32. //获取任务服务对象的查询
  33. TaskQuery query = taskService.createTaskQuery().processInstanceId(pi.getId()).orderByTaskName().asc();
  34. //获取所有的任务
  35. List<Task> tasks = query.list();
  36. assertEquals(3, tasks.size());
  37. start = new Date();
  38.  
  39. for(Task task : tasks) {
  40. //执行任务
  41. taskService.complete(task.getId());
  42. System.out.println("name =+"+task.getName());
  43. end = new Date();
  44. System.out.println("" + (end.getTime()-start.getTime()) + "ms.");
  45. }
  46. //查询任务
  47. tasks = query.list();
  48. assertEquals(1, tasks.size());
  49. for(Task task : tasks) {
  50. taskService.complete(task.getId());
  51. System.out.println("name =+"+task.getName());
  52. end = new Date();
  53. System.out.println("" + (end.getTime()-start.getTime()) + "ms.");
  54. }
  55. end = new Date();
  56. System.out.println("" + (end.getTime()-start.getTime()) + "ms.");
  57. }
  58. }

运行结果:

 

Activiti手动执行的应用(UserTask)的更多相关文章

  1. jeecg安装——mysql数据库创建+手动执行初始化脚本

    国产的开源项目官方文档写得那么详细,已经是很厚道了,可惜俺这种菜鸟还是会碰到各种"小"问题,做个笔记先! 1.新建数据库: CREATE DATABASE jeecg DEFAUL ...

  2. crontab执行脚本中文乱码,手动执行没有问题

    crontab执行脚本中文乱码,手动执行没有问题 产生原因:       这是因为Unix/Linux下使用crontab时的运行环境已经不是用户环境了,因此原本用户下的一些环境变量的设置就失效了.例 ...

  3. JBPM4入门——7.等待节点的单条线手动执行

    本博文只是简要对JBPM4进行介绍,如需更详细内容请自行google 链接: JBPM入门系列文章: JBPM4入门——1.jbpm简要介绍 JBPM4入门——2.在eclipse中安装绘制jbpm流 ...

  4. 是否需要手动执行DataContext的Dispose方法?

    我们知道DataContext实现了IDisposable接口.在C#中,凡是实现了IDisposable接口的类,都推荐的使用using语句.如下: using (DataContext db = ...

  5. linux定时任务执行没结果,手动执行有结果问题总结

    今天写了个脚本手动执行有结果,但是放到系统定时任务跑却没结果,之前也遇到这种问题解决了没记录后面又懵逼了一次~~~ 如下图: 手动执行有结果 放到定时任务中每五分钟执行一次 解决方法: 脚本中加载系统 ...

  6. crontab 定时执行脚本出错,但手动执行脚本正常

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

  7. crontab运行python不生效,但是手动执行正常的问题和解决方案

    crontab运行python不生效,但是手动执行正常的问题和解决方案 linux默认装的是python2.7,安装了其他版本后直接执行没问题,但在crontab里执行不了,需要使用全路径. 使用 w ...

  8. Hbase 手动执行MajorCompation

    说明: Major Compaction 的作用: 1.将一个Region下的所有StoreFile合并成一个StoreFile文件 2.对于删除.过期.多余版本的数据进行清除 由于MajorComp ...

  9. Laravel 定时任务 任务调度 可手动执行

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

随机推荐

  1. Python cmd中输入'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。

    配置一下环境变量,找到 添加一下Scripts文件夹的路径,如:这是我的路径C:\Users\ck\AppData\Local\Programs\Python\Python36 就是你python的安 ...

  2. 【BZOJ】1832: [AHOI2008]聚会

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1832 省选出出了CF的感觉..... 显然一发贪心,如果两个点显然就是他们的$LCA$(不 ...

  3. hdu 2108 Shape of HDU 判断是否为凸多边形

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pro ...

  4. 导入dmp文件时,需要删除原有ORACLE数据库实例

    导入dmp文件时,对于已存在的数据库实例及表处理方式:删除实例. 1.以管理员身份登录 sqlplus / as sysdba 2.停止实例 shutdown abort; 执行结果:ORACLE i ...

  5. uni-app去掉h5端的导航栏

    找到项目的根目录下的pages.json文件,添加一下内容,可以去掉对应页面的导航栏 附上代码 "app-plus":{ "titleNView": false ...

  6. 排序——选择排序(java描述)

    百度百科的描述如下:选择排序(Selection sort)是一种简单直观的排序算法.它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元 ...

  7. nRF52832-PPI部分学习

    PPI部分学习思维导图 PPI原理 1.1PPI简介 PPI实现的就是通过初始化配置,将不同外设的事件和任务连接起来,让事件自动去触发任务的功能,PPI有多个通道, 每个通道包含一个EEP和TEP,使 ...

  8. DataGrid的列上添加日期控件

    今天的使用EasyUI datagrid的时候,遇到了如下问题,如下图:

  9. Rest数据服务查询类-根据id查询

    Rest数据服务查询类 需要iserver data服务支持,但请求的时候,不依赖SuperMap js lib包. 构造函数:QueryById=function(p_params): p_para ...

  10. js怎么把一个数组里面的值作为一个属性添加到另一数组包含的对象里(小程序)

    上面这个需求我说的似乎不太明白,之前也是没有碰到过,也是最近在搞小程序,涉及到小程序前后台数据交互,展示的部分!!不太明白没关系等会我给大家举个例子,就明白了说起来有点拗口,一看就明白了,其实如果是原 ...