`
long_yu2
  • 浏览: 334315 次
社区版块
存档分类
最新评论

jBPM一(概念及管理控制流程) 二

    博客分类:
  • jBPM
阅读更多

 

相关概念:

Process definition---流程定义

流程定义就是整个流程的一个描述.

Process instance---流程实例

一个流程实例包括了所有运行阶段, 其中最典型的属性就是跟踪当前节点的指针。它就是一个主线.

Execution---执行

一般情况下,一个流程实例是一个执行树的根节点, 当一个新的流程实例启动时,实际上流程实例就处于根节点的位置, 这时只有它的"子节点"才可以被激活。使用树状结构的原因在于, 这一概念只有一条执行路径, 使用起来更简单。 业务API不需要了解流程实例和执行之间功能的区别。 因此, API里只有一个执行类型来引用流程实例和执行。它相当于一个支线.

ProcessEngine最核心的对象,就像Hibernate中的SessionFactory一样,做任何事情都要通过它.ProcessEngine提供了获取Service的方法,以下是获取Service的方式:

RepositoryService repositoryService = processEngine.getRepositoryService();

ExecutionService executionService = processEngine.getExecutionService();

TaskService taskService = processEngine.getTaskService();

HistoryService historyService = processEngine.getHistoryService();

ManagementService managementService = processEngine.getManagementService();

IdentityService identityService = processEngine.getIdentityService();

各个Service的作用:

RepositoryService

管理流程定义

ExecutionService

执行管理,包括启动、推进、删除流程实例等操作

TaskService

任务管理

HistoryService

历史管理(执行完的数据管理)

IdentityService

jBPM的用户、组管理

ManagementService

有关查询的API:

功能说明

相应的查询API

查询“流程定义”

ProcessDefinitionQuery processDefinitionQuery =

processEngine.getRepositoryService()

.createProcessDefinitionQuery();

查询“执行对象”

(流程实例)

ProcessInstanceQuery processInstanceQuery =

processEngine.getExecutionService() //

.createProcessInstanceQuery();

查询“任务”

TaskQuery taskQuery = //

processEngine.getTaskService()//

.createTaskQuery();

查询“执行历史”

(流程实例历史)

HistoryProcessInstanceQuery historyProcessInstanceQuery =

processEngine.getHistoryService()

.createHistoryProcessInstanceQuery();

查询“任务历史”

HistoryTaskQuery historyTaskQuery =

processEngine.getHistoryService()

.createHistoryTaskQuery();

jBPM的API风格都是方法调用链的形式.

创建一个流程定义

被添加的文件可以是一个文件:

private ProcessEngine processEngine = Configuration.getProcessEngine();
 
// 部署(添加)
// jbpm4_deployment, jbpm4_deployprop, jbpm4_lob
@Test
public void deploy() {
    String deploymentId = processEngine.getRepositoryService()//
            .createDeployment()//
            .addResourceFromClasspath("aa/aa.jpdl.xml")// 必须要有一个 .jpdl.xml 文件
            .addResourceFromClasspath("aa/aa.png")//
            .deploy();
    System.out.println("部署成功,deploymentId = " + deploymentId);
}

也可以是一组文件(Zip):

/**
 * 创建一个流程定义
 */
@Test
public void createProcessDefinition() {
    //获取当前类路径下的文件
    ZipInputStream in = new ZipInputStream(CRD.class.getClassLoader()
            .getResourceAsStream("JBPM.zip"));
 
    processEngine.getRepositoryService()//
            .createDeployment()//
            .addResourcesFromZipInputStream(in)//
            .deploy();
}

推荐使用Zip文件的形式.

查询所有的流程定义

// Deployment:一次部署的信息(包含多个文件)。
// ProcessDefinition(流程定义):是指解析xx.jpdl.xml后得到的流程信息。
@Test
public void findAll() {
    // 查询
    List list = processEngine.getRepositoryService()//
            .createProcessDefinitionQuery()//
            .list();
 
    // 显示
    for (ProcessDefinition pd : list) {
        System.out.println("id=" + pd.getId()// 格式为:{key}-{version}
                + ", name=" + pd.getName()// .jpdl.xml中根元素的name属性的值
                + ", key=" + pd.getKey()// .jpdl.xml中根元素的key属性的值,如果没有指定,默认为name属性的值 。
                + ", version=" + pd.getVersion()// 版本,默认是1,或自动累加。
                + ", deploymentId=" + pd.getDeploymentId()); // 所属的Deployment记录的id
    }
}

jBPM不支持已经部署的流程定义,这也是不能提供的操作,试想几种情况之后就不能发现这是很明智的选择:如果当前有流程实例,原流程有5个步骤要去,走到一半,流程被修改成了7个步骤,中间的活动可能已经被改变了,那么就可能出现问题;或者走到了第4步的时候,流程被修改成了只有3步,那怎么办?所以不支持修改流程定义不仅没有对工作造成影响,还很大程度地保障了原先流程实例的正确执行,以及不对历史中的流程实例造成影响.

只能重新部署一个流程,如果和已有的流程的名字有冲突,将自动把版本号加1,以视区别.在这种情况下,就要保证以后开始的流程实例都是最新的流程实例.

查询所有最新版本的流程定义

// OrderBy的属性名在ProcessDefinitionQuery中有常量的定义。
@Test
public void findAllLatestVersions() {
    // 1,查询所有的流程定义
    // 按version排序,以便让所有最大的版本都排在最后面
    List allList = processEngine.getRepositoryService()//
            .createProcessDefinitionQuery()//
            .orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION)//
            .list();
    // 2,过滤出所需的最新版本流程定义的集合
    Map map = new HashMap();
    for (ProcessDefinition pd : allList) {
        // ProcessDefinition pdInMap = map.get(pd.getKey());
        // if(pdInMap == null || pdInMap.getVersion() < pd.getVersion()){
        // map.put(pd.getKey(), pd);
        // }
        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()// .jpdl.xml中根元素的key属性的值,如果没有指定,默认为name属性的值 。
                + ", version=" + pd.getVersion()// 版本,默认是1,或自动累加。
                + ", deploymentId=" + pd.getDeploymentId()); // 所属的Deployment记录的id
    }
}

由于没有直接查询最新流程定义的语法,所以只能先全部查出,再进行筛选.上面的代码使用了两种方法,第一种(被注释的)每次都判断一下,以保证新的流程定义不被旧的覆盖;第二种在查询时增加了排序条件,保证新的流程定义都在后面,所以不用判断.

删除一个Deployment

@Test
public void deleteById() {
    String deploymentId = "40001";
 
    // // 删除一次部署的信息(删除相关的文件),如果有相关的运行信息,则报错
    // processEngine.getRepositoryService().deleteDeployment(deploymentId);
 
    // 删除一次部署的信息(删除相关的文件),会级联删除所有相关的运行信息
    processEngine.getRepositoryService().deleteDeploymentCascade(deploymentId);
}

删除指定key的所有版本的流程定义(所属的Deployment)

@Test
public void deleteByKey() {
    // 1,查询出指定key的所有版本的流程定义
    String key = "test";
    List list = processEngine.getRepositoryService()//
            .createProcessDefinitionQuery()//
            .processDefinitionKey(key)//
            .list();
 
    // 2,循环删除
    for (ProcessDefinition pd : list) {
        processEngine.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());
    }
}


查看流程图

@Test
public void getProcessImage() throws Exception {
    String deploymentId = "60001";
    String resourceName = "a/helloworld.png";
 
    // 获取某Deployment中所有的文件资源的名称
    Set set = processEngine.getRepositoryService().getResourceNames(deploymentId);
    for (String s : set) {
        System.out.println(s);
    }
 
    // 获取某Deployment中某资源的InputStream(内容)
    InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, resourceName);
    // 保存到 c盘
    FileOutputStream out = new FileOutputStream("c:/processImage.png");
    for (int b = -1; (b = in.read()) != -1;) {
        out.write(b);
    }
    in.close();
    out.close();
}

流程变量

上面的流程在执行的时候,没有带任何有关受理人的信息以及意见,通常在流程执行的过程中,应该记录当前活动(Activity)的数据,比如同意的理由或者不同意的理由等,这些信息通过流程变量存进数据库.流程变量也是有作用域的,与流程实例的生命周期相同,流程变量可以在流程实例的各个活动中获取和设置,假设我现在有个请假的流程定义:

image

它就是一个大大的Map,存入的流程变量都会被存入数据库中.流程变量的设置大致可以分为两种:

  • 顺便设置

ExecutionService.startProcessInstanceByKey(processDefinitionId, variables);

TaskService.completeTask(taskId, variables);

  • 专门设置

// 通过Execution设置一个流程变量
ExecutionService.setVariable(executionId, name, value);
// 通过Execution设置多个流程变量
ExecutionService.setVariables(executionId, variables)
// 通过Task设置多个流程变量
processEngine.getTaskService().setVariables(taskId, variables);

不管是以何种方式设置,如果是以给定taskId,它将会根据taskId找到当前的execution,然后才设置.对应的获取也有两种方式:

// 通过Execution获取流程变量的信息
ExecutionService.getVariable(executionId, variableName);
ExecutionService.getVariableNames(executionId);
ExecutionService.getVariables(executionId, variableNames);
// 通过Task获取流程变量的信息
TaskService.getVariable(taskId, variableName);
TaskService.getVariableNames(taskId);
TaskService.getVariables(taskId, variableNames);

最后找到execution对应的流程变量.

总结一下一个工作流系统的工作流程:

  1. 申请模板可以自由定制。
  2. 申请模板对应的流程(步骤)可以自由定制。
  3. 让文件或表单等按预定的步骤进行流转。

第二步又可分为以下几步:

  1. 要有流程设计器(画图):需要把所有规则整理清楚,并实现,最终是想能覆盖尽可能多的情况。
  2. 设计完流程后,结果是:图片,给用户看的;xml,给计算机看的。
分享到:
评论

相关推荐

    jbpm5_持久化及流转流程剖析

    3. **流程流转**:jbpm5使用条件、事件和过渡来控制流程的流转。当满足特定条件或触发特定事件时,流程会从当前节点流转到下一个节点。 4. **任务分配与处理**:jbpm5支持动态和静态的任务分配。静态分配是在流程...

    jBPM教学视频(02管理流程定义.zip)

    在本教学视频中,我们将深入探讨jBPM,一个强大的工作流管理系统,用于管理和执行业务流程。jBPM不仅是一个开源项目,还是Java平台上的一套全面的工作流解决方案,它为开发人员提供了设计、部署和监控业务流程的能力...

    jbpm5 持久化及流转流程源码剖析

    jbpm5是一个开源的工作流管理系统,它提供了流程定义、执行和监控的一整套解决方案。本文将深入探讨jbpm5的持久化机制以及流程流转的核心原理,帮助开发者更好地理解和利用这一强大的工具。 首先,我们来了解jbpm5...

    jBPM 4视频教程02管理流程定义

    3. **网关(Gateway)**:网关用于控制流程的分支和合并,如决定条件分支(Conditional Gateway)或并行分支(Parallel Gateway)。这些元素帮助实现流程的逻辑决策。 4. **事件(Event)**:事件用于响应流程中的...

    JBPM-学生管理系统

    例如,新生注册流程可能涉及多个部门审批,每个部门对应一个任务节点,通过JBPM的流程控制和任务分配功能,实现自动化流转。 ### 6. 学习与实践 学习这个项目,你可以深入了解如何将业务逻辑与工作流结合,如何...

    JBPM流程框架源码

    JBPM,全称Java Business Process Management,是一个开源的工作流管理系统,用于构建和管理业务流程。它提供了丰富的API、工作流建模工具以及执行引擎,使得开发者能够轻松地实现复杂业务流程的自动化。在本资料中...

    jbpm教程 第二部分、(安装和配置JBPM5.4及Eclipse流程插件安装)

    【JBPM教程第二部分:安装与配置JBPM5.4及Eclipse流程插件】 JBPM,全称为Java Business Process Management,是一个开源的工作流和业务流程管理(BPM)平台,它提供了完整的流程生命周期管理,包括设计、部署、...

    jbpm(java 企业工作流程管理)开了包(全)

    2. jbpm-identity.jar:此组件可能涉及jbpm的身份管理和权限控制,允许系统根据用户身份和角色执行不同的流程操作。 3. bsh.jar:BeanShell是一个轻量级的Java脚本环境,jbpm可能使用它来运行自定义的脚本逻辑,...

    jBPM教学视频(09流程图跟踪.zip)

    - 表达式和变量:理解如何在流程中使用表达式和变量来控制流程行为。 3. **流程实例管理** - 启动流程:学习如何启动一个新的流程实例,以及如何传递参数给流程。 - 流程实例查询:查找和检索正在运行或已完成的...

    jbpm4.3学习笔记及请假流程代码

    JBPM4.3的学习涵盖了环境搭建、流程设计与管理、实例控制等多个方面,通过实际的请假流程案例,可以帮助开发者深入理解和应用工作流管理。在实际项目中,可以结合企业的具体业务需求,利用JBPM构建灵活、可扩展的...

    jbpm4整合流程例子 web流程设计器

    - **连接线编辑**:设置条件分支和顺序流,控制流程的流转。 - **预览功能**:在设计过程中实时查看流程的执行路径。 - **版本控制**:保存和管理不同版本的流程定义,便于回溯和比较。 ### 3. jbpm4整合流程例子 ...

    JBPM4 开发文档 实例 流程

    JBPM4(Java Business Process Management 4)是一个轻量级的开源工作流管理系统,基于J2EE架构,旨在帮助开发者实现复杂的业务流程自动化。该项目于2004年10月18日发布2.0版本,并随后成为JBoss企业中间件平台的一...

    JBPM工作流实战_程序自动选择流程的走向视频 06

    【JBPM工作流实战_程序自动选择流程的走向视频 06】 ...通过深入学习这个视频课程,你不仅能了解到如何在JBPM中设置和控制流程的动态走向,还能增强对业务流程自动化理解和应用的能力,为实际项目开发打下坚实基础。

    一个JBPM工作流例子,JBPM

    JBPM(Java Business Process Management)是一个开源的工作流管理系统,它提供了一整套解决方案,用于设计、执行和管理业务流程。在本示例中,我们将深入探讨如何利用JBPM实现销售批复这一具体场景。 一、JBPM核心...

    jbpm4.4 简单请假流程

    - **API调用**:应用程序通过jbpm提供的Java API或REST接口与流程引擎交互,启动、查询和控制流程实例。 6. **示例代码分析**: - `ProcessInstance`的创建:调用`RuntimeManager`的`startProcess()`方法启动流程...

    流程开发java插件jbpm 使用说明 个人总结

    JBPM利用直观的流程语言,如任务、异步等待状态、定时器、自动化动作等,来构建业务流程图,这些元素共同构成了强大的控制流机制。由于是用Java语言开发的,JBPM可以被封装成Web服务,允许第三方应用进行调用。它的...

    jBPM-jPDL学习笔记——流程设计与控制(转载)

    使用jPDL,开发者可以通过设置条件、事件和监听器来控制流程的行为。条件决定流程的走向,事件可以触发流程的特定行为,而监听器则可以捕获流程中的重要状态变化。 4. **数据库配置**: jBPM需要一个数据库来存储...

    jBPM2-流程图与JBPM API.ppt

    jBPM(Java Business Process Management)是一个开源的工作流管理系统,专注于业务流程的建模、执行和管理。jBPM2 版本中,流程图和JBPM API 是核心组成部分,帮助开发者实现复杂的业务流程自动化。 ### 1. jBPM-...

    一个Jbpm实例代码

    Jbpm,全称Java Business Process Management,是一个开源的工作流管理系统,用于设计、执行和管理业务流程。它提供了一套完整的工具集,包括流程建模、部署、执行、监控和优化,使得企业可以更加灵活地管理和自动化...

    jbpm3.2 简单的请假流程

    3. **工作流引擎**:jbpm的核心组件是工作流引擎,它负责解析流程定义,控制流程实例的执行,并根据业务规则进行状态转换。 4. **任务服务**:jbpm提供任务服务,用于分配和管理工作任务。例如,当员工提交请假申请...

Global site tag (gtag.js) - Google Analytics