OA总结—jbpm管理流程定义

时间:2022-11-16 17:27:11

    jbpm工作的过程是创建工作流引擎,部署流程定义,启动流程实例。那么流程定义又是如何管理的呢?


    要管理流程定义,首先得了解什么是流程定义,流程定义即ProcessDefinition。工作流程是执行一项工作的步骤,是一个规则,那么流程定义就是用来定义或者描述这个规则的对象。


    jbpm工作流需要数据库中十八张表来管理工作流执行过程中的数据,涉及到流程定义的表有以下几张:

        JBPM4_DEPLOYMENT:部署表,用来描述一次部署

        JBPM4_LOB:仓库表,存放了流程定义文档(xml,png)

        JBPM4_DEPLOYPROP:部署属性表


    流程定义管理的过程分为几部分:

        1、部署流程定义

        2、查询流程定义

        3、删除流程定义

        4、查看流程图


部署流程定义


    部署流程定义有三种方式,

        addResourceFromClasspath(resource):从classpath下添加,流程图画好后,会生成一个xml文件和一个png文件,把他们放到classpath下,可以直接用该方法读取文件部署。

public void testDeployFromClasspath(){
processEngine.getRepositoryService()
.createDeployment()
.addResourceFromClasspath("qingjia.jpdl.xml")
.addResourceFromClasspath("qingjia.png")
.deploy();
}


        addResourceFromInputStream(resource,inputstream):添加一个文件,使用InputStream添加文件,只能添加一个文件。

public void testDeployFromInputStream(){
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("qingjia.jpdl.xml");
processEngine.getRepositoryService()
.createDeployment()
.addResourceFromInputStream("qingjia.jpdl.xml", inputStream)
.deploy();
}


        addResourceFromZipInputStream(inputstream):添加一个zip文件,里面可以有多个文件,也可以有文件夹。

public void testDeployFromZipinputStream(){
InputStream in = this.getClass().getClassLoader().getResourceAsStream("qingjia.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
processEngine.getRepositoryService()
.createDeployment()
.addResourcesFromZipInputStream(zipInputStream)
.deploy();
}


查询流程定义


    查询流程定义也分为两部分,一部分是查询部署,另外一部分是查询流程定义。


    查询部署时可以查询所有部署,也可以根据ID查询某一个部署。查询部署是从JBPM4_DEPLOYMENT表中得到的。

/**
* 查询所有的部署
*/
@Test
public void testQueryAllDeploy(){
List<Deployment> deploymentList = processEngine.getRepositoryService()
.createDeploymentQuery()
.list();
}

/**
* 根据部署ID查询部署
*/
@Test
public void testQueryDeployByID(){
Deployment deployment = processEngine.getRepositoryService()
.createDeploymentQuery()
.deploymentId("10001")
.uniqueResult();
}


    查询流程定义也分为几种情况:

/**
* 查询所有的流程定义
*/
@Test
public void testQueryAllPD(){
List<ProcessDefinition> pdList = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.list();
}

/**
* 根据部署ID查询流程定义
*/
@Test
public void testQueryPDByDeploymentId(){
ProcessDefinition pd = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.deploymentId("30001")
.uniqueResult();
}

/**
* 根据流程定义ID查询流程定义,也就是JBPM4_DEPLOYPROP中的id,一般为“流程定义名称-版本号”
*/
@Test
public void testQueryPDByPDID(){
ProcessDefinition pd = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionId("qingjia-2")
.uniqueResult();
}

/**
* 根据流程定义名称查询流程定义,一般为JBPM4_DEPLOYPROP中的OBJNAME_
*/
@Test
public void testQueryPDByPDKEY(){
List<ProcessDefinition> pdList = processEngine
.getRepositoryService()
.createProcessDefinitionQuery()
.processDefinitionKey("qingjia")
.list();
for(ProcessDefinition pd:pdList){
System.out.print("deploymentId:"+pd.getDeploymentId()+",");
System.out.print("imageURL:"+pd.getImageResourceName()+",");
System.out.print("key:"+pd.getKey()+",");
System.out.println("version:"+pd.getVersion());
}
}


删除流程定义


     如果要删除流程定义,就是删除该次部署,因为jbpm的API没有提供删除流程定义的方法。或者根据流程定义名称获取所有流程定义,然后遍历流程定义获取它的流程部署,然后删除掉流程部署。

public void testDeleteDeployment(){
processEngine.getRepositoryService()
.deleteDeploymentCascade("10001");
}


查看流程图


/**
* 查询流程图
*/
@Test
public void testShowImage() throws Exception{
InputStream inputStream = processEngine.getRepositoryService()
.getResourceAsStream("20001", "qingjia.png");

OutputStream outputStream = new FileOutputStream("c:/processimg.png");
for(int b=-1;(b=inputStream.read())!=-1;){
outputStream.write(b);
}
inputStream.close();
outputStream.close();
}

    

    流程定义管理这些内容中,重要的是部署和删除流程定义,这是在系统中经常用到的方法。至于查看流程定义和查看流程图,相对来说次要一点。