整体流程:
用户->流程设计器->流程定义说明文档(xml和png)->工作流引擎(解释和执行工作流,提供的api支持外部调用)->流程信息保存到数据库中(hibernate或mybatis框架)
开发流程:
1:创建一个java项目
2:导入依赖包(15个jar包)
3:提供jbpm框架的配置文件
(核心配置文件 -- jbpm.cfg.xml,hibernate或mybatis配置文件 jbpm.hibernate.cfx.xml,日志配置文件 logging.properties-- 见example文件下的配置文件)
4:设计流程(安装框架设计插件 jbpm-gdp 创建 jbpm 4 prcess definition 生成xml 和png文件)
5:创建流程引擎对象
5.1非单例实现
Configuration config=new Configuration();
config.setResource("jbpm.cfg.xml");
ProcessEngine processEngine=config.buildProcessEngine();
5.2单利实现
ProcessEngine processEngine=Configuration.getProcessEngine();
6:部署引擎
6.1项目文件部署
NewDeployment deployment = processEngine.getRepositoryService().createDeployment();
deployment.addResourceFromClasspath("processdesign.jpdl.xml");
deployment.addResourceFromClasspath("processdesign.png");
String id = deployment.deploy(); //部署,返回的是部署id,每次部署id均不一样
6.2压缩项目文件部署
NewDeployment deployment = processEngine.getRepositoryService().createDeployment();
ZipInputStream zipInput=new ZipInputStream(new FileInputStream(new File("D:\\workspace\\jbpm\\process\\hello.zip")));
deployment.addResourcesFromZipInputStream(zipInput);
String id = deployment.deploy(); //部署
ps:每次完成部署会在数据库的deploy*表里插数据
7:删除流程
String deploymentId = "1"; //部署时产生的id
processEngine.getRepositoryService().deleteDeployment(deploymentId); //有正在使用的流程会报错
processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId); //有正在使用的流程全部删除
8:查询所有流程
ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
query.list();
9:获取流程的附件文件
String deploymentId = "1";
Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId); // 获取所有文件名
for (String name : names) {
InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
//...输出流写到本地
}
String processdefinitionid = "requestprocess-2";
ProcessInstance processInstance = processEngine.getExecutionService()
.startProcessInstanceById(processdefinitionid); //启动获取一个流程对象,往execution 和 task 表里插入数据
System.out.println("id:"+processInstance.getId()+",name"+processInstance.getName()+",key"+processInstance.getKey());
String userId = "zhangsan";
TaskQuery taskQuery = processEngine.getTaskService().createTaskQuery();
taskQuery.assignee(userId);// 按照用户id来过滤,查看所有用户则跳过
List<Task> list = taskQuery.list();
for(Task task:list)
{
System.out.println(task.getId()+"/"+task.getName());
}
String taskId = "20002"; //是我的任务列表里的task.getId()
processEngine.getTaskService().completeTask(taskId); //清除task表的id对应的数据,修改his_task对应的数据为complete,新增task下一个任务数据,并在his_task里插入历史数据
ps:task表存储的是正在办理的任务,当整个任务所有人都执行结束,则当前任务在task表里数据全部清除,所有逻辑在his_task历史表里
13:跨任务执行(跨过当前任务节点,执行下一个任务节点,一般适用于管理员)
String executionId="requestprocess.30001"; //需要跳过的task任务对应的executionid,见通过用户获取当前任务代码
//processEngine.getExecutionService().signalExecutionById(executionId); 该函数有异常,需要考虑分支路线就必须调用2个参数的重载函数
processEngine.getExecutionService().signalExecutionById(executionId, "to task3"); //to task3是xml里节点的路线name
final ps:
jbpm每次发布后就可以启动一个流程实例,进而可以分每个用户按流程往下执行。
具体服务如下:
对象:ProcessEngine类型对象
服务:getRepositoryService 流程定义的部署,删除,查询,获得流程定义文档,对应的都是一些静态信息
getExecutionService启动一个流程实例,跳转到下一步
getTaskService查询我的任务列表,办理任务
查询对象:
2)流程实例查询对象(启动流程时使用)---processEngine.getExecutionService().createProcessInstanceQuery();
3)任务查询对象(任务查询)-------processEngine.getTaskService().createTaskQuery();
4)部署查询对象(流程部署使用)-------processEngine.getRepositoryService().createDeploymentQuery();
工作流框架对象:
1)Deployment----部署对象,对应就是一次部署
2)Execution-----执行对象
3)ProcessDefinition----流程定义对象,一个流程的步骤说明
4)ProcessInstance---流程实例对象,其实就是一个特殊的执行对象,特指从流程开始到结束的最大分支(流程启动,包含流程所有运行阶段)
5)Task----任务对象