• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

JBPM基础知识

武飞扬头像
BoltBear
帮助1

01 JBPM基础知识
1、入学共5个环节:提交自荐信—>提交基础测试—>申请入学考试—>提交入学考试题—>面试。。

2、工作流:
①指定流程:在指定流程的过程中,会经历很多版本。
②流程正式启动
③启动流程实例
④申请
⑤审批
⑥流程结束
注:虽然利用数据库也可以控制业务流程,但是设计的表通用性不强,根据业务可能需要经常性的进行变更。

3、注:activiti是jbpm4的升级版本,jbpm5是jboss推出的一个与jbpm4相差很大的版本。
jbpm4使用流程:
①画流程图:用eclipse提供的插件
②把流程图部署到jbpm引擎中
③启动流程实例
④发起申请
⑤审批
注:如果没有轮到李四审批,李四是看不到任务的。
在申请和审批的过程中会产生一些数据。
安装jbpm 4 Process Definition只要能在src右击New能看到jBPM 4 Process Definition就说明安装成功了。

4、画流程图的流程
创建一个应用程序——>画流程图获得*.jpdl.xml,*.png,这两个文件一起称为流程定义文档——>部署到jbpm引擎中(①通过部署,把流程定义文档放入到了数据库中②启动流程实例③申请④审批)——>通过hibernate技术部署到DB上。
注:学习JBPM重点在于:①流程定义文档XML②JBPM API③数据库的结构(重点)

5、画流程图

02 使用JBPM
1、导入Jar包
导入jbpm.jar包核心包以及其他lib包(注:某些包不需要导入)。

2、将定义文档以及hibernate链接文件以及映射文件放在src目录下。

注:jbpm.hibernate.cfg.xml中涉及的映射文件都可以在jbpm.jar中找到。

3、修改jbpm.hibernate.cfg.xml

<?xml version ="1.0" encoding="utf-8" ?>

 <property name="hibernate.dialect" >org.hibernate.dialect.MySQLInnoDBDialect</property >
 <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</ property>
 <property name="hibernate.connection.url" >jdbc:mysql://localhost:3306/jbpm</ property>
 <property name="myeclipse.connecion.profile" >mysql</ property>
 <property name="hibernate.connection.username" >root</ property>
 <property name="hibernate.connection.password" >sorry</ property>
 <property name="hibernate.hbm2ddl.auto" >update</ property>
 <property name="hibernate.show_sql" >true</ property>
 <property name="current_session_context_class" >thread</ property>

 <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、创建18张表
cn.itheima.jbpm.test.CreateTable.java
public class CreateTable {
@Test
public void testTable (){
Configuration configuration = new Configuration();
configuration.configure( “jbpm.hibernate.cfg.xml”);
configuration.buildSessionFactory();
}
}

5、将定义文档部署到数据库中。
cn.itheima.jbpm.test.BaseJbpm.java
public class BaseJbpm {
public static ProcessEngine processEngine;
static{
processEngine = Configuration.getProcessEngine ();
}
}

cn.itheima.jpbm.test.PDManagerTest.java
public class PDManagerTest extends BaseJbpm{
/**
* 流程定义管理
* 1、部署流程定义文档
* 2、查看流程图
* 3、查询
* 部署的查询
* 流程定义的查询
* 4、删除
*/
@Test
public void testDeploy(){
processEngine.getRepositoryService()
.createDeployment()
.addResourceFromClasspath( “qingjia.jpdl.xml”)
.addResourceFromClasspath( “qingjia.png”)
.deploy();
}
}

6、执行效果

03 JBPM部署和流程定义的表结构分析
1、涉及到的表
<1>JBPM4_DEPLOYMENT
部署表:用来描述一次部署的
每部署一次,该表中增加一行记录
DBID_:主键 部署ID

<2>JPBM4_LOB
数据仓库表:xml文件和png图片都存在这里
BLOB_VALUE:存放数据
DEPLOYMENT_:部署ID 可以通过部署ID查找到JBPM4_LOB表中的内容
NAME_:文件的路径和名称

<3>JBPM4_PROPERTY

<4>JBPM4_DEPLOYPROP
部署属性表
KEY:_
langid 流程定义语言的版本
pdkey 流程定义的名称,等同于pdname
pdversion 流程定义版本
如果pdkey不变,每部署一次,版本号加1
如果pdkey发生改变,则版本号从1开始计算
pdid {pdkey}–{pdversion}
不管部署几次,pdid是唯一的
deploymentID和pdid:一个deploymentID对应一个pdid。
把握以下几个字段就可以确定一个流程定义:pdid,langid,pdkey,pdversion

注:
bpm:business process management
jbpm:jboss business process management
pdl:process definition language
jpdl:jboss process definition language

04 JBPM的三种部署方式
cn.itheima.jbpm.test.PDManagerTest.java
public class PDManagerTest extends BaseJbpm{

   @Test
   public void testDeployFromClassPath(){
         processEngine.getRepositoryService()
        .createDeployment()
        .addResourceFromClasspath( "qingjia.jpdl.xml")
        .addResourceFromClasspath( "qingjia.png")
        .deploy();
  }
  
   @Test
   public void testDeployFromInputStream(){
        InputStream xmlInputStream = this.getClass().getClassLoader().getResourceAsStream("qingjia.jpdl.xml");
        InputStream pngInputStream = this.getClass().getClassLoader().getResourceAsStream("qingjia.png");
         processEngine.getRepositoryService()
        .createDeployment()
        .addResourceFromInputStream( "qingjia.jpdl.xml", xmlInputStream)
        .addResourceFromInputStream( "qingjia.png", pngInputStream)
        .deploy();
  }
  
   @Test
   public void testDeployFromZipInputStream (){
        ZipInputStream zipInputStream = new ZipInputStream(this .getClass().getClassLoader().getResourceAsStream("qingjia.zip"));
         processEngine.getRepositoryService()
        .createDeployment()
        .addResourcesFromZipInputStream(zipInputStream)
        .deploy();
  }
学新通

}
05 JBPM的部署和流程定义的相关操作
1、部署的查询
/**

  • 部署的查询
    */
    @Test
    public void testQueryDeployment(){
    List list = processEngine.getRepositoryService()
    .createDeploymentQuery()
    .list();
    for(Deployment deployment : list){
    System. out.println(deployment.getId());
    System. out.println(deployment.getState());
    }
    }

执行结果:

2、根据deploymentId查询部署
/**

  • 根据deploymentId查询部署
    */
    @Test
    public void testQueryDeploymentById(){
    Deployment deployment = processEngine.getRepositoryService()
    .createDeploymentQuery()
    .deploymentId( “40001”)
    .uniqueResult();

    System. out.println(deployment.getId());
    System. out.println(deployment.getState());
    }

执行结果:

3、查询所有的流程定义
/**

  • 查询所有的流程定义
    */
    @Test
    public void testQueryAllPD(){
    List list = processEngine.getRepositoryService()
    .createProcessDefinitionQuery()
    .list();
    for(ProcessDefinition pd : list){
    System. out.println(“deploymentId:” pd.getDeploymentId());
    System. out.println(“pdKey:” pd.getKey());
    System. out.println(“pkVersion:” pd.getVersion());
    System. out.println(“pdid:” pd.getId());
    }
    }

4、根据deploymentID查询流程定义
/**

  • 根据deploymentID查询流程定义
    */
    @Test
    public void testQueryPDByDeploymentId(){
    ProcessDefinition pd = processEngine.getRepositoryService()
    .createProcessDefinitionQuery()
    .deploymentId( “40001”)
    .uniqueResult();
    System. out.println(“deploymentId:” pd.getDeploymentId());
    System. out.println(“pdKey:” pd.getKey());
    System. out.println(“pkVersion:” pd.getVersion());
    System. out.println(“pdid:” pd.getId());
    }
    注:还可以根据pdid、pdkey来对流程定义进行查询。
    执行结果:

5、把某一个流程定义文件保存在某一个位置
/**

  • 把某一个流程保存在某一个位置
  • @throws IOException
    */
    @Test
    public void testSavePng() throws IOException{
    InputStream inputStream = processEngine.getRepositoryService()
    .getResourceAsStream( “40001”, “qingjia.png” );
    OutputStream outputStream = new FileOutputStream(“E:\qingjia.png” );
    for(int b = -1; (b = inputStream.read())!=-1;){
    outputStream.write(b);
    }
    inputStream.close();
    outputStream.close();
    }

执行结果:

6、删除流程实例

/**

  • 删除
  • 根据API只能删除一个流程定义下的一个版本
    */
    @Test
    public void testDeletePD() {
    processEngine.getRepositoryService()
    .deleteDeploymentCascade( “120015”);
    }

/**

  • 删除一个流程定义的所有版本
  • 只根据提供deploymentID进行删除,不是特别好,应该提供一个API,根据pdKey删除
    */
    @Test
    public void testDeletePD2 () {
    List list = processEngine.getRepositoryService()
    .createProcessDefinitionQuery()
    .processDefinitionKey( “qingjia1”)
    .list();
    for(ProcessDefinition pd:list){
    processEngine.getRepositoryService()
    .deleteDeploymentCascade(pd.getDeploymentId());
    }
    }
    06 JBPM的流程实例和任务的相关操作
    1、启动一个流程实例
    @Test
    public void testStartPIBYPID(){
    processEngine.getExecutionService()
    .startProcessInstanceById( “qingjia-1” );
    }

执行结果:

2、

由上图可以看出,ProcessInstance其实与Execution是一致的。

由上图可以看出,ProcessInstance中在有分支并行运行的时候包含多个execution。

3、使用pdKey启动一个流程实例
/**

  • 如果是根据pdKey启动流程实例,启动的是最高版本的
    */
    @Test
    public void testStartPI(){
    processEngine.getExecutionService()
    .startProcessInstanceByKey( “qingjia”);
    }

4、完成某个任务
@Test
public void testFinishTask (){
processEngine.getTaskService()
.completeTask( “130002”);
}

执行结果:

注:如果jbpm.hibernate.cfg.xml中没有设置< property name =“hibernate.dialect”>org.hibernate.dialect.MySQLInnoDBDialect 中的引擎为MySQLInnoDBDialect,那么就可能会出现外键问题从而导致任务不能正常完成。

5、查询出所有的task
/**

  • 查询出所有的task
    */
    @Test
    public void testQueryAllTask(){
    List list = processEngine.getTaskService()
    .createTaskQuery()
    .list();

    for(Task task : list){
         System. out.println(task.getAssignee());
         System. out.println(task.getId());
         System. out.println(task.getExecutionId());
         System. out.println(task.getName());
         System. out.println(task.getCreateTime());
    

    }
    }

6、根据任务的执行人查看任务
/**

  • 根据任务的执行人查看任务
    */
    @Test
    public void testQueryTaskByAssignee(){
    List list = processEngine.getTaskService()
    .createTaskQuery()
    .assignee( “张三”)
    .list();

    for(Task task : list){
         System. out.println(task.getAssignee());
         System. out.println(task.getId());
         System. out.println(task.getExecutionId());
         System. out.println(task.getName());
         System. out.println(task.getCreateTime());
    

    }
    }

执行结果:

7、根据节点名称查看正在执行的任务
/**

  • 根据节点名称查看正在执行的任务
    */
    @Test
    public void testQueryTaskByActivityName (){
    List list = processEngine.getTaskService()
    .createTaskQuery()
    .activityName( “请假申请” )
    .list();

    for(Task task : list){
         System. out.println(task.getAssignee());
         System. out.println(task.getId());
         System. out.println(task.getExecutionId());
         System. out.println(task.getName());
         System. out.println(task.getCreateTime());
    

    }
    }

8、根据executionID查看正在执行的任务
/**

  • 根据executionID查看正在执行的任务
    */
    @Test
    public void testQueryTaskByExecutionId (){
    List list = processEngine.getTaskService()
    .createTaskQuery()
    .executionId( “qingjia.10001”)
    .list();

    for(Task task : list){
         System. out.println(task.getAssignee());
         System. out.println(task.getId());
         System. out.println(task.getExecutionId());
         System. out.println(task.getName());
         System. out.println(task.getCreateTime());
    

    }
    }

9、根据pdid可以查询很多个任务
/**

  • 根据pdid可以查询很多个任务
    */
    @Test
    public void testQueryTaskByPdid (){
    List list = processEngine.getTaskService()
    .createTaskQuery()
    .processDefinitionId( “qingjia-1”)
    .list();

    for(Task task : list){
         System. out.println(task.getAssignee());
         System. out.println(task.getId());
         System. out.println(task.getExecutionId());
         System. out.println(task.getName());
         System. out.println(task.getCreateTime());
    

    }
    }

10、根据piid可以查询很多个任务
@Test
public void testQueryTaskByPiid (){
List list = processEngine.getTaskService()
.createTaskQuery()
.processInstanceId( “qingjia.10001”)
.list();

   for(Task task : list){
        System. out.println(task.getAssignee());
        System. out.println(task.getId());
        System. out.println(task.getExecutionId());
        System. out.println(task.getName());
        System. out.println(task.getCreateTime());
  }

}

11、根据任务ID查看任务
@Test
public void testQueryTaskByTaskId (){
Task task2 = processEngine.getTaskService().getTask(“10002” );

  System. out.println(task2.getAssignee());
  System. out.println(task2.getId());
  System. out.println(task2.getExecutionId());
  System. out.println(task2.getName());
  System. out.println(task2.getCreateTime());

}

12、查看已经完成的任务
/**

  • 查看已经完成的任务
    */
    @Test
    public void testQueryHistTask (){
    List list = processEngine.getHistoryService()
    .createHistoryTaskQuery().state( “completed”)
    .list();

    for(HistoryTask historyTask : list){
         System. out.println(historyTask.getEndTime());
    

    }
    }

13、根据taskId查询已经完成的任务
@Test
public void testQueryHistTask(){
List list = processEngine.getHistoryService()
.createHistoryTaskQuery().state(“completed”).taskId( “10002”)
.list();

   for(HistoryTask historyTask : list){
        System. out.println(historyTask.getEndTime());
  }

}

14、根据任务的执行人查询已经完成的任务
@Test
public void testQueryHistTask(){
List list = processEngine.getHistoryService()
.createHistoryTaskQuery().assignee( “张三”)
.list();

   for(HistoryTask historyTask : list){
        System. out.println(historyTask.getEndTime());
  }

}

15、根据指定时间之前查询已经完成的任务
@Test
public void testQueryHistTask(){
List list = processEngine.getHistoryService()
.createHistoryTaskQuery().startedBefore( new Date())
.list();

   for(HistoryTask historyTask : list){
        System. out.println(historyTask.getEndTime());
  }

}

16、根据executionId查询已经完成的任务
@Test
public void testQueryHistTask(){
List list = processEngine.getHistoryService()
.createHistoryTaskQuery().state(“completed”).executionId( “qingjia.10001” )
.list();

   for(HistoryTask historyTask : list){
        System. out.println(historyTask.getEndTime());
  }

}

17、查询所有的正在执行的流程实例
/**

  • 查询所有正在执行的流程实例
    */
    @Test
    public void testQueryHistTask(){
    List list = processEngine.getExecutionService()
    .createProcessInstanceQuery()
    .list();

    for(ProcessInstance pi : list){
         System. out.println(pi.getProcessDefinitionId());
    

    }
    }

18、直接结束流程实例
/**

  • 直接结束流程实例
    */
    @Test
    public void testEndPI(){
    processEngine.getExecutionService().endProcessInstance(“qingjia.10001”, “failed”);
    }

07 JBPM的流程实例和任务的表结构分析
涉及到的表:
<1>JBPM4_EXECUTION
表示正在执行的流程实例
是一个临时表,当流程实例执行完毕以后,就会从该表中删除。
DBID_:主键 executionId
activityname_:表示流程实例正在执行的节点
procdefid_:流程定义ID pdid
id_:流程实例ID pidd

<2>JBPM4_HIST_PROCINST(process instance)
表示历史的流程实例
当前正在执行的流程实例也在这张表中,只不过结束时间为null,状态为active
当流程实例结束以后,结束时间不为null,状态为ended

<3>JBPM4_TASK
正在执行的任务
DBID_:主键、任务ID
NAME_:任务的名称
ASSIGNEE_:任务的执行人
是一个临时表,存放正在执行的任务,如果该任务已经执行完成,则会从这张表中删除。

<4>JBPM4_HIST_TASK
历史任务
当前正在执行的任务也在这张表中,结束时间为null,状态为null
当一个任务完成以后,状态就改为completed

<5>JBPM4_HIST_ACTINST
历史节点
task只是节点的一种常用的类型

08 流程变量
流程变量
1、流程变量的生命周期
流程实例启动到流程实例结束
2、流程变量依赖的条件
流程变量依赖于流程实例
3、怎么样把流程变量存放到流程实例中
启动流程实例
在任务节点
在整个流程实例范围内
4、怎么样从流程实例中把流程变量取出
在任务节点
在整个流程实例范围内
5、流程变量的类型
说明:在整个流程实例结束以后,流程变量被删除掉了。

涉及到的临时表:JBPM4_VARIABLE

1、在流程实例启动的时候存放流程变量
public class VariablesTest extends BaseJbpm {
@Test
public void testStart (){
Map<String,String> variables = new HashMap<String,String>();
variables.put( “启动流程实例” , “在启动流程实例的时候,设置流程变量” );
processEngine.getExecutionService()
.startProcessInstanceById( “qingjia-1”,variables);
}
}

执行结果:

2、完成任务的时候,设置流程变量
@Test
public void testFinishTask (){
Map<String,String> variables = new HashMap<String,String>();
variables.put( “完成任务” , “在完成任务的时候设置流程变量” );
processEngine.getTaskService()
.completeTask( “20003”,variables);
}

执行结果:

注:在任务执行结束的时候不能存放流程变量。

3、在任务的任何环节,设置流程变量
@Test
public void testFinishTask (){
Map<String,String> variables = new HashMap<String,String>();
variables.put( “完成任务” , “在完成任务的时候设置流程变量” );
processEngine.getTaskService().setVariables(“20003” , variables);
}

执行结果:

4、在整个流程实例的范围内设置流程变量
@Test
public void testFinishTask (){
processEngine.getExecutionService().setVariable(“qingjia.20001” , “在流程实例范围内” , “在流程实例范围内设置流程变量” );
}
执行结果:

5、在任务节点时,获取流程变量
/**

  • 在任务节点时,获取流程变量
    */
    @Test
    public void testGetVariablesWhenTask (){
    String str = processEngine.getTaskService()
    .getVariable( “20003”, “启动流程实例” ).toString();
    System. out.println(str);

}

6、在整个流程实例范围内获取流程变量
@Test
public void testGetVariablesWhenPI(){
String str = processEngine.getExecutionService()
.getVariable( “qingjia.20001”, “在流程实例范围内” ).toString();
System. out.println(str);

}

7、永久性的存储流程变量:jbpm4_hist_var表中存放历史的流程变量。
jbpm4_hist_var表中可以存放数据,但是数据结构是固定的,满足不了各种查询,所以在系统中流程的控制表和数据表是分开的。
@Test
public void testSaveVariables (){
processEngine.getExecutionService().createVariable(“qingjia.20001”, “aaa”, “aaaass” , true);
}

执行结果:

8、实际项目中将流程的控制表和程序员自己建的表分开,也就是将控制和数据分开

9、流程变量的实例
JBPM中的流程变量类型必须是符合实现了Serializable接口的类的类型,例如Date、String等,Integer不支持,因为它没有实现序列化。
public class Person implements Serializable{
private Long pid ;
private String name ;

   public Long getPid() {
         return pid ;
  }
   public void setPid(Long pid) {
         this.pid = pid;
  }
   public String getName() {
         return name ;
  }
   public void setName(String name) {
         this.name = name;
  }

}

@Test
public void testStart(){
Map<String,Object> variables = new HashMap<String,Object>();
Person person = new Person();
person.setPid(1L);
person.setName( “aaa”);
variables.put( “person”, person);
processEngine.getExecutionService()
.startProcessInstanceById( “qingjia-1”,variables);
}

@Test
public void testGetVariablesWhenPI(){
Person person = (Person) processEngine.getExecutionService()
.getVariable( “qingjia.20001”, “person” );
System. out.println(person.getName());
}
注:同一个流程定义创建出的两个流程实例的两个流程变量是相互独立,没有任何关系的。
09 流程定义语言
Transition(连线)
节点与节点之间的连线,也可以认为是节点与节点之间的通话。
说明:
1)开始节点只能有一个Transition。
2)结束节点没有Transition。

1、直接完成任务到to end1节点。
@Test
public void testFinishTask (){
String outcome = “to end1”;
processEngine.getTaskService()
.completeTask( “20001”,outcome);
}
10 State
1、State与Task不同,Task需要有人参与,State不需要有人参与。

@Test
public void testDeployFromClassPath(){
processEngine.getRepositoryService()
.createDeployment()
.addResourceFromClasspath( “state.jpdl.xml”)
.addResourceFromClasspath( “state.png”)
.deploy();
}

@Test
public void testStart(){
processEngine.getExecutionService()
.startProcessInstanceById( “state-1”);
}

执行结果:

注:流程执行的过程中会有一个token,这个token指示到执行的地方。

2、继续执行state。
@Test
public void testFinishedState(){
processEngine.getExecutionService()
.signalExecutionById( “state.10001”);
}

3、跳转到指定的状态

上面的第三个方法的第二个参数与completeTask方法中的outcome是一致的,表示跳转到相应的节点。
11 JBPM各个类之间的关系
1、多种id之间的关系。

2、

注:ProcessInstance继承自Execution类。
12 给任务的执行人赋值
1、一个任务由固定的人执行

2、一个任务可以动态的设置任务的执行人,但是在进入该任务之前
通过流程变量赋值、在进入该节点之前必须赋值
代码:
/**

  • 给任务的执行人赋值
  • @author administrator
  •  

*/
public class TaskTest extends BaseJbpm {

   @Test
   public void testTable(){
        Configuration configuration = new Configuration();
        configuration.configure( "jbpm.hibernate.cfg.xml");
        configuration.buildSessionFactory();
  }
  
   @Test
   public void testDeployFromClassPath(){
         processEngine.getRepositoryService()
        .createDeployment()
        .addResourceFromClasspath( "qingjia.jpdl.xml")
        .addResourceFromClasspath( "qingjia.png")
        .deploy();
  }
  
   @Test
   public void testStartPIByPDID(){
         processEngine.getExecutionService()
        .startProcessInstanceById( "qingjia-1");
  }
学新通

}

执行结果:

代码:
@Test
public void testStartPIByPDID (){
Map<String,String> variables = new HashMap<String,String>();
variables.put( “applicator”,“张三三” );
processEngine.getExecutionService()
.startProcessInstanceById( “qingjia-1”,variables);
}

执行结果:

3、一个任务可以动态的设置任务的执行人,在进入该任务的时候指定
①可以采用程序的方式,给正在执行的任务设置任务的执行人
assignTask
方式一:
/**
* 在程序中设置任务的执行人
*/
@Test
public void testAssignTask (){
processEngine.getTaskService().assignTask(“30001” , “dfsdf” );
}
②写一个类,该类继承了AssignmentHandler接口,利用assignable.setAssignee(“aaa”);赋值
在配置文件中,做相应的配置
方式二:
qingjia.jpdl.xml

<?xml version ="1.0" encoding="UTF-8" ?>

MyAssignmentHandler.java
public class MyAssignmentHandler implements AssignmentHandler {

   public void assign(Assignable assignable, OpenExecution execution)
               throws Exception {
        //可以添加多个addCandidateUser
        assignable.addCandidateUser( "abc");
        assignable.addCandidateUser( "bca");
        assignable.addCandidateUser( "cba");
  }

}

TaskTest.java
@Test
public void testFinishTask (){
processEngine.getTaskService().completeTask(“30001” );
}

执行结果:

注:如果需要为一个人分配多个任务,那么可以通过AssignmentHandler赋给同一个人。

<?xml version ="1.0" encoding="UTF-8" ?>

重点:增删改操作是绝对不能放在AssignmentHandler的实现类中完成的,因为AssignmentHandler是由JBPM进行调用的,所以它无法交给Spring进行管理然后由JBPM内部进行获取。也不能在这个类中设置Service属性,因为如果需要将这个Service交给Spring进行管理,那么就需要将AssignmentHandler交给Spring进行管理。这就是Spring 的缺点之一。

4、一个任务可以有多个人完成,但是只要其中的一个人把该任务完成就完成了
方式一:

<?xml version="1.0" encoding= "UTF-8"?>

/**

  • 根据候选人查看组任务
    */
    @Test
    public void testQueryGroupTask (){
    List taskList = processEngine.getTaskService()
    .findGroupTasks( “张三”);
    for(Task task:taskList){
    System. out.println(task.getName());
    }
    }

执行结果:

@Test
public void testQueryGroupTask (){
List pList = processEngine.getTaskService()
.getTaskParticipations( “10002”);//任务号
for(Participation p:pList){
System. out.println(p.getUserId());
}
}

执行结果:

@Test
public void testTakeTask(){
processEngine.getTaskService()
.takeTask( “10002”, “张三” );
}

执行结果:

/**

  • 该api除了能接受任务的候选人以外,什么人都能接受
    */
    @Test
    public void testTakeTask(){
    processEngine.getTaskService()
    .takeTask( “10002”, “ddddd” );
    }

注:jbpm4_participation表也是一个临时表,一旦任务完成,数据也就消失了。

方式二:
public class IdentityTest extends BaseJbpm {
@Test
public void testIdentity(){
processEngine.getIdentityService().createGroup(“Row 1” );
processEngine.getIdentityService().createGroup(“Row 2” );

         processEngine.getIdentityService().createUser("User 1" , "张三" , "张三" );
         processEngine.getIdentityService().createUser("User 2" , "李四" , "李四" );
        
         processEngine.getIdentityService().createMembership("User 1","Row 1");
         processEngine.getIdentityService().createMembership("User 2","Row 1");
  }

}

执行结果:
jbpm4_id_group

jbpm4_id_user

jbpm4_id_membership

public class MyAssignmentHandler implements AssignmentHandler {

   public void assign(Assignable assignable, OpenExecution execution)
               throws Exception {
        assignable.addCandidateGroup( "row 1");
  }

}

5、一个人要审批很多个任务–泳道

swimlane.jpdl.xml

<?xml version="1.0" encoding= "UTF-8"?>

执行结果:

13 JBPM其他知识点
1、Decision
MyDecision.java
public class MyDecision implements DecisionHandler {

   public String decide(OpenExecution execution) {
        Integer days = (Integer)execution.getVariable( "days");
         if(days<=3){
               return "to end1" ;
        } else{
               return "to task3" ;
        }
  }

}

decision.jpdl.xml

<?xml version ="1.0" encoding="UTF-8" ?>

DecisionTest.java
@Test
public void testFinishTask (){
Map<String,Integer> variables = new HashMap<String,Integer>();
variables.put( “days”, 1);
processEngine.getTaskService ().setVariables(“20001”, variables);
processEngine.getTaskService().completeTask(“20001” );
}

2、Forkjoin
forkjoin.jpdl.xml

<?xml version="1.0" encoding= "UTF-8"?>

执行结果:

3、事件
流程级别的事件
流程的开始事件
流程的结束事件
节点级别的事件
开始节点的结束事件
结束节点的开始事件
一般节点的开始事件和结束事件

事件的触发流程:
流程的开始事件——>开始节点的结束事件——>一般节点的开始事件——>一般节点的结束事件——>结束节点的开始事件——>流程的结束事件

event.jpdl.xml

<?xml version="1.0" encoding= "UTF-8"?>

ProcessStartEvent.java
public class ProcessStartEvent implements EventListener {

   public void notify(EventListenerExecution execution) throws Exception {
        System. out.println("dfff" );
  }

}

Decision和Event都是为了实现控制和业务的松耦合。
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgkikci
系列文章
更多 icon
同类精品
更多 icon
继续加载