JBPM4.4业务流程管理框架详细解读
1. 什么是JBPM4.4业务流程管理框架?
JBPM,全称是JavaBusiness Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。
相关概念:a: 从一个节点到另一个节点==>流转。b:程序预先设定的行为==>活动。
2. JBPM工作流的特点
2.1 直观描述业务流程
2.2 使用Hibernate管理数据库
3 ProcessEngine的核心服务
4 怎么用JBMP?
4.1 所需环境与相关资源
4.2 安装说明
第一步:
Help -->Install New Software...
ClickAdd...
In dialogAdd Site dialog, clickArchive...
Navigate toinstall/src/gpd/jbpm-gpd-site.zip and click 'Open'
ClickingOK in theAdd Site dialog will bring you back to the dialog 'Install'
Select thejPDL 4 GPD Update Site that has appeared
ClickNext... and thenFinish
Approve the license
Restart eclipse when that is asked
第二步:
流程定义文件的xsd文件的路径为:JBPM_HOME/src/jpdl-4.4.xsd。
添加到Eclipse中的方法为(jBPM4.4User Guide, 2.11.5. Adding jPDL 4 schema tothe catalog):
ClickWindow -->Preferences
SelectXML -->XML Catalog
Click 'Add...'
The 'Add XML Catalog Entry' dialog opens
Click the button with the map-icon next to location and select 'FileSystem...'
In the dialog that opens, select filejpdl-4.4.xsd in the src directoryof the jBPM installation root.
Click 'Open' and close all the dialogs
第三步:添加jar包
1. JBPM解压目录下有一个重要的jar包:jbpm.jar。
2. JBPM/lib目录下的jar很多,不要添加的jar包:servlet-api.jar、junit.jar(尤其不要添加)。
3. 所使用的数据库对应的驱动的jar包在上面lib目录当中已经有了,所以不需要添加了。
第四步: 添加配置文件
- <?xml version="1.0" encoding="UTF-8"?>
- <jbpm-configuration>
- <import resource="jbpm.default.cfg.xml" />
- <import resource="jbpm.businesscalendar.cfg.xml" />
- <import resource="jbpm.tx.hibernate.cfg.xml" />
- <import resource="jbpm.jpdl.cfg.xml" />
- <import resource="jbpm.bpmn.cfg.xml" />
- <import resource="jbpm.identity.cfg.xml" />
- <!-- Job executor is excluded for running the example test cases. -->
- <!-- To enable timers and messages in production use, this should be included. -->
- <!--
- <import resource="jbpm.jobexecutor.cfg.xml" />
- -->
- </jbpm-configuration>
jbpm.cfg.xml
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
- <hibernate-configuration>
- <session-factory>
- <!-- 数据库信息 -->
- <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
- <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
- <property name="hibernate.connection.url">jdbc:mysql:///jbpm4test</property>
- <property name="hibernate.connection.username">root</property>
- <property name="hibernate.connection.password">root</property>
- <!-- 其他配置 -->
- <property name="hibernate.hbm2ddl.auto">update</property>
- <!-- 导入映射文件 -->
- <mapping resource="jbpm.repository.hbm.xml" />
- <mapping resource="jbpm.execution.hbm.xml" />
- <mapping resource="jbpm.history.hbm.xml" />
- <mapping resource="jbpm.task.hbm.xml" />
- <mapping resource="jbpm.identity.hbm.xml" />
- </session-factory>
- </hibernate-configuration>
jbpm.hibernate.cfg.xml
4.3 JBPM工作流的使用
1. 创建jbpm的文件
2. 绘制工作流程图
- <?xml version="1.0" encoding="UTF-8"?>
- <process name="员工请假流程" xmlns="http://jbpm.org/4.4/jpdl">
- <start g="77,20,48,48" name="start1">
- <transition g="-71,-17" name="to 提交申请" to="提交申请"/>
- </start>
- <end g="77,352,48,48" name="end1"/>
- <task assignee="ww" g="55,268,92,52" name="总经理审批">
- <transition g="-47,-17" name="to end1" to="end1"/>
- </task>
- <task assignee="ls" g="55,184,92,52" name="部门经理审批">
- <transition g="-26,-8" name="同意" to="总经理审批"/>
- </task>
- <task assignee="#{applyInfo.applier.userName}" g="55,100,92,52" name="提交申请">
- <transition g="-96,-16" name="to 部门经理审批" to="部门经理审批"/>
- </task>
- </process>
保存之后相应的生成png格式的对应的图片。
4.4 JBPM工作流编程实例
4.4.1 JBPM建表
- // 建表
- @Test
- public void createSchema() {
- new org.hibernate.cfg.Configuration()//
- .configure("jbpm.hibernate.cfg.xml")//
- .buildSessionFactory();
- }
4.4.2 创建ProcessEngine对象
- private static ProcessEngine processEngine = new Configuration()//
- .setResource("jbpm.cfg.xml")//
- .buildProcessEngine();
- private ProcessEngine processEngine = new Configuration().buildProcessEngine();
3. 通过默认的配置文件生成单例的processEngine对象
- private ProcessEngine processEngine = Configuration.getProcessEngine();
4.4.3 部署流程定义
- <span style="white-space:pre"> </span>// 部署流程定义
- @Test
- public void deployProcessDefinition()
- {
- String reponseStr = processEngine.getRepositoryService()//
- .createDeployment()//
- .addResourceFromClasspath("test/test.jpdl.xml")//这里目录需要根据自己的目录确定
- .addResourceFromClasspath("test/test.png")//
- .deploy();
- System.out.println(reponseStr);// 10001
- }
4.4.4 启动流程实例
- // 启动流程实例
- // jbpm4_execution
- @Test
- public void testStartProcessInstance() throws Exception
- {
- ProcessInstance processInstance = processEngine.getExecutionService().startProcessInstanceByKey("test");System.out.println("流程实例启动成功:id=" + processInstance .getId() + ", state=" +processInstance.getState() + ", processDefinitionId=" +
- processInstance
.getProcessDefinitionId()); // 所使用的流程定义的ID
- }
2. 通过key获取并直接启动实例
- // 启动实例
- @Test
- public void startProcessInstance() {
- processEngine.getExecutionService().startProcessInstanceByKey("test");
- }
4.4.5 查看个人的任务列表
- // 查询任务列表
- @Test
- public void findTaskList() {
- List<Task> taskList = processEngine.getTaskService().findPersonalTasks("员工");
- System.out.println("个人任务列表");
- System.out.println(taskList);
- for(Task task : taskList)
- {
- System.out.println("id= " + task.getId() + ", name = " + task.getName() + ", assignee = " + task.getAssignee());
- }
- }
4.4.6 查询所有的流程定义
- // 查询所有
- @Test
- public void findAll() throws Exception {
- // 查询
- List<ProcessDefinition> list = processEngine.getRepositoryService()//
- .createProcessDefinitionQuery()//
- // 过滤条件
- // .processDefinitionKey("")//
- // .processDefinitionNameLike("%xx%")//
- // 排序条件
- // .orderAsc(ProcessDefinitionQuery.PROPERTY_KEY)//
- // .orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION)//
- // 执行查询
- // .uniqueResult();
- // .count();
- // .page(firstResult, maxResults)//
- .list();
- // 显示
- for (ProcessDefinition pd : list) {
- System.out.println("id=" + pd.getId()// 格式为:{key}-{version},用于唯一的标识一个流程定义
- + ", name=" + pd.getName()// 流程定义的名称,jpdl.xml中根元素的name属性的值
- + ", key=" + pd.getKey()// 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值
- + ", version=" + pd.getVersion()// 自动生成的,同一个名称的第一个为1,以后的自动加1.
- + ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象
- }
- }
4.4.7 查询最新版的流程定义
- // 查询所有最新版本的流程定义
- @Test
- public void findAllLatestVersions() throws Exception {
- // 查询所有,让所有最大的版本都排到最后面
- List<ProcessDefinition> all = processEngine.getRepositoryService()//
- .createProcessDefinitionQuery()//
- .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//
- .list();
- // 过滤出所有最新的版本
- Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
- for (ProcessDefinition pd : all) {
- map.put(pd.getKey(), pd);
- }
- // 显示
- for (ProcessDefinition pd : map.values()) {
- System.out.println("id=" + pd.getId()// 格式为:{key}-{version},用于唯一的标识一个流程定义
- + ", name=" + pd.getName()// 流程定义的名称,jpdl.xml中根元素的name属性的值
- + ", key=" + pd.getKey()// 流程定义的key,jpdl.xml中根元素的key属性的值,默认是name属性的值
- + ", version=" + pd.getVersion()// 自动生成的,同一个名称的第一个为1,以后的自动加1.
- + ", deploymentId=" + pd.getDeploymentId()); // 所属的部署对象
- }
- }
4.4.8 删除流程定义
- // 删除
- @Test
- public void deleteById() throws Exception {
- String deploymentId = "80001";
- // // 删除指定的部署对象(流程定义),如果有关联的执行信息,就会报错
- // processEngine.getRepositoryService().deleteDeployment(deploymentId);
- // 删除指定的部署对象(流程定义),如果有关联的执行信息,会被同时删除
- processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
- }
- // 删除指定key的所有版本的流程定义
- @Test
- public void deleteByKey() throws Exception {
- // 查询出指定key的所有版本的流程定义
- List<ProcessDefinition> list = processEngine.getRepositoryService()//
- .createProcessDefinitionQuery()//
- .processDefinitionKey("helloworld")//
- .list();
- // 一一删除
- for (ProcessDefinition pd : list) {
- processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
- }
- }
4.4.9 查看流程图
- // 查看流程图(xxx.png)
- @Test
- public void getImageResource() throws Exception {
- String deploymentId = "50001";
- String resourceName = "helloworld/helloworld.png";
- // 获取指定部署对象中的所有资源的名称
- Set<String> names = processEngine.getRepositoryService().getResourceNames(deploymentId);
- System.out.println("所有的资源名称:");
- for (String name : names) {
- System.out.println("\t" + name);
- }
- // 获取指定部署对象中的指下资源的内容
- InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
- // 保存到c盘
- OutputStream out = new FileOutputStream("c:/process.png");
- for (int b = -1; (b = in.read()) != -1;) {
- out.write(b);
- }
- in.close();
- out.close();
- }
4.4.10 向后执行一步
- // 向后执行一步
- @Test
- public void testSignalExecution() throws Exception {
- String executionId = "test.130001";
- processEngine.getExecutionService().signalExecutionById(executionId);
- // processEngine.getExecutionService().signalExecutionById(executionId, parametersMap); // 离开前先设置一些流程变量
- // processEngine.getExecutionService().signalExecutionById(executionId, signalName); // 使用指定名称的Transition离开本活动
- // processEngine.getExecutionService().signalExecutionById(executionId, signalName, parameters) // 离开前先设置一些流程变量,再使用指定名称的Transition离开本活动
- }
4.4.11 办理任务
- // 办理任务
- @Test
- public void testCompleteTask() throws Exception {
- String taskId = "130002";
- processEngine.getTaskService().completeTask(taskId);
- }
4.4.12 设置流程变量
- // 设置流程变量
- @Test
- public void testSetVariable() throws Exception {
- String executionId = "test.150001";
- processEngine.getExecutionService().setVariable(executionId, "请假天数", 15);
- }
- // 获取流程变量
- @Test
- public void testGetVariable() throws Exception {
- String executionId = "test.150001";
- Integer days = (Integer) processEngine.getExecutionService().getVariable(executionId, "请假天数");
- System.out.println("请假天数 = " + days);
- }
- {
- ExecutionService executionService = processEngine.getExecutionService();
- TaskService taskService = processEngine.getTaskService();
- // ============ 设置变量 ========================
- executionService.setVariable(executionId, name, value); // 设置一个变量
- executionService.setVariables(executionId, variablesMap); // 设置多个变量
- taskService.setVariables(taskId, variables); // 设置多个变量
- executionService.startProcessInstanceByKey(processDefinitionKey, variablesMap); // 启动流程实例时,先设置一些变量
- taskService.completeTask(taskId, variablesMap); // 真正办理完任务前先设置一些变量
- // ============ 获取变量 ========================
- executionService.getVariable(executionId, variableName); // 获取一个变量
- executionService.getVariableNames(executionId); // 返回Set<String>,是所有变量的名称集合
- executionService.getVariables(executionId, variableNames); //获取多个变量,返回Map<String,Object>,表示指定名称的变量信息
- taskService.getVariable(taskId, variableName);
- taskService.getVariableNames(taskId);
- taskService.getVariables(taskId, variableNames);
- }
4.4.13 流程执行
- @Test
- public void testProcess() throws Exception {
- // 部署流程定义
- InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");
- String deploymentId = processEngine.getRepositoryService()//
- .createDeployment()//
- .addResourceFromInputStream("test.jpdl.xml", in)//
- .deploy();
- System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);
- // 启动流程实例
- ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");
- System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());
- // 完成第一步“提交申请”的任务,要使用指定的Transition离开当前活动
- Task task = processEngine.getTaskService()//
- .createTaskQuery()// 获取本流程实例中当前情况下仅有的一个任务
- .processInstanceId(pi.getId())//
- .uniqueResult();
- String transitionName1 = "to 部门经理审批";
- String transitionName2 = "to 总经理审批";
- processEngine.getTaskService().completeTask(task.getId(), transitionName2); // 使用指定名称的Transition离开本活动
- }
4.4.14 分配任务
- public class AssignmentHandlerImpl implements AssignmentHandler {
- // 计算此任务的办理人,并分配任务
- @Override
- public void assign(Assignable assignable, OpenExecution execution) throws Exception {
- System.out.println("---> AssignmentHandlerImpl.assign()");
- // 计算办理人
- String userId = "李经理--";
- // 分配个人任务
- assignable.setAssignee(userId); // 指定个人任务的办理人
- // // 分配组任务
- // assignable.addCandidateUser("小A"); // 添加一个候选人(组任务)
- // assignable.addCandidateUser("小B"); // 添加一个候选人(组任务)
- // assignable.addCandidateUser("小C"); // 添加一个候选人(组任务)
- }
- }
4.4.15 组任务与分配
- public class ProcessTest {
- private static ProcessEngine processEngine = Configuration.getProcessEngine();
- @Test
- public void testProcess() throws Exception {
- // 部署流程定义
- InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml");
- String deploymentId = processEngine.getRepositoryService()//
- .createDeployment()//
- .addResourceFromInputStream("test.jpdl.xml", in)//
- .deploy();
- System.out.println("部署流程定义完毕:deploymentId = " + deploymentId);
- // 启动流程实例
- Map<String, Object> variables = new HashMap<String, Object>();
- variables.put("manager", "王经理");
- variables.put("userIds", "小A,小B,小C,小D");
- ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test", variables);
- System.out.println("流程实例启动完毕:processInstanceId = " + pi.getId());
- }
- // 查询组任务列表
- @Test
- public void testFindMyGroupTaskList() throws Exception {
- String userId = "王工程师";
- // String userId = "赵工程师";
- // 查询
- // List<Task> list = processEngine.getTaskService().findGroupTasks(userId);
- // 分页
- List<Task> list = processEngine.getTaskService()//
- .createTaskQuery()//
- .candidate(userId)// 指定候选人,这是查询组任务
- .page(0, 100)// 分页
- .list();
- // 显示
- System.out.println("====== " + userId + "的个人任务列表 ======");
- for (Task task : list) {
- System.out.println("id=" + task.getId()//
- + ", name=" + task.getName()//
- + ", assignee=" + task.getAssignee()//
- + ", createTime=" + task.getCreateTime()//
- + ", executionId=" + task.getExecutionId());
- }
- }
- // 拾取任务
- @Test
- public void testTakeTask() throws Exception {
- String taskId = "310009";
- String userId = "王工程师";
- processEngine.getTaskService().takeTask(taskId, userId);
- }
- // 查询个人任务列表
- @Test
- public void testFindMyPersonalTaskList() throws Exception {
- String userId = "王工程师";
- // 查询
- // List<Task> list = processEngine.getTaskService().findPersonalTasks(userId);
- // 分页
- List<Task> list = processEngine.getTaskService()//
- .createTaskQuery()//
- .assignee(userId)// 指定办理人条件
- .page(0, 100)// 分页
- .list();
- // 显示
- System.out.println("====== " + userId + "的个人任务列表 ======");
- for (Task task : list) {
- System.out.println("id=" + task.getId()//
- + ", name=" + task.getName()//
- + ", assignee=" + task.getAssignee()//
- + ", createTime=" + task.getCreateTime()//
- + ", executionId=" + task.getExecutionId());
- }
- }
- // 直接指定任务的办理人
- @Test
- public void testAssignTask() throws Exception {
- String taskId = "310009";
- // String userId = null; // 退回到组任务列表
- String userId = "赵工程师";
- processEngine.getTaskService().assignTask(taskId, userId);
- }
- }
如需转载;请注明原文出处谢谢合作!
JBPM4.4业务流程管理框架详细解读的更多相关文章
- MemCache超详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- MemCache超详细解读 图
http://www.cnblogs.com/xrq730/p/4948707.html MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于 ...
- rpm软件包管理的详细解读
CentOS系统上使用rpm命令管理程序包:安装.卸载.升级.查询.校验.数据库维护 1.基本安装 rpm -ivh PackageFile 2.rpm选项 rpm -ivh --test Packa ...
- MemCache详细解读
MemCache是什么 MemCache是一个自由.源码开放.高性能.分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高 ...
- Android BLE蓝牙详细解读
代码地址如下:http://www.demodashi.com/demo/15062.html 随着物联网时代的到来,越来越多的智能硬件设备开始流行起来,比如智能手环.心率检测仪.以及各式各样的智能家 ...
- 为你详细解读HTTP请求头的具体含意
当我们打开一个网页时,浏览器要向网站服务器发送一个HTTP请求头,然后网站服务器根据HTTP请求头的内容生成当次请求的内容发送给浏览器.你明白HTTP请求头的具体含意吗?下面一条条的为你详细解读,先看 ...
- 详细解读Volley(三)—— ImageLoader & NetworkImageView
ImageLoader是一个加载网络图片的封装类,其内部还是由ImageRequest来实现的.但因为源码中没有提供磁盘缓存的设置,所以咱们还需要去源码中进行修改,让我们可以更加自如的设定是否进行磁盘 ...
- 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块
详细解读Python的web.py框架下的application.py模块 这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...
- VINS-mono详细解读
VINS-mono详细解读 极品巧克力 前言 Vins-mono是香港科技大学开源的一个VIO算法,https://github.com/HKUST-Aerial-Robotics/VINS-Mono ...
随机推荐
- Android 四大组件 与 MVC 架构模式
作为一个刚从JAVA转过来的Android程序员总会思考android MVC是什么样的? 首先,我们必须得说Android追寻着MVC架构,那就得先说一下MVC是个啥东西! 总体而来说MVC不能说是 ...
- CSS3-06 样式 5
浮动(Float) 关于浮动,要说的可能就是:一个设置了浮动的元素会尽量向左移动或向右移动,且会对其后的元素造成影响,其后的元素会排列在其围绕在其左下或右下部.似乎就这么简单,但是在实际开发中,它应用 ...
- 学习 AppFuse
1.Appfuse是个什么鬼? AppFuse是一个集成了当前最流行的Web应用框架的一个更高层次的Web开发框架.换句话说,AppFuse就是一个完整的各主流框架的整合版本.AppFuse总是能够紧 ...
- HADOOP安装指南-Ubuntu15.10和hadoop2.7.2
Ubuntu15.10中安装hadoop2.7.2安装手册 太初 目录 1. Hadoop单点模式... 2 1.1 安装步骤... 2 0.环境和版本... 2 1.在ubu ...
- 中断ORACLE数据库关闭进程导致错误案例
昨晚下班的时候,我准备关闭本机的虚拟机上的ORACLE数据库后准备下班,但是由于我SecureCRT开了多个窗口,结果一不小心,疏忽之下在一个生产服务器上执行了shutdown immediate命令 ...
- RMAN还原遭遇ORA-32006&ORA-27102错误
案例环境: 服务器A: 操作系统 : Red Hat Enterprise Linux ES release 4 (Nahant Update 6) 数据库版本: Oracle Database ...
- SQL Server 2008 R2——用CTE进行递归计算求解累计值
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- SQL数据库修改默认备份和恢复路径
每次都做数据恢复和备份的时候,点Add文件,系统会自动指定到一个默认路径,是SQL的安装目录,但是我的数据库不是备份在这里,每次都要更改有点麻烦. 如上图,更改这个有三个方法. 方法一:找到注册表,手 ...
- sql server: sql script
select ProductGUID,ProductName,ProjectGUID from dbo.Product /* F637A079-E22B-4E50-87E9-000147B1B1F4 ...
- H5框架之Bootstrap(一)
H5框架之Bootstrap(一) 接下来的时间里,我将和大家一起对当前非常流行的前端框架Bootstrap进行速度的学习,以案例的形式.对刚开始想学习Bootstrap的同学而找不着边的就很有帮助了 ...