Activiti工作流demo

标签: activiti 工作流 demo | 发表时间:2016-09-03 07:06 | 作者:u013037201
出处:http://blog.csdn.net

继上篇《 Activiti工作流的环境配置

       前几篇对Activiti工作流进行了介绍,并讲解了其环境配置。本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货。

一、demo业务分析

       以HelloWorld程序为例。

      首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功。接下来用Actitivi工作流来实现业务。

二、新建项目

        首先新建一个Activiti项目,目录结构如下。

       

三、画流程图

        在diagrams下新建一个Activiti Diagram:右击diagrams->new->others->Activiti Diagram

        然后画流程图:

         指派各活动节点的分派人:分别为张三,李四,王五。

四、配置环境

        引jar包,建数据库建表,配置日志文件,参考上篇博文《Activiti工作流的环境配置》

五、新建HelloWorld类

        配置好环境后,新建HelloWorld类,代码如下。

<span style="font-size:18px;">package cn.itcast.a_helloworld;


import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;

public class HelloWorld {
	
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	
	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition(){
		Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
			.createDeployment() //创建一个部署对象
			.name("helloworld入门程序")//添加部署的名称
			.addClasspathResource("diagrams/helloword.bpmn")//从classpath的资源中加载,一次只能加载一个文件
			.addClasspathResource("diagrams/helloword.png")//从classpath的资源中加载,一次只能加载一个文件
			.deploy(); //完成部署
		System.out.println("部署ID:"+deployment.getId());  //1
		System.out.println("部署名称"+deployment.getName()); //helloworld入门程序
		
	}
	
	/**启动流程实例**/
	@Test
	public void startProcessInstance(){
		//流程定义的key
		String processDefinitionKey ="helloworld";
		ProcessInstance pi = processEngine.getRuntimeService()//与正在执行	的流程实例和执行对象相关的Service
						.startProcessInstanceByKey(processDefinitionKey);  //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
		System.out.println("流程实例ID:"+pi.getId());
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
	}
	
	/**查询当前人的个人任务*/
	@Test
	public void findMyPersonalTask(){
		String assignee = "张三";
		 List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询
						.taskAssignee(assignee)//指定个人任查询,指定办理人
						.list();
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("############################################");
			}
		}
	}
	
	/**完成我的任务*/
	@Test
	public void completeMyPersonalTask(){
		//任务ID
		String taskId = "11402";
		processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.complete(taskId);
		System.out.println("完成任务:任务ID:"+taskId);
	}
}
</span>
        分开来讲:

1、部署流程定义

<span style="font-size:18px;">	/**部署流程定义*/
	@Test
	public void deploymentProcessDefinition(){
		Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的Service
			.createDeployment() //创建一个部署对象
			.name("helloworld入门程序")//添加部署的名称
			.addClasspathResource("diagrams/helloword.bpmn")//从classpath的资源中加载,一次只能加载一个文件
			.addClasspathResource("diagrams/helloword.png")//从classpath的资源中加载,一次只能加载一个文件
			.deploy(); //完成部署
		System.out.println("部署ID:"+deployment.getId()); //1
		System.out.println("部署名称"+deployment.getName()); //helloworld入门程序
		
</span>

       执行完后,4张表中的数据:

      1)act_re_deployment (部署信息表)

      2)act_re_procdef(流程定义数据表)


      3)act_ge_bytearray(二进制数组表)

       4)act_ge_property(属性数据表)


2、启动流程实例

<span style="font-size:18px;">/**启动流程实例**/
	@Test
	public void startProcessInstance(){
		//流程定义的key
		String processDefinitionKey ="helloworld";
		ProcessInstance pi = processEngine.getRuntimeService()//与正在执行	的流程实例和执行对象相关的Service
						.startProcessInstanceByKey(processDefinitionKey);  //使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
		System.out.println("流程实例ID:"+pi.getId());//流程实例ID   101
		System.out.println("流程定义ID:"+pi.getProcessDefinitionId());//流程定义ID
	}</span>
           执行完后四张表中的数据:

         1)act_ru_execution(运行时流程执行实例表)


         2)act_ru_task(运行时任务节点表)

         3)act_identitylink(运行时流程人员表)

         4)act_hi_taskinst(历史任务实例表)


         5)act_hi_procinst(历史流程实例表)


         6)act_hi_identitylink(历史流程人员表)

 

         7)act_hi_actinst(历史节点表)


         8)act_ge_property

         从上图中可以看出变化,next.dbid的VALUE_值由原来的101变为201,REV_由原来的2变为3。

        

3、查询当前人的个人任务

<span style="font-size:18px;">/**查询当前人的个人任务*/
	@Test
	public void findMyPersonalTask(){
		String assignee = "张三";
		 List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
						.createTaskQuery()//创建任务查询
						.taskAssignee(assignee)//指定个人任查询,指定办理人
						.list();
		if(list!=null && list.size()>0){
			for(Task task:list){
				System.out.println("任务ID:"+task.getId());
				System.out.println("任务名称:"+task.getName());
				System.out.println("任务的创建时间:"+task.getCreateTime());
				System.out.println("任务的办理人:"+task.getAssignee());
				System.out.println("流程实例ID:"+task.getProcessInstanceId());
				System.out.println("执行对象ID:"+task.getExecutionId());
				System.out.println("流程定义ID:"+task.getProcessDefinitionId());
				System.out.println("############################################");
			}
		}
	}</span>
        执行完后,能够从运行时任务节点表中查询出相关的信息并显示出来。与上面同理,act_ge_property的两个值分别又变了。

        

4、完成我的任务

<span style="font-size:18px;">    /**完成我的任务*/
    @Test
    public void completeMyPersonalTask(){
        //任务ID
        String taskId = "104";//运行时任务ID
        processEngine.getTaskService()//与正在执行的任务管理相关的Service
                        .complete(taskId);
        System.out.println("完成任务:任务ID:"+taskId);
    }</span>
        执行完后,表的变化。

       1)act_ru_task


       从上表中可以看出完成张三的任务后,张三的任务消失,李四的任务显示在表中。

        2)act_ru_identitylink


      从上表中可以看出多了一条李四的用户数据。

      3)act_hi_actinst


        从上表中可以看出多了一条李四的节点数据。

        同理act_hi_identitylink也会多一条李四的用户数据, ac_hi_taskinst多一条李四的任务数据。

        然后完成李四的任务,到王五同理;完成王五的任务后张三申请成功,同理,但是运行时表的数据会全部清除,act_hi_procinst的结束相关字段会更新。至此,整个申请结束。


        这是Activiti工作流的一个小demo,大家可以参照着实践一下。下面是本demo及更多demo源码下载的地址: http://download.csdn.net/detail/u013037201/9559857

          

作者:u013037201 发表于2016/9/2 23:06:24 原文链接
阅读:65 评论:0 查看评论

相关 [activiti 工作流 demo] 推荐:

Activiti工作流demo

- - CSDN博客综合推荐文章
继上篇《 Activiti工作流的环境配置》.        前几篇对Activiti工作流进行了介绍,并讲解了其环境配置. 本篇将会用一个demo来展示Activiti工作流具体的体现,直接上干货.        以HelloWorld程序为例.       首先说一下业务流程,员工张三提交了一个申请,然后由部门经理李四审核,审核通过后再由总经理王五审核,通过则张三申请成功.

activiti工作流使用

- - 行业应用 - ITeye博客
activiti 开发流程. JBPM 与 Activiti. jBPM项目于2002年3月由Tom Baeyens发起,2003年12月发布1.0版本. 2004年10月18日,发布了2.0版本,并在同一天加入了JBoss. 2011 年 jBPM的创建者Tom Baeyens离开JBoss了, 他的离开产生了两个结果:.

activiti工作流引擎思想探究

- - 开源软件 - ITeye博客
       研究activiti有一阵了,逐渐了解了开源activiti的相关api,但对期中的processinstanceId,executeId,taskId相关应用还是有些模糊,得益于activiti开源技术推广者临远同志的启发,明白了很多工作流引擎的核心思想源自佩特里网(英语:Petri net),采用token机制来执行流程.

Activiti 工作流会签开发设计思路

- - ITeye博客
Activiti 工作流会签开发设计思路. 在流程业务管理中,任务是通常都是由一个人去处理的,而多个人同时处理一个任务,这种任务我们称之为会签任务. 这种业务需求也很常见,如一个请款单,领导审批环节中,就需要多个部门领导签字. 在流程业务中,我们可以把每个领导签字的环节都定义为任务,但若这样,这个流程业务有一点是固定的,就是签批人是固定的.

Activiti用户指南之Activiti的API

- - ITeye博客
 一、流程引擎的API和服务(services).      引擎的API是影响Activiti最常见的一种方法. 我们一开始最关注的中心是ProcessEngine,像之前描述的那样,流程引擎可以被多种方式创建. 从这个流程引擎里面,你能获得各个包含workflow/BPM方法的服务. 流程引擎和这些获得的服务是线程安全的.

Activiti学习笔记

- - 企业架构 - ITeye博客
第一个Activiti的HelloWorld. 获取核心ProcessEngine对象 2. 根据需求,获取对应的服务实例 3. 使用服务方法,做事情 * * @author Administrator * */ public class HelloWorld {. // 加载核心API ProcessEngine.

Activiti - 设置会签

- - 企业架构 - ITeye博客
前些天在群里聊工作流和Activiti,群里有人分享了自己的工作流引擎开源项目,大伙纷纷问这问那(比如为什么突然自己搞个process engine、有没有eclipse plugin、能不能绘制流程图等等). 现实生活中的工作流程,我们也经常碰到需要会签的情况,支持会签是很必要的. 正好有两个人问道:支持会签吗.

ACTIVITI 学习笔记 - 监听

- - 企业架构 - ITeye博客
ACTIVITI 学习笔记 - 监听. 所有分发的事件都是org.activiti.engine.delegate.event.ActivitiEvent的子类. 监听器监听的流程引擎已经创建完毕,并准备好接受API调用. 监听器监听的流程引擎已经关闭,不再接受API调用. 创建了一个新实体,初始化也完成了.

Activiti安装配置(转)

- - 企业架构 - ITeye博客
原文地址:http://blog.csdn.net/zhang_xinxiu/article/details/38655311. 有一段时间没有更新文章了,虽然有一直在写文章,可是一直没有更新到博客内,这段时间写的文章大多还是以技术为主. 接下来的系列文章将会来讨论企业工作流的开发,主要是来研究开源工作流Activiti的使用.

Activiti入门篇之二 Spring 与Activiti的入门整合

- - 行业应用 - ITeye博客
Activiti相对Jbpm来说,与Spring整合更加完美,具体可见本文的详细介绍. 1.     Maven的环境任务,请参考第一篇 (Activiti入门篇—Maven的环境准备). 2.     Activiti的Eclipse插件安装.               插件更新地址:http://activiti.org/designer/update/.