zoukankan      html  css  js  c++  java
  • 工作流--JBPM核心服务及表结构

    一、      使用JBPM开发工作流的一般流程

    1.       jBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库。只要是Hibernate支持的数据库,jBPM就支持。数据库的初始化可以由jBPM自动完成,也可以通过ant generate.ddl任务生成SQL语句,在jBPM外部自己创建所需的表。  

    2.       使用jPdl定义工作流,生成processdinination.xml文件。可以采用GUI工具gpdl,但目前只支持jBPM1.0,而且bug很多。XMLDTD定义文件在jBPM下载包中。  

    3.       Antcreate.pde生成pde包的工作目录。将processdinination.xml文件和其它需要的文件放在指定的目录下,使用ant build.precess.archives生成pde包。pde包的格式采用jar  

    4.       更改pde工作目录/src/config/jbpm.properties的相关属性,主要是设定相关的数据库连接信息。注意要将数据库的JDBC驱动放在pde工作目录的lib目录下。  

    5.       Antdeploy.process.archives将刚才生成的pde部署到数据库。实际上就是向数据库插入一些相关数据。 

    6.       利用jBPM API函数开发相应的工作流程。

    二、提供的服务

    JBPM为了支持相应的开发,提供了一组服务,如下图:


    -管理流程定义

         -部署流程定义

         -删除流程定义

         -查询流程定义

     

    public class HelloTest extends TestCase {  
          
        ProcessEngine processEngine;      
          
        public setup() {  
            processEngine = Configuration.getProcessEngine();  
        }  
          
        public void testDeploy(){  
            RepositoryService rs = processEngine.getRepositoryService();  
              
            //发布流程定义  
            String deploymentId=rs.createDeployment().  
            addResourceFromClasspath("helloworld.jpdl.xml").deploy();  
              
            //获得流程定义          
            List<ProcessDefinition> list=rs.createProcessDefinitionQuery().list();  
            System.out.println("list.size():"+list.size());  
            for (ProcessDefinition pd : list) {  
                System.out.println("pd.id:"+pd.getId());  
            }  
              
            System.out.println("deploymentId:"+deploymentId);  
            //删除流程定义  
            rs.deleteDeploymentCascade(deploymentId);  
            //删除后查询流程定义  
            System.out.println("after del list count:" + rs.createProcessDefinitionQuery().list().size());                 
        }  
    }  

    -管理流程实例

         -发起新流程

         -执行等待流程

         -查看流程实例

         -终止流程实例

         -删除流程实例

     

    public class ProcessInstanceTest extends TestCase {  
      
        ProcessEngine processEngine;  
          
        public ProcessInstanceTest() {  
            processEngine = Configuration.getProcessEngine();  
        }  
        @Override  
        protected void setUp() throws Exception {  
            processEngine.getRepositoryService().createDeployment()  
            .addResourceFromClasspath("helloworld.jpdl.xml").deploy();  
        }  
          
        /** 
         * 流程实例state节点向下执行 
         */  
        public void testProcessInstance(){  
            ExecutionService es= processEngine.getExecutionService();  
            //流程实例  
            ProcessInstance pi = es.startProcessInstanceByKey("helloworld");  
            //state向下执行  
            pi= es.signalExecutionById(pi.getId());  
            System.out.println("pi.isEnded"+pi.isEnded());  
        }  
          
        /** 
         * 终止流程实例 
         */  
        public void testProcessInstanceEnd(){  
            ExecutionService es= processEngine.getExecutionService();         
            //流程实例  
            ProcessInstance pi = es.startProcessInstanceByKey("helloworld");  
            //终止流程实例  
            es.endProcessInstance(pi.getId(), "结束流程");  
        }  
          
        /** 
         * 删除流程实例 
         */  
        public void testProcessInstanceDel(){  
            ExecutionService es= processEngine.getExecutionService();         
            //流程实例  
            ProcessInstance pi = es.startProcessInstanceByKey("helloworld");  
            //删除流程实例  
            es.deleteProcessInstanceCascade(pi.getId());  
        }  
          
        /** 
         * 流程实例列表 
         */  
        public void testProcessInstanceList(){  
            ExecutionService es= processEngine.getExecutionService();         
            //流程实例  
            ProcessInstance pi = null;  
            for (int i = 0; i < 10; i++) {  
                pi= es.startProcessInstanceByKey("helloworld");           
            }  
            //查询流程实例列表  
            List<ProcessInstance> list= es.createProcessInstanceQuery().list();  
            //输出列表数到控制台  
            System.out.println("list.size:"+list.size());  
        }     
    }  

    三、      JBPM表结构介绍

    资源库和运行时表结构

    1.       JBPM4_DEPLOYMENTJBPM4_DEPLOYPROPJBPM4_LOB存储流程定义相关的部署信息 

    2.       JBPM4_EXECUTION主要是存放JBPM4的执行信息,Execution机制代替了JBPM3Token机制 

    3.       JBPM4_TASK存放需要人来完成的Activities(活动),需要人来参与完成的Activity 被称为Task 

    4.       JBPM4_PARTICIPATION参与者表,存放参与者信息,参与者的种类有CandidateClientOwnerReplaced AssigneeViewer。而具体的参与者既可以是单一用户,也可以是用户组 

    5.       JBPM4_SWIMLANE泳道表。SwimLane是一种Runtime Process Role。通过SwimLane,多个Task可以一次分配到同一Actor身上 JBPM4_JOB  存放的是Timer 的定义 JBPM4_VARIABLE 存的是进行时的临时变量。

    历史数据库表结构

    1.       JBPM4_HIST_PROCINST流程实例历史表

    2.       JBPM4_HIST_ACTINST流程节点(活动)历史表

    3.       JBPM4_HIST_DETAIL保存流程实例、活动实例、任务实例运行过程中历史明细数据

    4.       JBPM4_HIST_VAR保存历史的流程变量数据

    5.       JBPM4_HIST_TASK保存历史的任务实例记录

    身份认证表

    1.       JBPM4_ID_GROUP用户组表

    2.       JBPM_ID_MEMBERSHIP保存用户和用户组之间的关联关系

    3.       JBPM4_ID_USER用户表

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

    引擎参数表

    1.       JBPM4_PROPERTY引擎参数表,记录JBPM的一些引擎参数,会保存一些初始设定的种子数据;例如引擎版本(KEY=db.version ,ID生成器版本(KEY=next.dbid)KEY:引擎KEY,比如next.dbid 下次执行的DBID_VERSION:版本号、VALUE:对应的引擎KEYVALUE

    执行流程后,数据库表变化情况:

    发布一个流程deploy后:

    jbpm4_deployment新增一条记录

    jbpm4_deployprop新增三条记录

    jbpm4_lob新增两条记录

     

    开始一个流程startProcessInstanceByKey后:

    jbpm4_execution新增一条记录

    jbpm4_hist_actinst新增一条记录

    jbpm4_hist_procinst新增一条记录

    jbpm4_hist_task新增一条记录

    jbpm4_task新增一条记录

  • 相关阅读:
    【SSO单点系列】(1):CAS4.0 环境的搭建
    Docker学习总结之Run命令介绍
    使用 RMI + ZooKeeper 实现远程调用框架
    JAVA CAS单点登录(SSO)
    web应用中Spring ApplicationContext的动态更新
    Java 中 String、StringBuffer、StringBuilder 三者之间的区别
    static final 、static 、final 区别
    static Java 关键字 简单理解
    final Java 关键字 深入浅出,简单理解
    进程 线程 简单理解说明
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3165687.html
Copyright © 2011-2022 走看看