流程变量赋值

jbpm4_variable表中的流程变量的数据,会随着一个流程实例的消失而被删除。

任务分析

任务执行人:

  1. 某一个任务的执行人可以固定在流程图中

  2. 在流程图中,在进入节点之前,必须通过流程变量给applicator赋值

  3. 在进入该任务节点以后,才要给该任务节点赋值执行人

    实现方式有两种:

    1. 可以通过程序的方式来实现
    2. 在配置文件中,当整个流程进入节点后,会立即执行class属性中类中的assign方法

组任务

概念:

当进入一个任务节点时,很多人都有执行该任务的权限,但只要有一个人执行完毕以后,这个任务就结束了。

实现:

  1. 可以在配置文件中配置task。task就是组任务,可以对组任务进行一些操作:根据候选人查询组任务、根据组任务查询候选人、接受任务等。

    缺点:任务的候选人是固定的。

  2. 可以通过代码的形式动态的添加任务的候选人

  3. 可以在配置文件中,在assignment-handler节点类属性中可以操作数据库把候选人从数据库提取出来。

    缺点:此类不能和spring容器关联也不能和servlet容器关联,可以利用hibernate或jdbc技术来完成。

在工作流中的角色、人的概念

有组的概念

组里有相应的人

建立组和人的关联

以上操作涉及3张表:jbpm4_id_group、jbpm4_id_user、jbpm4_id_menbership。

在api中并没有做到group和user的关联

泳道

  1. 在配置文件中声明一个泳道
  2. 在任务节点中指向泳道

transition

选择流程去处

state

活跃的流程实例

decision

判断节点

forkjoin

多人会签,建立主任务和多个子任务,子任务与主任务绑定,指定的会签人完成子任务,每次完成子任务时判断主任务的子任务还剩几个,当所有子任务完成,主任务进入下一节点。

event

事件监听器,监听start和end事件

spring与jbpm的整合原理

让spring容器产生processEngine

步骤:

  1. 编辑pom.xml文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <dependency>
    <groupId>org.jbpm.jbpm4</groupId>
    <artifactId>jbpm</artifactId>
    <version>4.4</version>
    </dependency>
    <dependency>
    <groupId>org.jbpm.jbpm4</groupId>
    <artifactId>jbpm-api</artifactId>
    <version>4.4</version>
    </dependency>
    <dependency>
    <groupId>org.jbpm.jbpm4</groupId>
    <artifactId>jbpm-jpdl</artifactId>
    <version>4.4</version>
    </dependency>
    <dependency>
    <groupId>org.jbpm.jbpm4</groupId>
    <artifactId>jbpm-pvm</artifactId>
    <version>4.4</version>
    </dependency>
    <dependency>
    <groupId>org.jbpm.jbpm4</groupId>
    <artifactId>jbpm-log</artifactId>
    <version>4.4</version>
    </dependency>
    //jbpm私服的路径
    <repositories>
    <repository>
    <id>appfuse-snapshots</id>
    <url>http://oss.sonatype.org/content/repositories/appfuse-snapshots</url>
    <releases>
    <enabled>false</enabled>
    </releases>
    <snapshots>
    <enabled>true</enabled>
    </snapshots>
    </repository>
    <repository>
    <id>Jboss-JBPM-Repositories</id>
    <name>JbossJBPM</name>
    <url>http://repository.jboss.org/nexus/content/groups/public</url>
    </repository>
    </repositories>
  2. 在src/main/resources中建立一个package为jbpm

    在jbpm下的jbpm.cfg.xml文件

    1
    2
    把原来的<import resource="jbpm.tx.hibernate.cfg.xml" />替换成
    <import resource="jbpm.tx.spring.cfg.xml" />
  3. 把jbpm的相关的映射文件加入到hibernate.cfg.xml文件中

    1
    2
    3
    4
    5
    <mapping resource="jbpm.repository.hbm.xml" />
    <mapping resource="jbpm.execution.hbm.xml" />
    <mapping resource="jbpm.history.hbm.xml" />
    <mapping resource="jbpm.task.hbm.xml" />
    <mapping resource="jbpm.identity.hbm.xml" />
  4. 在spring的配置文件中引入processEngine

    1
    2
    3
    4
    <bean id="springHelper" class="org.jbpm.pvm.internal.processengine.SpringHelper">
    <property name="jbpmCfg" value="jbpm/jbpm.cfg.xml"></property>
    </bean>
    <bean id="processEngine" factory-bean="springHelper" factory-method="createProcessEngine" />
  5. 测试processEngine:启动tomcat服务器

黑马报名系统分析

流程表和业务数据表分开

  1. 学生在前台

    注册,经历整个流程的所有的申请

    分析:

    1. 在提交某一个具体的课程的时候,启动流程实例
    2. 可以提交自荐信
  2. 咨询员后台

    对各个环节学生提交的信息进行审批,并且打分

技术分析:

  1. 不管是学生还是咨询员登录系统后,都能查询到当前正在执行的任务。

    根据执行的任务–>executionId—>Process Instance—>piid–>和相关的数据表就能关联在一起了

  2. jbpm表做流程控制的作用,而系统的表是用来存储数据的,他们之间经过piid进行关联。

  3. 对各个审批节点的候选人做如下处理

    1
    2
    3
    4
    5
    <task g="258,153,92,52" name="自荐信审批">
    <assignment-handler class="com.itheimaoa.domain.process.MyAssignmentHandler"/>
    <transition g="2,-28" name="to 提交入学考试" to="提交入学考试"/>
    <transition g="336,98:-83,-17" name="to 提交自荐信" to="提交自荐信"/>
    </task>

    每一个审批节点的候选人都是由MyAssignmentHandler来赋值的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @Override
    public void assign(Assignable assignable, OpenExecution execution) throws Exception {
    Connection conn=JDBCUtils.getConnection();
    String jpql = " select eid from employee";
    Statement st = conn.createStatement();
    ResultSet rs = st.executeQuery(jpql);
    while(rs.next()){
    assignable.addCandidateUser(String.valueOf(rs.getInt("eid")));
    }
    }