`
dwj147258
  • 浏览: 194699 次
  • 性别: 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工作流知识点概述 #### 一、工作流概念及其执行过程 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)系统,它能够处理业务...

    Activiti工作流视频(企业开发实例讲解)

    传智播客_Activiti工作流视频(企业开发实例讲解)传智播客_Activiti工作流视频(企业开发实例讲解)传智播客_Activiti工作流视频(企业开发实例讲解)

Global site tag (gtag.js) - Google Analytics