`
dwj147258
  • 浏览: 195632 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Activiti工作流实例

阅读更多

      用了很久的时间找网上的例子,整合了一个比较完整的能够运行的demo,现在分享出来:

一、准备工作,

      ①开发工具eclipse

      ②需要的jar包:需要Activiti的所有先关jar包,以及spring的一些jar包,然后还需要导入一些log4j,sl4j的一些jar包,具体的可以运行看一下报什么错,然后倒入即可,这里列举一些:

commons-lang3-3.1.jar

,joda-time-2.1.jar,

jta.jar,mybatis-3.1.0.jar,

mysql-connector-java-5.1.7.jar

     ③数据库采用mysql数据库

二:配置文件

     第一个配置文件:

     activiti启动需要启动引擎,二引擎就是读取数据库中的数据,这里需要配置一个Activiti的数据库连接配置文件命名为activiti.cfg.xml,内容如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans" 
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
  
    <!-- Database configurations -->
    <property name="databaseSchemaUpdate" value="true" />
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activiti1" />
    <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUsername" value="root" />
    <property name="jdbcPassword" value="root" />
    <property name="jobExecutorActivate" value="true" />

  </bean>

</beans>

 这里需要说明几点,其实了解spring的同学就应该知道,这就是一个spring的配置文件,创建了一个bean,并注入一些属性,其中:

属性:databaseSchemaUpdate有几个取值:

flase: 默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。

true: activiti会对数据库中所有表进行更新操作。如果表不存在,则自动创建。

create_drop: 在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。

drop-create: 在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。

 

属性:jobExecutorActivate是定时任务,详细的大家可以了解http://weibo.com/kafeituzi 

 

其他的就不用说了,都是数据库连接的必要信息

 

    第二个配置是流程配置文件,也就是bpmn文件,这里命名为Interview.bpmn,具体的内容是一些流程节点以及流程的走向等等,如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:activiti="http://activiti.org/bpmn"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             targetNamespace="Examples"
             xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL
             http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd">
    <process id="Interview" name="某公司2012年实习生招聘流程">
        <documentation>招聘工作流程</documentation>
        <startEvent id="start" name="实习生招聘启动"/>
        <userTask id="bishi" name="笔试" activiti:candidateGroups="人力资源部"/>
        <sequenceFlow id="flow1" name="" sourceRef="start" targetRef="bishi"/>
        <userTask id="yimian" name="技术一面" activiti:candidateGroups="技术部"/>
        <sequenceFlow id="flow2" name="" sourceRef="bishi" targetRef="yimian"/>
        <userTask id="ermian" name="技术二面" activiti:candidateGroups="技术部"/>
        <sequenceFlow id="flow3" name="" sourceRef="yimian" targetRef="ermian"/>
        <userTask id="hrmian" name="HR面" activiti:candidateGroups="人力资源部"/>
        <sequenceFlow id="flow4" name="" sourceRef="ermian" targetRef="hrmian"/>
        <userTask id="luyong" name="录用,发放Offer" activiti:candidateGroups="人力资源部"/>
        <sequenceFlow id="flow5" name="" sourceRef="hrmian" targetRef="luyong"/>
        <endEvent id="end" name="实习生招聘结束"/>
        <sequenceFlow id="flow6" name="" sourceRef="luyong" targetRef="end"/>
    </process>

</definitions>

 三、测试代码:

     这里加载引擎有两种方式,你可以使用配置文件,也就是上面的activiti.cfg.xml来加载数据库启动引擎,也可以在代码中直接加载数据库这样就不需要activiti.cfg.xml配置文件了,下面两种方式都列出来

 

    A: 第一种: 需要配置文件

 ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();

   B: 第二种:不需配置文件

   

public void createTable() {  
	    // 工作流引擎的全部配置  
	    ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration  
	            .createStandaloneProcessEngineConfiguration();  
	  
	    // 链接数据的配置  
	    processEngineConfiguration.setJdbcDriver("com.mysql.jdbc.Driver");  
	    processEngineConfiguration  
	            .setJdbcUrl("jdbc:mysql://localhost:3306/activiti1?createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=utf8");  
	    processEngineConfiguration.setJdbcUsername("root");  
	    processEngineConfiguration.setJdbcPassword("root");  
	   
	    /* 
	     * public static final String DB_SCHEMA_UPDATE_FALSE = "false"; 
	     * 不能自动创建表,需要表存在 public static final String DB_SCHEMA_UPDATE_CREATE_DROP 
	     * = "create-drop"; 先删除表再创建表 public static final String 
	     * DB_SCHEMA_UPDATE_TRUE = "true";如果表不存在,自动创建表 
	     */  
	    //如果表不存在,自动创建表  
	    processEngineConfiguration  
	            .setDatabaseSchemaUpdate(processEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);  
	    // 工作流的核心对象,ProcessEnginee对象  
	    ProcessEngine processEngine = processEngineConfiguration  
	            .buildProcessEngine();  
	    System.out.println(processEngine);  
	  
	  
	}

 这两种方式都可以,不过到底哪一个好,相信大家都能看出来吧,接下来就是测试流程的代码了:

不多说贴出来

public void test(){
		
		// 加载配置文件
	    ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
	    RepositoryService repositoryService = processEngine.getRepositoryService();
	    RuntimeService runtimeService = processEngine.getRuntimeService();
	    repositoryService.createDeployment().addClasspathResource("Interview.bpmn").deploy();
	    String processId = runtimeService.startProcessInstanceByKey("Interview").getId();

	    TaskService taskService = processEngine.getTaskService();
	    //得到笔试的流程
	    System.out.println("\n***************笔试流程开始***************");
	    List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("人力资源部").list();
	    for (Task task : tasks) {
	        System.out.println("人力资源部的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.claim(task.getId(), "张三");
	    }

	    System.out.println("张三的任务数量:"+taskService.createTaskQuery().taskAssignee("张三").count());
	    tasks = taskService.createTaskQuery().taskAssignee("张三").list();
	    for (Task task : tasks) {
	        System.out.println("张三的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.complete(task.getId());
	    }

	    System.out.println("张三的任务数量:"+taskService.createTaskQuery().taskAssignee("张三").count());
	    System.out.println("***************笔试流程结束***************");

	    System.out.println("\n***************一面流程开始***************");
	    tasks = taskService.createTaskQuery().taskCandidateGroup("技术部").list();
	    for (Task task : tasks) {
	        System.out.println("技术部的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.claim(task.getId(), "李四");
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    for (Task task : tasks) {
	        System.out.println("李四的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.complete(task.getId());
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    System.out.println("***************一面流程结束***************");

	    System.out.println("\n***************二面流程开始***************");
	    tasks = taskService.createTaskQuery().taskCandidateGroup("技术部").list();
	    for (Task task : tasks) {
	        System.out.println("技术部的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.claim(task.getId(), "李四");
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    for (Task task : tasks) {
	        System.out.println("李四的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.complete(task.getId());
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    System.out.println("***************二面流程结束***************");

	    System.out.println("***************HR面流程开始***************");
	    tasks = taskService.createTaskQuery().taskCandidateGroup("人力资源部").list();
	    for (Task task : tasks) {
	        System.out.println("技术部的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.claim(task.getId(), "李四");
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    for (Task task : tasks) {
	        System.out.println("李四的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.complete(task.getId());
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    System.out.println("***************HR面流程结束***************");

	    System.out.println("\n***************录用流程开始***************");
	    tasks = taskService.createTaskQuery().taskCandidateGroup("人力资源部").list();
	    for (Task task : tasks) {
	        System.out.println("技术部的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.claim(task.getId(), "李四");
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    for (Task task : tasks) {
	        System.out.println("李四的任务:name:"+task.getName()+",id:"+task.getId());
	        taskService.complete(task.getId());
	    }

	    System.out.println("李四的任务数量:"+taskService.createTaskQuery().taskAssignee("李四").count());
	    System.out.println("***************录用流程结束***************");

	    HistoryService historyService = processEngine.getHistoryService();
	    HistoricProcessInstance historicProcessInstance = historyService
	            .createHistoricProcessInstanceQuery()
	            .processInstanceId(processId).singleResult();
	    System.out.println("\n流程结束时间:"+historicProcessInstance.getEndTime());
	    processEngine.close();
	}

 结束

分享到:
评论

相关推荐

    activiti工作流案例

    这个压缩包文件包含的“activiti工作流案例”是帮助初学者快速理解和实践Activiti工作流的一个实用资源。 在了解这个案例之前,我们先来认识一下Activiti的基本概念。Activiti由Alfresco Software公司开发,并在...

    activiti工作流实例

    这个工作流实例提供了关于如何在实际项目中应用 Activiti 的详细示例。由于网上关于 Activiti 的实例相对较少,这个实例对于学习和理解 Activiti 的功能和用法尤其有价值。 在 Activiti 中,工作流主要通过定义 ...

    activiti工作流实例代码

    总的来说,这个"activiti工作流实例代码"涵盖了 Activiti 的核心操作,提供了从启动流程到监控流程执行全过程的示例。开发者可以通过学习这个实例,深入理解Activiti的工作原理,并在实际项目中灵活运用,提升业务...

    Activiti工作流面试相关知识

    Activiti工作流引擎是一款开源的企业级业务流程管理(BPM)和工作流系统,它为组织提供了一种灵活、可扩展的方式来设计、执行和管理业务流程。在面试中,了解Activiti的核心服务对于理解其工作原理和实际应用至关...

    activiti 工作流实例-实现请假流程.zip

    总之,Activiti 工作流实例-实现请假流程的示例展示了如何利用 Activiti 来实现企业内部的审批流程自动化。通过学习和实践这个实例,开发者可以更好地理解和掌握 Activiti 的核心功能,并将其应用到更广泛的业务场景...

    activiti 工作流实例-实现请假流程

    这个是Activiti开发的请假流程实例,可以作为用Activiti开发工作流的参考;项目采用spring+hibernate+strus2+activity开发,可以运行;数据库采用oracle,其中 QingJia 和 QingJiaHis 是自己的业务表,分别表示 请假...

    Activiti工作流HelloWorld入门

    下面,我们将详细讲解如何创建一个简单的Activiti工作流实例。 1. **安装与配置Activiti** 在开始之前,你需要下载Activiti的发行版,通常包含Activiti Engine、Activiti Modeler和Activiti Designer等组件。安装...

    activiti工作流代码案例

    Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。 ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。 ACT_HI_*: 'HI'表示...

    activiti工作流流程跟踪图(图片(两种方式))

    Activiti是一款开源的工作流引擎,它为业务流程自动化提供了强大的支持。在开发和运维过程中,流程跟踪图是非常重要的工具,可以帮助我们理解流程的执行状态,定位问题,优化流程设计。本实例聚焦于如何生成和查看...

    Activiti工作流数据库表结构.pdf

    这些表是Activiti工作流引擎正常运作的基础,它们共同维护了工作流的执行状态,并提供了流程实例的持久化存储和查询能力。 Activiti的表结构设计使得工作流的各个组成部分之间保持了良好的解耦和集成性,方便了...

    Activiti工作流课程.pdf

    工作流管理系统是一个软件系统,它完成工作量的定义和管理,并按照在系统中预先定义好的工作流规则进行工作流实例的执行。工作流管理系统的目标是管理工作的流程,以确保工作在正确的时间被期望的人员所执行——在...

    activiti工作流课程

    ### Activiti工作流知识点概述 #### 一、工作流概念及其执行过程 1. **工作流定义**: - 工作流是指“业务过程的部分或整体在计算机应用环境下的自动化”。具体而言,它旨在通过预定义的规则来自动处理文档、信息...

    Activiti工作流示例Activiti Demo(带完整源码)非常实用

    这个"Activiti工作流示例Activiti Demo"提供了完整的源代码,帮助开发者深入理解并实际操作Activiti,从而更好地在自己的项目中应用。 在描述中提到的"Canvas动画"是指Activiti提供的可视化建模工具,它允许开发者...

    Activiti工作流使用手册操作文档

    Activiti工作流是一款开源的工作流程管理系统,主要用于企业的业务流程自动化。它基于模型驱动的设计理念,提供了丰富的API和图形化设计工具,使得开发者可以方便地创建、部署和管理工作流程。本操作手册旨在帮助...

    activiti工作流项目

    【标题】"activiti工作流项目"是一个基于Java技术栈实现的工作流管理系统示例,它集成了SpringMVC、Hibernate和Activiti等关键组件。这个项目旨在演示如何在实际应用中利用Activiti来构建动态表单和处理各种流程审批...

    activiti工作流PPT

    Activiti作为一个工作流引擎,允许开发者通过编程或使用图形化工具定义、执行和管理这些流程。 在Activiti中,流程定义是用BPMN 2.0(Business Process Model and Notation)语言编写的,这是一种国际标准,用于...

    activiti工作流中文说明文档

    Activiti工作流中文说明文档 Activiti是一个基于Apache V2协议发布的开源工作流引擎,旨在帮助开发者快速构建业务流程管理系统。本文档将对Activiti的安装、配置、使用等方面进行详细介绍,以帮助开发者快速上手...

    activiti 工作流23张表详细介绍

    ### Activiti工作流23张表详细介绍 #### 一、Activiti数据库表结构概述 Activiti是一款开源的工作流引擎,其强大的流程管理能力使得它在众多业务场景中得到广泛应用。为了更好地理解Activiti如何存储流程数据,本...

    Activiti工作流详细讲解完整教程.pdf

    根据提供的文件信息,我们可以深入探讨Activiti工作流框架的相关知识点。 ### Activiti工作流框架概述 Activiti工作流框架是一款由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架。它以其灵活性、易用...

    activiti工作流测试

    Activiti工作流测试是针对Activiti这一开源工作流引擎进行的一种实践操作,旨在帮助开发者理解和掌握如何在实际项目中运用Activiti。Activiti是一个轻量级、高效且灵活的业务流程管理(BPM)系统,它能够处理业务...

Global site tag (gtag.js) - Google Analytics