JBPM 4.4 示例代码

wangjianme 贡献于2012-10-17

作者 王  创建于2012-10-13 15:20:00   修改者王  修改于2012-10-17 09:00:00字数11258

文档摘要:导入流程的三种方法涉及到的表:表名说明JBPM4_PROPERTY-描述整个jbpm的版本,可以不有关心JBPM4_DEPLOYMENT主要的部署表*说明:*每部署一次,都生成1条记录JBPM4_DEPLOYPROP部署的属性表,它是上面的表的子表*longid=jbpm的版本*pdid=是key(流程名称唯一)与版本号的组合体。*pdkey=流程名称.*pdversion=版本号**说明:*每部署一次都生成4条记录
关键词:

 JBPM4.4示例代码 1、导入流程 代码: package cn.leaf.in; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.RepositoryService; import org.junit.Test; public class ImportDemo { /** * 部署流程 * 涉及到的表: * JBPM4_PROPERTY - 描述整个jbpm的版本,可以不有关心 * JBPM4_DEPLOYMENT - 主要的部署表 * JBPM4_DEPLOYPROP - 部署的属性表,它是上面的表的子表 * longid = jbpm的版本 * pdid = 是key(流程名称唯一)与版本号的组合体。 * pdkey = 流程名称. * pdversion = 版本号 * JBPM4_LOB - 存放xml和png图片 * */ @Test public void importFile(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); rs.createDeployment() .addResourceFromClasspath("qingjia.jpdl.xml") .addResourceFromClasspath("qingjia.png") .deploy(); } } 2、导入流程的三种方法 涉及到的表: 表名 说明 JBPM4_PROPERTY - 描述整个jbpm的版本,可以不有关心 JBPM4_DEPLOYMENT 主要的部署表 * 说明: * 每部署一次,都生成1条记录 JBPM4_DEPLOYPROP 部署的属性表,它是上面的表的子表 * longid = jbpm的版本 * pdid = 是key(流程名称唯一)与版本号的组合体。 * pdkey = 流程名称. * pdversion = 版本号 * * 说明: * 每部署一次都生成4条记录。 * 这4条记录是:pdid = pdkey+version 唯一决定一个流程 * pdkey = pdname即与名称一样 * pdversion = 相同名称流程的版本号 JBPM4_LOB 存放xml和png图片 * 字段: * name:描述了文件的路径 1:classpath 2:inputstream 3:zip文件 项目如下: 示例代码: package cn.leaf.jbpm; import java.io.FileInputStream; import java.io.InputStream; import java.util.zip.ZipInputStream; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.RepositoryService; import org.junit.Test; public class ImportDemo { /** * 部署流程 * 涉及到的表: * JBPM4_PROPERTY - 描述整个jbpm的版本,可以不有关心 * * JBPM4_DEPLOYMENT - 主要的部署表 * 说明: * 每部署一次,都生成1条记录 * * JBPM4_DEPLOYPROP - 部署的属性表,它是上面的表的子表 * longid = jbpm的版本 * pdid = 是key(流程名称唯一)与版本号的组合体。 * pdkey = 流程名称. * pdversion = 版本号 * * 说明: * 每部署一次都生成4条记录。 * 这4条记录是:pdid = pdkey+version 唯一决定一个流程 * pdkey = pdname即与名称一样 * pdversion = 相同名称流程的版本号 * * JBPM4_LOB - 存放xml和png图片 * 字段: * name:描述了文件的路径 * */ @Test public void importFile(){ /** * 第一种部署方式 */ ProcessEngine pe = //获取流程引擎 Configuration.getProcessEngine(); RepositoryService rs = //获取仓库服务 pe.getRepositoryService(); rs.createDeployment() .addResourceFromClasspath("jpdl/qingjia.jpdl.xml") .addResourceFromClasspath("jpdl/qingjia.png") .deploy(); } /** * 第二种部署方式利用io流 */ @Test public void importFile2(){ InputStream xml = ClassLoader.getSystemResourceAsStream("jpdl/qingjia.jpdl.xml"); InputStream jpg = ClassLoader.getSystemResourceAsStream("jpdl/qingjia.png"); ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); rs.createDeployment().addResourceFromInputStream("qingjia.jpdl.xml",xml) .addResourceFromInputStream("qingjia.jpg",jpg) .deploy(); } /** * 第三种部署方式 * 利用zip文件 * 打zip包时一定的注意,必须要打成zip包,不能打成rar包以后再修改成zip */ @Test public void importZip() throws Exception{ ZipInputStream zip = new ZipInputStream(new FileInputStream("./zip/qingjia.zip")); ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); rs.createDeployment() .addResourcesFromZipInputStream(zip) .deploy(); } } 3、查询部署Deployment package cn.leaf.jbpm; import java.util.List; import org.jbpm.api.Configuration; import org.jbpm.api.Deployment; import org.jbpm.api.ProcessEngine; import org.jbpm.api.RepositoryService; import org.junit.Test; /** * 查询流程部署定义 */ public class QueryDeployment { /** * 显示所有流程定义 */ @Test public void queryAll(){ ProcessEngine pe = org.jbpm.api.Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); List list = rs.createDeploymentQuery() .list();//显示所有的流程定义 for(Deployment dp:list){ System.err.println(""+dp.getId()+"," +dp.getName()+"," +dp.getState()+"," +dp.getTimestamp()); } } /** * 根据流程id查询流程 */ @Test public void queryFromId(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); Deployment deployment = rs.createDeploymentQuery() .deploymentId("1")//设置id,数据库为bigint,这儿设置为字符串类型 .uniqueResult(); //唯一的结果 System.err.println(deployment.getId()+","+deployment.getState()); } } 4、查询流程定义ProcessDefinition package cn.leaf.jbpm; import java.io.InputStream; import java.util.List; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessDefinition; import org.jbpm.api.ProcessEngine; import org.jbpm.api.RepositoryService; import org.junit.Test; /** * 查询流程定义ProcessDefinition */ public class QueryProcessDefs { @Test public void queryAllProcess(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); List list = rs.createProcessDefinitionQuery() .deploymentId("1")//根据id查询只可以有一个结果 .processDefinitionId("qingjia-1")//根据pdid查询只会有一个 .processDefinitionKey("qingjia")//根据pdkey查询有可能有多个 .processDefinitionName("qingjia")//根据名称查询有可能有多个 .processDefinitionNameLike("qingjia")//根据名称模糊查找 .list(); System.err.println("ID\t名称\t版本"); for(ProcessDefinition pd:list){ System.err.println(pd.getId()+"\t"+pd.getName()+"\t"+pd.getVersion()); } } /** * 查看图片 */ @Test public void queryPng(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); InputStream in = rs.getResourceAsStream("1","jpdl/qingjia.png"); //以下使用正常的io将流程图输出到文件中即可 //略 } /** * 删除流程定义 * 如果需要根据名称删除,则可以先获取ProcessDefinition然后遍历删除 */ @Test public void deleteDeployment(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); //rs.deleteDeployment("1");//只删除流程部署,如果还没有运行且没有历史记录的情况下 rs.deleteDeploymentCascade("1");//删除所有 } } 5、查看图片 @Test public void queryPng(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); InputStream in = rs.getResourceAsStream("1","jpdl/qingjia.png"); //以下使用正常的io将流程图输出到文件中即可 //略 } 6、删除流程部署 /** * 删除流程定义 * 如果需要根据名称删除,则可以先获取ProcessDefinition然后遍历删除 */ @Test public void deleteDeployment(){ ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); //rs.deleteDeployment("1");//只删除流程部署,如果还没有运行且没有历史记录的情况下 rs.deleteDeploymentCascade("1");//删除所有 } 7、流程实例PI(Process Instance) 流程实例及流程实例所涉及到的表: 表名 作用 jbpm4_execution正在执行的流程实例 此表也是临时表,流程执行完成,即删空 DBID_:主键 * ID_:流程实例ID * PROCDEFID_:流程定义ID * STATE_:状态 jbpm4_hist_procinst记录已经执行完成的流程实例 某一个流程执行完成以后,字段state就会修改成ended 字段: * START_:流程实例的开始时间 * END_:流程实例的结束时间 * PROCDEFID_:流程定义ID STATE : 流程状态,active|ended jbpm4_task * 表示正在执行的任务,也表示已经完成的任务 字段: * DBID_:主键 * STATE_:OPEN表示开启 * ASSIGNEE_:任务的执行人 * CREATE_:任务的创建时间 * EXECUTION_ID_:执行ID,如果是单线执行则EXECUTION_ID_与PROCDEFID_相同。 * 如果是同个流程两条线并发执行则EXECUTION_ID_则与PROCDEFID_不同。 * 说明: * 如果没有并发的情况下,当前正在执行的任务只会有一个 jbpm4_hist_actinst * 包括所有已经完成的节点(包括任务) 字段: * type_:节点的类型 jbpm4_hist_task 表示正在当前执行的任务,或是表示已经完成的任务 表示正在当前执行的任务,或是表示已经完成的任务 * 字段: * STATE_:如果是正在执行的任务则为null。 * CREATE_:创建时间 * END_:结束时间 1、根据pdid或是根据pdkey启动一个流程 package cn.leaf.pi; import org.jbpm.api.Configuration; import org.jbpm.api.ProcessEngine; import org.jbpm.api.ProcessInstance; import org.jbpm.api.RepositoryService; import org.junit.Test; /** * PI:Process Instance (流程实例) * @author wangjianme * */ public class PIDemo { ProcessEngine pe = Configuration.getProcessEngine(); RepositoryService rs = pe.getRepositoryService(); /** * 根据pdid启动一个流程实例 * 所涉及到的表: * jbpm4_execution * 正在执行的流程实例 * 字段: * DBID_:主键 * ID_:流程实例ID * PROCDEFID_:流程定义ID * STATE_:状态 * jbpm4_hist_procinst * 记录已经执行完成的流程实例 * 字段: * START_:流程实例的开始时间 * END_:流程实例的结束时间 * PROCDEFID_:流程定义ID * jbpm4_task * 表示正在执行的任务,也表示已经完成的任务 * 字段: * DBID_:主键 * STATE_:OPEN表示开启 * ASSIGNEE_:任务的执行人 * CREATE_:任务的创建时间 * EXECUTION_ID_:执行ID,如果是单线执行则EXECUTION_ID_与PROCDEFID_相同。 * 如果是同个流程两条线并发执行则EXECUTION_ID_则与PROCDEFID_不同。 * 说明: * 如果没有并发的情况下,当前正在执行的任务只会有一个 * * jbpm4_hist_task * 表示正在当前执行的任务,或是表示已经完成的任务 * 字段: * STATE_:如果是正在执行的任务则为null。 * CREATE_:创建时间 * END_:结束时间 * jbpm4_hist_actinst * 包括所有已经完成的节点(包括任务) * 字段: * type_:节点的类型 */ @Test public void piInstanceStartByPdid(){ ProcessInstance pi = pe.getExecutionService() .startProcessInstanceById("qingjia-1");//启动流程实例 String piid = pi.getId(); String piname = pi.getName(); String pdid = pi.getProcessDefinitionId(); String state = pi.getState(); System.err.println("pdid"+piid+"\n"+piname+"\n"+pdid+"\n"+state); } /** * 根据pdkey启动一个流程 * 由于根据pdkey有可能存在多个相同的流程,所以 * 根据pdkey启动流程实例时,只会启动最新的版本 */ @Test public void startProcessInstanceByPdkey(){ ProcessInstance pi = pe.getExecutionService() .startProcessInstanceByKey("qingjia"); System.err.println("piid:"+pi.getId()); System.err.println("piname:"+pi.getName()); System.err.println("pdid:"+pi.getProcessDefinitionId()); System.err.println("state:"+pi.getState()); } /** * 完成任务 * 完成某个批定的任务以后,将会进入此流程的下一个任务 * 并将原来记录在JBPM4_task中的1002的id记录删除 */ @Test public void completeTask(){ pe.getTaskService().completeTask("10002"); } } 8、完成一个任务or流程 /** * 完成任务 * 完成某个批定的任务以后,将会进入此流程的下一个任务 * 并将原来记录在JBPM4_task中的1002的id记录删除 */ @Test public void completeTask(){ pe.getTaskService().completeTask("10002"); } 9、直接终止一个流程-拒绝 /** * 直接结束流程的实例 * 拒绝 * 参数: * piid * 状态可以是任意值 */ @Test public void endTask(){ pe.getExecutionService().endProcessInstance("qingjia.40001","game_over"); } 10、查询正在执行的任务 private ProcessEngine pe = Configuration.getProcessEngine(); /** * 查询所有正在执行的任务 * 获取task就是通过ProcessEngine.getTaskService其他类同 */ @Test public void queryAllExecutionTask(){ List list = pe.getTaskService() .createTaskQuery() //.assignee("请假人")//根据任务的的执行人查询执行的任务 //.activityName("请假申请")//根据节点名称查询任务 //.executionId("qingjia.10001")//根据执行id,只会查询出一个结果 //.processDefinitionId("qingjia-1")//根据流程定义id查询,会有多个 //.candidate("")//根据申请人查询,目前在java应用中没有此值 .list(); for(Task task:list){ System.err.println("节点名称:"+task.getActivityName()); System.err.println("执行人:"+task.getAssignee()); System.err.println("执行id|piid:"+task.getExecutionId()); System.err.println("任务ID:"+task.getId()); System.err.println("任务名称:"+task.getName()); System.err.println("任务的创建时间:"+task.getCreateTime()); } } 11、查询历史任务 /** * 查询历史任务 * 只查询已经完成的历史任务,必须要设置state("completed")这是条件 * 还可以根据某个时间间隔查询即startBefore等。 */ @Test public void queryAllExecutionHistTask(){ List list = pe.getHistoryService() .createHistoryTaskQuery() .state("completed") //.assignee("manager")//根据任务的执行人查询已经完成的任务.后面还可以有很多条件,略 .list(); for(HistoryTask ht:list){ System.err.println("执行人:"+ht.getAssignee()); System.err.println(""+ht.getExecutionId()); System.err.println(ht.getDuration()); System.err.println(ht.getId()); System.err.println(ht.getCreateTime()); System.err.println(ht.getEndTime()); System.err.println("-----------------------------"); } } 12、根据任务id查询某个任务 /** * 只根据一个taskID查询某个任务 * 直接从TaskService中查询即可 */ @Test public void queryTaskById(){ Task task = pe.getTaskService().getTask("20001"); System.err.println(task.getExecutionId()); System.err.println(task.getName()); } /** * 根据历史id查询某一个历史任务 * 结果与上面的查询有些区别注意区分 */ @Test public void queryHistTaskById(){ HistoryTask ht = pe.getHistoryService() .createHistoryTaskQuery() .taskId("10002") .uniqueResult(); System.err.println(ht.getAssignee()); } 13、流程变量 流程变量是指某个流程运行时定义的信息。 流程变量关注以下信息: n 流程变量的生命周期。 u 流程实例(PI)的开始到流程实例的结束。 n 如何将流程变量保存到JBPM的引擎/数据库中 u 在启动流程实例时设置流程变量 u 在完成任务时设置 u 在流程实例正在执行时设置 n 如何得到流程变量中的数据。 u 流程变量与某一个流程实例绑定。 n 当整个流程实例结束以后 n 所定义的流程变量将会在JBPM4_variable表中全部删除 13.1、在启动一个流程实例是定义流程变量 /** * 在启动流程实例时设置流程变量 * 操作表: * JBPM4_variable */ @Test public void setVariables(){ Map map = new HashMap(); map.put("启动流程实例","在启动流程实例时设置的变量值"); pe.getExecutionService().startProcessInstanceById("qingjia-1",map); } 13.2、在完成某个节点时定义流程变量 /** * 在完成任务时设置流程变量 */ @Test public void completeTaskWithVariables(){ Map map = new HashMap(); map.put("完成任务经理审批任务","经理同意你的请假审请"); //api设计缺陷,执行不成功 //pe.getTaskService().completeTask("50003", map); //必须要按以下方式才可以成功 //pe.getTaskService().setVariables("50003",map); pe.getTaskService().completeTask("90001"); } 13.3、在流程实例运行时定义流程变量 /** * 在整个流程进行中,不与任何的任务相关也可以设置流程变量 */ @Test public void processInstancesVarivales(){ pe.getExecutionService().setVariable("qingjia.50001","直接设置","这是值"); } 13.4、读取流程变量记录 /** * 获取流程变量 * 只要是这个流程实例还没有完成,所有流程变量在任意的节点上都可以获取的到 */ @Test public void getProcessInstanceVariables(){ Set ss = pe.getExecutionService().getVariableNames("qingjia.50001"); for(String key:ss){ Object value = pe.getExecutionService().getVariable("qingjia.50001", key); System.err.println(key+"="+value); } System.err.println("================="); //获取一个固定的值 Object obj = pe.getExecutionService().getVariable("qingjia.50001","完成任务经理审批任务"); System.err.println("结果是:"+obj); }

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档