jbpm工作流框架

来源:互联网 发布:linux 删除全部内容 编辑:程序博客网 时间:2024/06/06 08:52

整体流程:

用户->流程设计器->流程定义说明文档(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";  //部署时产生的idprocessEngine.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);//...输出流写到本地}

10:启动流程
      
String processdefinitionid = "requestprocess-2";ProcessInstance processInstance = processEngine.getExecutionService().startProcessInstanceById(processdefinitionid);  //启动获取一个流程对象,往execution 和 task 表里插入数据System.out.println("id:"+processInstance.getId()+",name"+processInstance.getName()+",key"+processInstance.getKey());
11:获取我的任务列表
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());}

12:办理任务
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查询我的任务列表,办理任务

查询对象:

processEngine.getXXService().createXXQuery()

1)流程定义查询对象(查询那些流程设计)---processEngine.getRepositoryService().createProcessDefinitionQuery();
2)流程实例查询对象(启动流程时使用)---processEngine.getExecutionService().createProcessInstanceQuery();
3)任务查询对象(任务查询)-------processEngine.getTaskService().createTaskQuery();
4)部署查询对象(流程部署使用)-------processEngine.getRepositoryService().createDeploymentQuery();

工作流框架对象:
1)Deployment----部署对象,对应就是一次部署
2)Execution-----执行对象
3)ProcessDefinition----流程定义对象,一个流程的步骤说明
4)ProcessInstance---流程实例对象,其实就是一个特殊的执行对象,特指从流程开始到结束的最大分支(流程启动,包含流程所有运行阶段)
5)Task----任务对象



原创粉丝点击