zoukankan      html  css  js  c++  java
  • activity(工作流)初步学习记录

    1.概念

     

    工作流(Workflow),就是“业务过程的部分或整体在计算机应用环境下的自动化”,它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行,从而实现某个预期的业务目标,或者促使此目标的实现”。

    2.Activity介绍

      

    Activiti5是由Alfresco软件在2010年5月17日发布的业务流程管理(BPM)框架,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。Activiti基于Apache许可的开源BPM平台,创始人Tom Baeyens是JBoss jBPM的项目架构师,它特色是提供了eclipse插件,开发人员可以通过插件直接绘画出业务

    流程图。

    3.工作流引擎

    ProcessEngine对象,这是Activiti工作的核心。负责生成流程运行时的各种实例及数据、监控和管理流程的运行。

    4:数据库

    Activiti数据库支持:

    Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

    ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

    ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

    ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。

    ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

    ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。

    4.1表结构

    资源库流程规则表

    1) act_re_deployment 部署信息表

    2) act_re_model   流程设计模型部署表

    3) act_re_procdef   流程定义数据表

    运行时数据库表

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

    2) act_ru_identitylink 运行时流程人员表,主要存储任务节点与参与者的相关信息

    3) act_ru_task 运行时任务节点表

    4) act_ru_variable 运行时流程变量数据表

    历史数据库表

    1) act_hi_actinst 历史节点表

    2) act_hi_attachment 历史附件表

    3) act_hi_comment 历史意见表

    4) act_hi_identitylink 历史流程人员表

    5) act_hi_detail 历史详情表,提供历史变量的查询

    6) act_hi_procinst 历史流程实例表

    7) act_hi_taskinst 历史任务实例表

    8) act_hi_varinst 历史变量表

    组织机构表

    1) act_id_group 用户组信息表

    2) act_id_info 用户扩展信息表

    3) act_id_membership 用户与用户组对应信息表

    4) act_id_user 用户信息表

    这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足

    通用数据表

    1) act_ge_bytearray 二进制数据表

    2) act_ge_property 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录

    5.activiti.cfg.xml(activiti的配置文件)

    Activiti核心配置文件,配置流程引擎创建工具的基本参数和数据库连接池参数。

    定义数据库配置参数:

    jdbcUrl: 数据库的JDBC URL。
    jdbcDriver: 对应不同数据库类型的驱动。
    jdbcUsername: 连接数据库的用户名。
    jdbcPassword: 连接数据库的密码。
    基于JDBC参数配置的数据库连接 会使用默认的MyBatis连接池。 下面的参数可以用来配置连接池(来自MyBatis参数):
    jdbcMaxActiveConnections: 连接池中处于被使用状态的连接的最大值。默认为10。

    jdbcMaxIdleConnections: 连接池中处于空闲状态的连接的最大值。

    jdbcMaxCheckoutTime: 连接被取出使用的最长时间,超过时间会被强制回收。 默认为20000(20秒)。

    jdbcMaxWaitTime: 这是一个底层配置,让连接池可以在长时间无法获得连接时, 打印一条日志,并重新尝试获取一个连接。(避免因为错误配置导致沉默的操作失败)。 默认为20000(20秒)。

    6.准备工作

      1.下载activity(Activity官网下载)

      http://activiti.org/download.html

      2.Eclipse安装流程设计器插件

      在有网络情况下:

        打开 Help -> Install New Software,如下图:

        

      点击Add按钮,装配新插件名称的地址,填下以下字段

        

      Name: Activiti BPMN 2.0 designer

      Location: http://activiti.org/designer/update/

      

        回到Install界面,在面板正中列表中把所有展示出来的项目都勾上,并且把下图红色框框的勾上,它会检查所有当前安装所需要的插件并可以被Eclipse下载

     

      安装完以后,点击新建工程new->Other…打开面板,如果看到下图:说明安装插件已经成功。

    下面是准备开发环境:

    在activiti-5.22->wars目录下是一些示例项目,解压activiti-rest项目,导入activiti-rest目录中WEB-INFlib下所有包。添加到classpath中。

    由于我们使用的是Mysql数据库,Mysql数据库的链接驱动Activiti官方包中并没有提供,需要我们自己导入。手动导入mysql-connector-java.jar,添加到classpath下。(本人用的用maven工程导入依赖)

    初始化数据库:

    复制代码
    @Test
        public  void test() {
            //1.创建Activity配置对象的实例
            ProcessEngineConfiguration configuration  = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
            //2.设置数据库连接信息
            //设置数据库地址
            configuration.setJdbcUrl("jdbc:mysql://localhost:3306/activity?createDatabaseIfNotExist=true");
            //数据库驱动
            configuration.setJdbcDriver("com.mysql.jdbc.Driver");
            //用户名
            configuration.setJdbcUsername("root");
            //密码
            configuration.setJdbcPassword("");
            //设置数据建表策略
            /**
             *DB_SCHEMA_UPDATE_TRUE 如果不存在表就创建表,存在表就使用
             */
            configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
            //3.使用配置对象创建流程引擎实例(检查数据库等连接环境)
            ProcessEngine processEngine = configuration.buildProcessEngine();
            System.out.println(processEngine);
        }
    复制代码

    执行成功,数据库会生成25张表。

    (在Actiiti5中定制流程必定会操作到数据库,如果都像上面那样写一大段代码会非常麻烦,所以我们可以把数据库连接配置写入配置文件。一个类似spring结构的配置文件,清空内容后改名为activiti.cfg.xml,用来做流程引擎的相关配置。主要定义了数据库连接和建表策略。)

    下面是配置文件连接数据库与创建表的过程:

    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"
      xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
      xmlns:jee="http://www.springframework.org/schema/jee" xmlns:aop="http://www.springframework.org/schema/aop"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
           
        <bean id="processEngineConfiguration" class=" org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
            <!--数据库连接设置  -->
            <property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
            <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/activity2"></property>
            <property name="jdbcUsername" value="root"></property>
            <property name="jdbcPassword" value=""></property>
            <!--建表策略-->
            <property name="databaseSchemaUpdate" value="true"></property>
        </bean>
      
    </beans>
    复制代码

    需要把log4j.properties添加到resource

    测试类:

    复制代码
    /**
         * 使用配置文件
         */
        @Test
        public void test2() throws Exception{
            ProcessEngine processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml").buildProcessEngine();
            System.out.println(processEngine);
        }
    复制代码

    下一步:

     创建helloword.bpmn,同时这是一个xml文件,创建完后会生成一张流程图的(不一一描述)

    下面是第一个入门程序编写模拟

    复制代码
    //调用引擎,初始化
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        /**
         * 部署流程定义
         */
        @Test
        public void deployment() {
            Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署相关的Service
                    .createDeployment()//创建一个部署对象
                    .name("helloword")//添加部署的名称
                    .addClasspathResource("diagrams/helloword.bpmn")//从classpath下加载资源,一次一个
                    .addClasspathResource("diagrams/helloword.png")
                    .deploy();//完成部署
                System.out.println("部署ID"+deployment.getId());//1
                System.out.println("部署名称"+deployment.getName());
        }
        
        /**
         *启动流程实例
         */
        @Test
        public void startProcessInstance() {
            String processDefinitionKey = "helloword";
            ProcessInstance processInstance = processEngine.getRuntimeService()//与正在执行的流程实例和执行对象相关的Service
                    .startProcessInstanceByKey(processDefinitionKey);//根据Key值来查询流程,也可以根据ID
            System.out.println("流程实例ID:"+processInstance.getId());  //2501
                                                                        //对应数据库act_ru_execution
            System.out.println("流程定义ID:"+processInstance.getProcessDefinitionId()); //helloword:1:4
                                                                                    //对应数据库act_re_deployment
        }
        
        /**
         * 查询当前个人的任务
         */
        @Test
        public void fingByPerson() {
            String assignee = "张三";
            List<Task> list = processEngine.getTaskService()//与正在执行的任务管理相关的Service
                    .createTaskQuery()//创建任务查询对象
                    .taskAssignee(assignee)//指定个人任务查询,指定代理人
                    .list();//以list形式记录对象
            if(list != null && list.size()>0) {
                for(Task task:list) {
                    System.out.println("任务ID:"+task.getId());//2501
                    System.out.println("任务名称:"+task.getName());//提交申请
                    System.out.println("任务的创建时间:"+task.getCreateTime());//Wed Jun 06 18:12:15 CST 2018
                    System.out.println("任务的代理人:"+task.getAssignee());//张三
                    System.out.println("流程实例ID:"+task.getProcessInstanceId());//2501
                    System.out.println("执行对象ID:"+task.getExecutionId());//2501
                    System.out.println("流程定义ID:"+task.getProcessDefinitionId());//helloword:1:4
                }
            }
        }
        
        /**
         * 完成个人任务
         */
        @Test
        public void complete() {
            String taskId = "2504";
            processEngine.getTaskService()
                .complete(taskId );
            System.out.println("完成任务ID:"+taskId);
        }
    复制代码

    以上代码模拟了一个流程执行的流程:部署----启动流程实例-----查询当前正在执行的流程-----然后提交,当前(提交申请)的流程结束----会转到下一个流程执行者处理。

    张三提交申请完成:

    会把流程传送到部门经理(李四)审核,李四审核后传到总经理王五审核

     数据库会记录流程的信息

  • 相关阅读:
    Django(app的概念、ORM介绍及编码错误问题)
    Django(完整的登录示例、render字符串替换和redirect跳转)
    Construct Binary Tree from Preorder and Inorder Traversal
    Single Number II
    Single Number
    Binary Tree Level Order Traversal II
    Binary Tree Level Order Traversal
    Binary Tree Zigzag Level Order Traversal
    Recover Binary Search Tree
    Add Binary
  • 原文地址:https://www.cnblogs.com/sea520/p/13645289.html
Copyright © 2011-2022 走看看