jbpm中最重要的对象莫过于ProcessEngine对象,他是工作流引擎对象,一切工作流的启动都离不开此对象。
查看 jbpm的API,ProcessEngine对象主要有6个方法,
ProcessEngine具有6个service获得的方法:
RepositoryService : 流程定义管理 (发布,管理,定义流程)
ExecuteService : 流程实例管理 (启动流程实例,监控流程实例运行状态,控制实例流程流转)
TaskService: 任务管理 (任务查看,任务办理)
IdentityService: JBPM用户管理 (管理 用户,组信息)
HistoryService: 历史记录管理 (管理 实例,任务,活动历史记录信息)
ManagementService: 管理JOB(JOB定时任务)
一.RepositoryService对象
RepositoryService对象是由ProcessEngine.getRepositoryService()获得的。
1.jbpm发布流程定义代码如下:
// 1、先获得流程引擎的对象
Configuration configuration = new Configuration();
ProcessEngine processEngine = configuration.buildProcessEngine();
// 2、 获得对应Service对象
RepositoryService repositoryService = processEngine.getRepositoryService();
NewDeployment deployment = repositoryService.createDeployment();
// 3、发布流程定义
deployment.addResourceFromClasspath("holiday.jpdl.xml");
deployment.addResourceFromClasspath("holiday.png");
//实际开发中都用下面的方法,发布Zip压缩包,方便
//deployment.addResourcesFromZipInputStream(new ZipInputStream(new FileInputStream("holiday.zip")));
// 执行发布
deployment.deploy();
流程发布成功后,那么问题来了,发布一个流程都会影响那些表呢?
众所周知,jbpm共18张表,但是发布一个流程只用到4张表,分别如下所示:
(1)jbpm4_property 属性表
此表永远只有一条记录,vlaue记录下一次定义流程的流水id,每次事物结束后,value递增10000。
(2)jbpm4_deployment 流程定义发布表
每次新发布一条流程定义,此表添加一条记录,DBID是该流程定义流水号
(3)jbpm4_lob 大数据表
此表存放定义的流程文件,BLOB_VALUE存放流程文件内容
(4)jbpm4_deployprop 发布流程定义属性表
每次流程定义发布后,会存入4条数据,分别是jpdl版本号,流程定义编号pdid,流程定义关键字pdkey,版本pdversion.
2.执行查询代码
RepositoryService可以获取两个查询对象,分别是
DeploymentQuery:查询jbpm4_deployment表(使用较少)
ProcessDefinitionQuery:查询jbpm4_deployprop表(重点使用),可以对Query设置条件进行查询
RepositoryService repositoryService = new Configuration().buildProcessEngine().getRepositoryService();
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> list = processDefinitionQuery.list();
System.out.println("共有几个定义:" + list.size());
for (ProcessDefinition processDefinition : list) {
System.out.println("流程定义编号pdid:" + processDefinition.getId());
System.out.println("流程定义名称name:" + processDefinition.getName());
System.out.println("流程定义关键字 pdkey:" + processDefinition.getKey());
System.out.println("流程定义版本号 pdversion:" + processDefinition.getVersion());
}
3.查看流程图
Configuration configuration = new Configuration();
ProcessEngine buildProcessEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = buildProcessEngine.getRepositoryService();
String deploymentId = "1";
String resourcename = "holiday.png";
InputStream in = repositoryService.getResourceAsStream(deploymentId, resourcename);
FileOutputStream out = new FileOutputStream("d:/xx.png");
int b;
while((b = in.read()) != -1){
out.write(b);
}
in.close();
out.close();
查的是jbpm4_lob4表,deploymentId是流程流水号,resourcename除了可以使png等图片,还可以是xml格式的文件。(deploymentId和resourcename可以通过processDefinitionQuery对象获得).
4.流程定义删除
有两种方式删除流程定义:
(1)repositoryService.deleteDeployment(deploymentId);
(2)repositoryService.deleteDeploymentCascade(deploymentId); //deploymentId是流程流水号
Configuration configuration = new Configuration();
ProcessEngine buildProcessEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = buildProcessEngine.getRepositoryService();
repositoryService.deleteDeploymentCascade("1");
第一种方式如果有关联流程实例信息就会报错,第二种除了删除流程定义,还会删除关联流程实例,开发中一般都会用第二种。