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

流程图:

流程配置:

流程实现:

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="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.");
}
}

运行结果:

 

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. .NET控件集ComponentOne 2018V3发布:新增图表动画及迷你图

    “通过使用 ComponentOne .NET控件产品,实现了兼具 BS 架构灵活性与 CS 架构的客户体验.丰富的控件满足了项目中的各种特殊需求,使得开发的精力可以专注于业务逻辑,为团队节省了时间. ...

  2. EF Code First 整不明白 继续完善

    1.Add-Migration RenameDesc  要修改列名先用这个,然后把要修改的列名手动修改一下.  多出这个文件 public partial class RenameDesc : DbM ...

  3. NPOI 导入Excel和读取Excel

    1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.NPOI是POI的C#版本,NPOI的行和列的index都是从0开始 ...

  4. _event_worldstate_team

    EventId 事件ID ID WorldStateUI.dbc第10列数字部分 TeamId 事件玩家分组,攻守(防守为1,进攻为2),自定义阵营(_faction表自定义阵营ID),公会(公会gu ...

  5. 在js文件里调用另一个js文件里的函数

    这个是我今天解决的一个小问题,我在创建界面的时候,根据不同的界面需求对应创建了不同的js文件来搭建界面,搭建完毕之后再将各个生成页面的函数汇总到主界面上,通过visibility属性切换显示,这时候出 ...

  6. dml语句和ddl语句 区别

    delete from user删除所有记录,属于dml语句,一条记录一条记录删除.事务可以作用在dml语句上的 truncate table user;删除所有记录,属于ddl语句,将表删除,然后重 ...

  7. SQL中 根据行号设置每行数据的排序数值

    根据行号自动把当前行号插入到某列中 实现排序 update tempTable set DisplayOrder = right( CAST(rownum as NVARCHAR),5) from(  ...

  8. Android application backup

    警告 AndroidMenifest中application标签下android:allowBackup="true"时,会警告: Warning:On SDK version 2 ...

  9. 学习笔记26— roc曲线(python)

    一.概念: 准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure 机器学习(ML), 自然语言处理(NLP), 信息检索(IR)等领域, 评估(E ...

  10. m_Orchestrate learning system---三十六、如何修改插件的样式(比如ueditor)

    m_Orchestrate learning system---三十六.如何修改插件的样式(比如ueditor) 一.总结 一句话总结:所有的js,html插件,修改样式无非是两种,一是直接修改css ...