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();
}
流程定义管理这些内容中,重要的是部署和删除流程定义,这是在系统中经常用到的方法。至于查看流程定义和查看流程图,相对来说次要一点。