流程定义的管理:
将定义业务流程,部署到 jbpm框架中 (流程定义 jpdl.xml 描述文件)
通过gpd 插件 先根据业务流程,绘制流程图 (holiday.jpdl.xml 和 holiday.png )

流程定义部署 :
先获得 ProcessEngine 对象,再获得对应 Service (六个Service)

ExecutionService    getExecutionService() // 流程实例管理 HistoryService     getHistoryService() // 历史记录管理IdentityService     getIdentityService() // 用户认证管理ManagementService    getManagementService() // 任务调度 RepositoryService    getRepositoryService() // 流程定义管理TaskService          getTaskService()  // 任务关联

操作流程定义,需要使用 RepositoryService
deployment 将需要发布到JBPM框架中流程文件,添加到对象中

     // 1、 先获得流程引擎 (JBPM编程核心)Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、通过引擎获得需要Service RepositoryService repositoryService = processEngine.getRepositoryService();// 3、发布流程定义NewDeployment deployment = repositoryService.createDeployment();deployment.addResourceFromClasspath("holiday.jpdl.xml");deployment.addResourceFromClasspath("holiday.png");deployment.deploy();

流程定义发布,影响的数据表分析
JBPM的数据记录采用流水号 id ,在 jbpm4_property 表中用来保存下次操作的开始id, Value 初始化值是1, 每进行过一轮数据库操作,记录+10000

jbpm4_deployment 流程定义发布表,每发布一个流程,在该表插入1条记录 ,DBID 就是流水号

jbpm4_lob 存放大数据(二进制) 存放发布流程定义文件

jbpm4_deployprop 流程定义属性表 ,每发布一个流程,将流程属性信息保存到该表

langid 是jpdl语言规范版本号、pdid 流程定义唯一标识、pdkey 流程定义关键字、pdversion 流程定义版本号
在绘制流程定义时,name值就是默认的key值 ,version每次发布相同key ,version自动+1

发布流程定义,在实际开发中,都是通过 zip压缩包发布

     //发布流程定义NewDeployment deployment = repositoryService.createDeployment();deployment.addResourcesFromZipInputStream(new ZipInputStream(new FileInputStream("holiday.zip")));deployment.deploy();

流程定义查询 :
通过 ProcessDefinitionQuery查询流程定义信息

ProcessDefinitionQuery processDefinitionQuery
= repositoryService.createProcessDefinitionQuery();

对 ProcessDefinitionQuery 添加查询条件

processDefinitionId(processDefinitionId)
processDefinitionKey(key)
processDefinitionName(name)
processDefinitionNameLike(name)
page(firstResult, maxResults)
orderAsc(property)
orderDesc(property)

通过 指定属性查询,可以进行排序和分页 查询

List<ProcessDefinition> list = processDefinitionQuery
.orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION)
.page(0, 2).list();

根据发布编号 和 资源名称可以获得 该流程相关资源

     // 查询流程图// deploymentId 来自 jbpm4_deployment表 DBID// ResourceName 来自 jbpm4_lob 表 NAMEInputStream in = repositoryService.getResourceAsStream("1", "holiday/holiday.png");OutputStream out = new FileOutputStream("c:/test.png");int b ;while((b=in.read())!=-1){out.write(b);}in.close();out.close();

流程定义的删除 :

把流程 彻底从JBPM 框架中删除了
RepositoryService 提供两个方法 用来删除 流程定义
可以通过流程定义发布id删除流程定义
方式一:如果有关联流程实例信息则报错
repositoryService.deleteDeployment(deploymentId);
方式二:删除流程定义,并删除关联流程实例
repositoryService.deleteDeploymentCascade(deploymentId);
Cascade 级联的含义, 删除流程定义时,管理流程实例信息 也会被一起删除,执行删除后,关联 lob表和 prop表数据也都删除了, 关联流程实例信息也会被删除
可以通过流程定义的key来删除
如果没有指定key属性,那么流程的名称就是key

// 先根据key 进行查询,在执行删除ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();List<ProcessDefinition> list =
processDefinitionQuery.processDefinitionKey("holiday").list();for (ProcessDefinition processDefinition : list) {          repositoryService.deleteDeploymentCascade(processDefinition.getDeploymentId());}

流程定义没有修改功能,可以发布一个新流程,版本自动+1

代码示例:

package com.my.jbpm;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import java.util.zip.ZipInputStream;import org.jbpm.api.Configuration;
import org.jbpm.api.NewDeployment;
import org.jbpm.api.ProcessDefinition;
import org.jbpm.api.ProcessDefinitionQuery;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.RepositoryService;
import org.junit.Test;public class JBPMTest2 {@Test//部署 流程定义文件 public void deploy1(){// 1、 先获得流程引擎 (JBPM编程核心)Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、通过引擎获得需要Service RepositoryService repositoryService = processEngine.getRepositoryService();// 3、发布流程定义NewDeployment deployment = repositoryService.createDeployment();deployment.addResourceFromClasspath("holiday.jpdl.xml");deployment.addResourceFromClasspath("holiday.png");deployment.deploy();}@Test// 部署流程定义文件 (zip格式,内含文件夹)public void deploy2() throws FileNotFoundException{// 1、 先获得流程引擎 (JBPM编程核心)Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、通过引擎获得需要Service RepositoryService repositoryService = processEngine.getRepositoryService();// 3、发布流程定义NewDeployment deployment = repositoryService.createDeployment();deployment.addResourcesFromZipInputStream(new ZipInputStream(new FileInputStream("holiday.zip")));deployment.deploy();}@Test// 流程定义查询 public void query(){// 1、流程引擎Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、获得对应的ServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 3、 查询流程定义ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();List<ProcessDefinition> list = processDefinitionQuery.orderDesc(ProcessDefinitionQuery.PROPERTY_VERSION).page(0, 2).list(); // 查询所有流程定义for (ProcessDefinition processDefinition : list) {System.out.println(processDefinition.getId()); // 打印id}}@Test// 查询流程定义图 public void queryPng() throws IOException{// 1、流程引擎Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、获得对应的ServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 3. 查询流程图// deploymentId 来自 jbpm4_deployment表 DBID// ResourceName 来自 jbpm4_lob 表 NAMEInputStream in = repositoryService.getResourceAsStream("1", "holiday/holiday.png");OutputStream out = new FileOutputStream("c:/test.png");int b ;while((b=in.read())!=-1){out.write(b);}in.close();out.close();}@Test// 删除流程定义public void delete(){// 1、流程引擎Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、获得对应的ServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 3、执行删除 // deploymentId 是 jbpm4_deployment 的 DBIDrepositoryService.deleteDeploymentCascade("10001");}@Test// 删除所有key 为 holiday 的流程public void deleteByKey(){// 1、流程引擎Configuration configuration = new Configuration();ProcessEngine processEngine = configuration.buildProcessEngine();//新建一个引擎// 2、获得对应的ServiceRepositoryService repositoryService = processEngine.getRepositoryService();// 3、先根据key 进行查询,在执行删除ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();List<ProcessDefinition> list = processDefinitionQuery.processDefinitionKey("holiday").list();for (ProcessDefinition processDefinition : list) {repositoryService.deleteDeploymentCascade(processDefinition.getDeploymentId());}}}

流程实例操作: 通过ExecutionService对流程实例进行操作

启动流程实例 :
通过实例pdid启动
executionService.startProcessInstanceById(“holiday-1”);
通过实例pdkey启动(默认启动相同key最新实例)
executionService.startProcessInstanceByKey(“holiday”);
如果多个流程具有相同key,会启动版本最高的那个流程

启动流程实例,影响的数据表:
jbpm4_execution 正在运行流程实例信息表,ExecutionId实例ID,ID_: holiday.10001

jbpm4_hist_procinst 流程实例历史记录表

启动实例,流转到任务节点 jbpm4_task 正在运行任务数据表

jbpm4_hist_task 任务历史记录表

jbpm4_hist_actinst 活动的历史记录表

流程实例流转操作:
通过 ExecutionService 提供 signalExecutionById (ExecutionId )
根据流程实例id 进行流转
直接中止流程
processEngine.getExecutionService().endProcessInstance(ExecutionId, ProcessInstance.STATE_ENDED);

代码示例:

package com.my.jbpm;import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.ProcessInstance;
import org.junit.Test;public class JBPMTest3 {@Test// 启动一个流程 实例public void demo1(){// 有一个人 要执行请假流程// 1、流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得对应的Service对象 ExecutionService executionService = processEngine.getExecutionService();// 3、启动具体流程 // 根据 pdId 启动// executionService.startProcessInstanceById("holiday-1");// 根据key启动 executionService.startProcessInstanceByKey("holiday");}@Test// 流程实例 向后流转public void demo2(){// 1、流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得对应的Service对象 ExecutionService executionService = processEngine.getExecutionService();// 3、向后流转// ExecutionId 流程实例id 在 jbpm4_execution 表 ID_ 字段// 在向后流转时,"to 部门经理审批" 是 transition的 name 属性executionService.signalExecutionById("holiday.10001","to 员工请假申请");}@Test// 流程实例 流转 (直接中止)public void demo3(){// 1、流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得对应的Service对象 ExecutionService executionService = processEngine.getExecutionService();// 3、中止流程 executionService.endProcessInstance("holiday.10001", ProcessInstance.STATE_ENDED);}}

任务操作 :TaskService 进行任务节点操作
在实际开发中, 任务节点,通常不使用流程实例流转功能 signalExecutionById
任务办理,都是通过 特定用户,以form表单提交方式进行的,任务办理后,流转自动流转
在流程图上面,为每个任务,指定任务的负责人 ,assignee属性用来指定 个人任务

添加负责人后的holiday.jpdl.xml

<?xml version="1.0" encoding="UTF-8"?><process name="holiday" xmlns="http://jbpm.org/4.4/jpdl"><start g="369,43,48,48" name="start1"><transition g="-93,-22" name="to 员工请假申请" to="员工请假申请"/></start><task g="358,168,92,52" name="员工请假申请" assignee="员工"><transition g="-93,-22" name="to 部门经理审批" to="部门经理审批"/></task><end g="378,384,48,48" name="end1"/><task g="364,281,92,52" name="部门经理审批" assignee="部门经理"><transition g="-50,-22" name="to end1" to="end1"/></task>
</process>

查看流程运行到哪个任务节点

     // 查询 当前流程实例的任务 TaskQuery taskQuery = taskService.createTaskQuery();// 任务查询List<Task> list = taskQuery.executionId("holiday.10001").list(); // 根据流程实例id 查询 for (Task task : list) {System.out.println(task.getName());}

查看个人任务
taskService.createTaskQuery().assignee(“张三”).list(); // 用于负责查询
taskService.findPersonalTasks(“张三”);

     // 查询个人任务List<Task> list = taskService.findPersonalTasks("员工"); // userId 就是 assignee 值for (Task task : list) {System.out.println("任务编号:" + task.getId() +", 任务名称:" + task.getName());}

任务编号,就是 jbpm4_task 表 DBID

个人任务办理:TaskService提供completeTask(taskId)完成指定的任务
taskService.completeTask(“20001”);
办理任务后,流程自动向后流转

Task节点通常需要特定人参与完成,使用 completeTask
signalExecutionById 主要用于自动流转活动节点(不需要人工干预 )

代码示例:

package com.my.jbpm;import java.util.List;import org.jbpm.api.Configuration;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.TaskQuery;
import org.jbpm.api.TaskService;
import org.jbpm.api.task.Task;
import org.junit.Test;public class JbpmTest4 {@Test// 查询流程实例的当前任务 public void demo1(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、 获得对应ServiceTaskService taskService = processEngine.getTaskService();// 3、查询 当前流程实例的任务 TaskQuery taskQuery = taskService.createTaskQuery();// 任务查询List<Task> list = taskQuery.executionId("holiday.10001").list(); // 根据流程实例id 查询 for (Task task : list) {System.out.println(task.getName());}}@Test// 查询个人任务public void demo2(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、 获得对应ServiceTaskService taskService = processEngine.getTaskService();// 3、查询个人任务List<Task> list = taskService.findPersonalTasks("部门经理"); // userId 就是 assignee 值for (Task task : list) {System.out.println("任务编号:" + task.getId() +", 任务名称:" + task.getName());}}@Test// 办理个人任务 public void demo3(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、 获得对应ServiceTaskService taskService = processEngine.getTaskService();// 3、办理个人任务// taskId 是 jbpm4_task 表 DBIDtaskService.completeTask("20001");}}

流程变量操作 :
JBPM支持的流程变量类型
 java.lang.String
 java.lang.Long
 java.lang.Double
 java.util.Date
 java.lang.Boolean
 java.lang.Character
 java.lang.Byte
 java.lang.Short
 java.lang.Integer
 java.lang.Float
 byte[] (byte array)
 char[] (char array)
 hibernate entity with a long id
 hibernate entity with a string id
 serializable

流程实例变量的读写:
变量是和流程实例相关的数据,操作流程变量,通常使用 ExecutionService 和 TaskService 两个对象

在流程实例启动时,通过ExecutionService 保存流程变量

Map<String,Object> variables = new HashMap<String, Object>();
variables.put("test", "Hello JBPM");
executionService.startProcessInstanceByKey("holiday",variables);

在运行后,流程实例变量 保存 jbpm4_variable 表中

ExecutionService 结合 ExecutionId 进行流程变量 读写

// 读取
String company =
(String) executionService.getVariable("holiday.30001", "test");
// 写入
executionService.setVariable("holiday.30001", "weather", "阴天");

TaskService 结合 taskId 进行流程变量 读写

// 读取
String weather = (String) taskService.getVariable("30003", "weather");// 写入
Map<String,Object> variables = new HashMap<String, Object>();
variables.put("年龄", 20);
taskService.setVariables("30003", variables);

向流程实例中,保存复杂对象
做法一 : 将对象实现Serializable 接口
变量信息 jbpm4_variable 表中,Class:blob, converter:ser-bytes 说明对象 是 序列化存储
数据保存 jbpm4_lob 表中

做法二 : 将对象配置成Hibernate PO对象
long类型或者String 类型主键
Class: hld-long 是hibernate的long类型主键实体对象
ClassName: com.my.jbpm.Product 完整类名
Long-value : 1 是PO对象id

代码示例:
User.java

package com.my.jbpm;import java.io.Serializable;//将User对象 保存流程实例中(序列化)
public class User implements Serializable{private Integer id ;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

Product.java

package com.my.jbpm;//保存流程变量 (配置 PO对象)
public class Product {private Long id ;private String name;private Double price ;public Long getId() {return id;}public void setId(Long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Double getPrice() {return price;}public void setPrice(Double price) {this.price = price;}}

Product.hbm.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping><class name="com.my.jbpm.Product" table="product"><id name="id"><generator class="identity"></generator></id><property name="name"></property><property name="price"></property></class>
</hibernate-mapping>

JBPMTest5.java

package com.my.jbpm;import java.util.HashMap;
import java.util.Map;import org.hibernate.Session;
import org.hibernate.Transaction;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.TaskService;
import org.junit.Test;public class JBPMTest5 {@Testpublic void demo1(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceExecutionService executionService = processEngine.getExecutionService();// 3、启动流程实例Map<String,Object> variables = new HashMap<String, Object>();variables.put("company", "传智播客");executionService.startProcessInstanceByKey("holiday",variables);}@Testpublic void demo2(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceExecutionService executionService = processEngine.getExecutionService();// 3、读写流程变量 // 读取String company = (String) executionService.getVariable("holiday.30001", "company");System.out.println(company);// 写入executionService.setVariable("holiday.30001", "weather", "阴天");}// 案例三 : 使用TaskService 结合 taskId 读写流程变量 @Testpublic void demo3(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceTaskService taskService = processEngine.getTaskService();// 3、读写流程变量 // 读取String weather = (String) taskService.getVariable("30003", "weather");System.out.println(weather);// 写入Map<String,Object> variables = new HashMap<String, Object>();variables.put("年龄", 20);taskService.setVariables("30003", variables);}   @Test// 流程实例,保存序列化对象 public void demo4(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceExecutionService executionService = processEngine.getExecutionService();// 3、 保存User对象User user = new User();user.setId(1);user.setName("Rose");executionService.setVariable("holiday.30001", "user", user);}@Test// 流程实例,保存PO对象public void demo5(){// 1、 流程引擎ProcessEngine processEngine = new Configuration().buildProcessEngine();// 2、获得ServiceExecutionService executionService = processEngine.getExecutionService();// 3、 保存Product对象Product product = new Product();product.setName("冰箱");product.setPrice(3000d);Session session = new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory().openSession();Transaction transaction = session.beginTransaction();session.save(product);transaction.commit();session.close();// 关联到流程变量executionService.setVariable("holiday.30001", "product", product);}}

JBPM(二)---JBPM工作流基本操作相关推荐

  1. .net之工作流工程展示及代码分享(二)工作流引擎

    在介绍完表单类的时候,接下来介绍工作流引擎,主要由四个类组成,分别是流程.流程步骤.流程实例.流程步骤实例类. 流程类: 1 [Serializable] 2 public class Flow 3 ...

  2. 漫画算法笔记 二叉堆基本操作

    漫画算法笔记 二叉堆基本操作 #include <iostream> #include <stdlib.h> #include <vector> using nam ...

  3. [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

    [MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...

  4. .NET Core微服务 权限系统+工作流(二)工作流系统

    一.前言 接上一篇 .NET Core微服务 权限系统+工作流(一)权限系统 ,再来一发 工作流,我在接触这块开发的时候一直好奇它的实现方式,翻看各种工作流引擎代码,探究其实现方式,个人总结出来一个核 ...

  5. OpenCV修养(二)——OpenCV基本操作

    文章目录 2 OpenCV基本操作 2.1 IO操作 2.2 图像基本操作 2.2.1 图像绘制 2.2.1.1 绘制直线 2.2.1.2 绘制圆形 2.2.1.3 绘制矩形 2.2.1.4 添加文字 ...

  6. linux线程篇,linux线程篇 (二) 线程的基本操作

    线程 进程 标识符 pthread_t pid_t 获取ID pthread_self() getpid() 创建 pthread_create() fork 销毁 pthread_exit() ex ...

  7. MySQL基础(二)-数据的基本操作【增删改查】

    目录 前言: MySQL的数据文件 MyISAM类型的表文件 InnoDB类型的表文件 一.插入数据记录 - insert 1.插入单行数据 2.插入多行数据 3.将查询结果插入到新表中 二.更新数据 ...

  8. 分布式数据库NoSQL(二)——MongoDB 数据库基本操作

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系 ...

  9. 黑马程序员并发编程笔记(二)--java线程基本操作和理解

    3.java进程的基本操作 3.1.创建进程 方法一,直接使用 Thread // 构造方法的参数是给线程指定名字,,推荐给线程起个名字(用setName()也可以) Thread t1 = new ...

最新文章

  1. wParam和lParam两个参数到底是什么意思?
  2. RAC环境下的备份与恢复(二)
  3. 通过C#和Xamarin或JavaScript和基于VS的Cordova工具,VS平台上的开发者可以
  4. 58同城买二手电脑的感想
  5. Ubuntu16.04 休眠状态无法唤醒解决方案
  6. Jerry Wang 2014年在SAP社区CRM板块的积分曾经一直占据第一
  7. c语言编程运动会分数统计系统报告,独家稿件:定稿运动会分数统计系统设计报告_完整版...
  8. 成员/方法/属性/私有
  9. android9开发者模式 s8,Android 9.0或加速Galaxy S8/9电池消耗 谨慎更新
  10. docker必须要sudo,但是sudo的话,又获得不了环境变量怎么办?
  11. redhat6.3下安装ORACLE11.2.3RAC
  12. fpga一个按键控制跑马灯启停_车上这些开关都认识吗?一次带你认清车上按键...
  13. [2010-9-8]
  14. 计算机系统的组成和应用,计算机系统组成与应用领域的考点
  15. 64位程序core分析
  16. 菜鸟的Java基础知识学习
  17. java中gc是什么_深入理解Java GC
  18. Y-我的PPT监控之流媒体服务器的搭建
  19. python 病毒 基因_#Python#提取基因对应的蛋白质名
  20. 车规级芯片IC等级及其特点

热门文章

  1. Tushare Pro判断股市是否开盘
  2. python 开源项目 书_十大 Python 机器学习开源项目
  3. Python内建函数与对象方法
  4. docker,k8s部署Apollo
  5. 2008年2月28日 转换为 二○○八年二月二八日
  6. GPU计算能力和性能指标
  7. 做一个微信小程序多少钱?
  8. win7锁定计算机要密码吗,win7锁屏设置密码的方法_w7电脑锁屏密码怎么设置
  9. 20214201 Python技能树及CSDN MarkDown编辑器测评
  10. k8s中文件描述符与线程限制