zoukankan      html  css  js  c++  java
  • 【Activiti学习之一】Activiti入门

    环境
      JDK1.7
      MySQL5.6
      Tomcat7
      Eclipse-Luna
      activiti 6.0

    一、概念
    1、工作流(Workflow):是一系列相互衔接、自动进行的业务活动或任务。采用工作流软件,使用者只需在电脑上填写有关表单,会按照定义好的流程自动往下跑,下一级审批者将会收到相关资料,并可以根据需要修改、跟踪、管理、查询、统计、打印等,大大提高了效率。
    2、BPMN即业务流程建模与标注(Business Process Model and Notation,BPMN) ,描述流程的基本符号,包括这些图元如何组合成一个业务流程图(Business Process Diagram)。
    BPMN是BPM及workflow的建模语言标准之一。


    3、Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。

    二、Activiti 6.0 介绍
    1、7大接口
    RepositoryService:提供一系列管理流程部署和流程定义的API。
    RuntimeService:在流程运行时对流程实例进行管理与控制。
    TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
    IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
    ManagementService:提供对流程引擎进行管理和维护的服务。
    HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
    FormService:表单服务。

    2、28张表
    (1)act_ge_ 通用数据表,ge是general的缩写
    (2)act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口
    (3)act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口
    (4)act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
    (5)act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据


    二、官网示例
    1、activiti-admin.war 用于管理web服务(登录用户/密码:admin / admin,URL:http://localhost:8080/activiti-admin)

    2、activiti-app.war 用于测试示例web服务(登录用户/密码:admin / test,URL:http://localhost:8080/activiti-app)

    3、activiti-rest.war Activiti提供的一组可以直接操作工作流引擎的REST API接口服务(登录用户/密码:kermit/kermit,URL:http://localhost:8080/activiti-rest/docs/#/)

     

    三、开发环境搭建

    1、安装eclipse安装activiti插件

    插件地址:http://download.eclipse.org/modeling/emf/updates/releases/

    安装成功示意图:

    配置 创建流程后要保存流程设计图

    2、这里使用传统单体应用为例,可以使用maven,后面文章会有介绍。
    创建java工程,将从官网下载的activiti-6.0.0.zip中libs目录下的jar全部拷贝到工程中,并加载进去。

    四、编写第一个Activiti程序:请假流程
    1、设计流程文件
    使用*.bpmn或者*.bpmn20.xml

    2、配置流程引擎
    引入下面文件:activiti.cfg.xml,实质就是一个spring配置文件.

    读取默认配置文件:activiti.cfg.xml
    ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResourceDefault();
    读取指定配置文件
    ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("my-activiti1.xml");
    读取指定配置文件和配置bean
    ProcessEngineConfiguration config = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("my-activiti2.xml", "test");

    <?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 -->
        <bean id="processEngineConfiguration"
            class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/act" />
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
            <property name="jdbcUsername" value="root" />
            <property name="jdbcPassword" value="123456" />
            <property name="databaseSchemaUpdate" value="true" />
            <property name="history" value="activity" />
            <property name="mailServerHost" value="smtp.163.com"></property>
            <property name="mailServerPort" value="25"></property>
            <property name="mailServerDefaultFrom" value="yangenxiong@163.com"></property>
            <property name="mailServerUsername" value="yangenxiong@163.com"></property>
            <property name="mailServerPassword" value="123456"></property>
        </bean>
    </beans>

    (1)定义了一个数据库连接,这里我们使用mysql,注意要提前引入mysql jdbc依赖包,mysql里创建数据库:act,activiti可以支持的关系型数据库:MySQL、Oracle、PostgresSQL、DB2、MSSQL,默认使用内存数据库H2

    (2)databaseSchemaUpdate 有4个值:

    false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
    true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
    create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
    drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。

    (3)Activiti 提供了 history 属性对其进行配置
    none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
    activity:级别高于 none,保存流程实例与流程行为,其他数据不保存。
    audit:除 activity 级别会保存的数据外,还会保存全部的流程任务及其属性。audit为 history 的默认值。
    full:保存历史数据的最高级别,除了会保存 audit 级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。

    (4)Activiti 支持邮件服务,当流程执行到某一个节点时,Activiti会根据流程文件配置(EmailTask),发送邮件到相应的邮箱。
    mailServerHost:邮件服务器地址,非必填,默认值为 localhost。
    mailServerPort:SMTP 发送邮件服务器端口,默认值为 25。
    mailServerDefaultFrom: 非必填, 发送人的邮箱地址, 默认值为 activiti@activiti.org。
    mailServerUsername:邮箱登录用户名。
    mailServerPassword:邮箱登录密码。
    mailServerUseSSL:是否使用 SSL 协议通信,默认为 false。
    mailServerUseTLS:是否使用 TLS 协议通信,默认为 false。

    编写java:

    package com.wjy.act;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.RuntimeService;
    import org.activiti.engine.TaskService;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    
    public class FirstAct {
    
        public static void main(String[] args) {
            
            ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
            
            //关闭引擎
            engine.close();
            System.exit(0);
        }
    }

    执行完成之后,看一下数据库act里创建了28张表.

    3、请假流程示例
    完整代码:

    package com.wjy.act;
    
    import org.activiti.engine.ProcessEngine;
    import org.activiti.engine.ProcessEngines;
    import org.activiti.engine.RepositoryService;
    import org.activiti.engine.RuntimeService;
    import org.activiti.engine.TaskService;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    
    public class FirstAct {
    
        public static void main(String[] args) {
            
            ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
            // 存储服务
            RepositoryService rs = engine.getRepositoryService();
            // 运行时服务
            RuntimeService runService = engine.getRuntimeService();
            // 任务服务
            TaskService taskService = engine.getTaskService();
            //加载流程文件 一次可以部署多个流程
            rs.createDeployment().addClasspathResource("vacation.bpmn").deploy();
            //启动流程  流程实例
            ProcessInstance pi = runService.startProcessInstanceByKey("myProcess");
            
            // 普通员工完成请假的任务
            Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
            System.out.println("当前流程节点:" + task.getName());
            taskService.complete(task.getId());
            
            // 经理审核任务
            task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
            System.out.println("当前流程节点:" + task.getName());
            taskService.complete(task.getId());
            
            task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
            System.out.println("流程结束后:" + task);
            //关闭引擎
            engine.close();
            System.exit(0);
        }
    }

    执行日志:

    03:26:47,741 [main] INFO  org.activiti.engine.ProcessEngines  - Initializing process engine using configuration 'file:/E:/workspace/sparkws/first-act/bin/activiti.cfg.xml'
    03:26:47,743 [main] INFO  org.activiti.engine.ProcessEngines  - initializing process engine for resource file:/E:/workspace/sparkws/first-act/bin/activiti.cfg.xml
    03:26:48,223 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Found 1 auto-discoverable Process Engine Configurators
    03:26:48,224 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Found 1 Process Engine Configurators in total:
    03:26:48,224 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - class org.activiti.management.jmx.JMXConfigurator (priority:10000)
    03:26:48,224 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Executing beforeInit() of class org.activiti.management.jmx.JMXConfigurator (priority:10000)
    03:26:49,773 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Found compatibility handler instance : class org.activiti.compatibility.DefaultActiviti5CompatibilityHandler
    03:26:49,773 [main] INFO  org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl  - Executing configure() of class org.activiti.management.jmx.JMXConfigurator (priority:10000)
    03:26:49,959 [main] INFO  org.activiti.engine.impl.db.DbSqlSession  - performing create on engine with resource org/activiti/db/create/activiti.mysql.create.engine.sql
    03:26:49,960 [main] INFO  org.activiti.engine.impl.db.DbSqlSession  - Found MySQL: majorVersion=5 minorVersion=6
    03:26:49,979 [jmxConnectorStarterThread] INFO  org.activiti.management.jmx.DefaultManagementAgent  - JMX Connector thread started and listening at: service:jmx:rmi:///jndi/rmi://PC-20190528ODKR:1099/jmxrmi/activiti
    03:27:14,557 [main] INFO  org.activiti.engine.impl.db.DbSqlSession  - performing create on history with resource org/activiti/db/create/activiti.mysql.create.history.sql
    03:27:14,558 [main] INFO  org.activiti.engine.impl.db.DbSqlSession  - Found MySQL: majorVersion=5 minorVersion=6
    03:27:18,765 [main] INFO  org.activiti.engine.impl.db.DbSqlSession  - performing create on identity with resource org/activiti/db/create/activiti.mysql.create.identity.sql
    03:27:18,765 [main] INFO  org.activiti.engine.impl.db.DbSqlSession  - Found MySQL: majorVersion=5 minorVersion=6
    03:27:20,539 [main] INFO  org.activiti.engine.impl.ProcessEngineImpl  - ProcessEngine default created
    03:27:20,603 [main] INFO  org.activiti.engine.ProcessEngines  - initialised process engine default
    当前流程节点:write vacation
    当前流程节点:Audit
    流程结束后:null

    表act_ge_bytearray会存储部署的流程:


    参考:
    基于BPMN2.0的工作流(Workflow
    BPMN2.0规范 
    Activiti6简明教程
    Activiti官方用户手册 
    相关软件下载

  • 相关阅读:
    C++中简单使用HPSocket time
    error: cannot lock ref ‘refs/remotes/origin/[branch]’

    linux 挂载移动硬盘
    音频读写
    无法连接NVIDIA驱动
    nodejs
    read the docs
    用 scp 在 linux 之间传输文件
    配置 frp 常用功能
  • 原文地址:https://www.cnblogs.com/cac2020/p/11496771.html
Copyright © 2011-2022 走看看