1.      JBPM工作流引擎是用来做什么的

首先要说明的一点是工作流引擎指的并不只是JBPM,JBPM只是工作流引擎的一种。JBPM利用JPDL流程定义语言将现实生活中处理事务的业务流程进行抽象,形成一套业务流程规则,只要处理该项业务就必须按照这个流程规则进行。举一个很简单的例子,就拿看医生来讲,看医生的整个流程必须是先挂号,再看病,再抓药,只要你进行看医生这个业务就必须按照这套流程进行。说白了,工作流引擎只是将我们人工的处理过程进行了信息化而已,也并不是多么高深的思想。但是JBPM也并不是想我所说的这样简单,毕竟是一套相对来讲比较成熟的技术,它的功能还是十分强大的,它可以用来定义顺序流程结构,选择流程结构(也就是根据条件判断来决定下一步执行哪项任务),以及多任务必须全部完成才能进行到下一步的流程结构。总之,JBPM是将生活中的各种业务处理情况进行抽象所制定出的一套业务处理规则。

2.      JBPM如何应用

使用JBPM工作流引擎一般来讲分为五部分,他们分别是部署流程,创建流程实例,获取当前活动,获取特定用户的任务,以及完成任务。其中,每一部分都是通过一项JBPM服务完成的。下面通过上面的看医生这个流程来讲解如何使用JBPM。

首先来看我们的jpdl文件:

     <?xml version="1.0" encoding="UTF-8"?>  <process key="test" name="test" xmlns="http://jbpm.org/4.4/jpdl">  <start g="275,16,48,48" name="start1">  <transition g="-60,-15" name="挂号" to="进行挂号"/>  </start>  <task assignee="nurse" g="255,101,92,52" name="进行挂号">  <transition g="-69,-20" name="提交到医师" to="医师看病"/>  </task>  <task assignee="doctor" g="259,186,92,52" name="医师看病">  <transition g="-50,-20" name="抓药" to="end1"/>  </task>  <end g="283,283,48,48" name="end1"/>     </process>  

上面的jpdl文件定义好了整个看医生的流程,它由四个节点组成,开始节点,进行挂号节点,医师看病节点以及结束节点组成。下面我们来看上面提到的具体的五部分都是怎样进行的:

     public class seeDoctor extends TestCase {  /** * 部署流程 */  public void deploy(){  //创建流程引擎  ProcessEngine processEngine = Configuration.getProcessEngine();  //创建服务  RepositoryService repositoryService = processEngine.getRepositoryService();  //部署流程  repositoryService.createDeployment().addResourceFromClasspath("seeDoctor.jpdl.xml").deploy();  }  /** * 创建流程实例 */  public void createInstance(){  //创建流程引擎  ProcessEngine processEngine = Configuration.getProcessEngine();  ExecutionService executionService = processEngine.getExecutionService();  ProcessInstance processInstance = executionService.startProcessInstanceByKey("seeDoctor");  System.out.println("流程实例ID===============" + processInstance.getId());  }  //查询流程实例当前所在节点  public void getCurrentActivity(){  ProcessEngine processEngine = Configuration.getProcessEngine();  ExecutionService executionService = processEngine.getExecutionService();  String activityName = executionService.createProcessInstanceQuery().processInstanceId("seeDoctor.10001").uniqueResult().findActiveActivityNames().toString();  System.out.println("当前任务所在节点======" + activityName);  }  /** * 获取对应人员的任务 */  public void getTask(){  ProcessEngine processEngine = Configuration.getProcessEngine();  TaskService taskService = processEngine.getTaskService();  List<Task> tasks = taskService.findPersonalTasks("nurse");  Task task = tasks.get(0);  System.out.println("任务数量===" + tasks.size() );  System.out.println("任务名词===" + task.getActivityName());  System.out.println("任务人员===" + task.getAssignee() + "任务ID===" + task.getId());  }  //完成任务  public void completeTask(){  ProcessEngine processEngine = Configuration.getProcessEngine();  TaskService taskService = processEngine.getTaskService();  taskService.completeTask("20001");  }  }  

下面我们来一次讲解每个部分所完成的主要功能。

Deploy()部署流程的作用顾名思义,就是部署一个已经制定好的jpdl文件,它的作用类似一个具有版本号的类,流程实例就是这个流程的实例化。在jpdl文件中我们通常通过指定key值来区分所部署的各个流程,如果key相同则规定创建流程实例时按最高版本进行实例化。

createInstance()创建流程实例就是根据key值来确定实例化哪个流程,如果有多个流程的key相同则取最高版本。

getCurrentActivity()查询流程实例当前所在节点。该函数的作用在于根据流程实例ID,来获取该流程实例当前执行到了哪个节点,如本例中的流程实例有进行挂号和医师看病两个节点,该函数就是用来确定当前流程实例执行到了进行挂号还是医师看病环节。

getTask()函数中,之所以用Task task = tasks.get(0)语句来取得第一个任务是因为可能有多个完全不同的流程实例中都有一个为nurse的角色名字,假如恰好出现了这种情况则该函数会取出所有流程实例中角色名称为nurse的任务。

completeTask()完成任务,该函数的作用比较清晰就是根据任务ID,将该任务结束,然后进入到下一节点中,比如当前所在任务节点是进行挂号,该任务ID是10001,则完成该任务后,则会自动进入到医师看病这个节点,当完成医师看病这个任务后则会自动进入到end节点,也就是完成了整个流程。

3.      JBPM中每个服务所对应的数据库表。

在上面的代码中我们可以很明显的看出在每一部分中都对应着一个Service,也就是一个服务,而所有的服务都是由JBPM引擎来创建的。

在部署流程环节,它所对应的是RepositoryService服务,当部署完流程后,在jbpm4_deployment中会插入一条部署流程记录,同时在jbpm4_deployprop表中会记录该流程的详细信息。

在创建流程实例环节,所对应的的是ExecutionService服务,该服务可以根据流程的key值用来启动一个具体的流程实例。启动一个具体的流程实例后会在jbpm4_execution表中插入一条流程实例记录。

getCurrentActivity()获取当前流程实例环节对应的也是ExecutionService,它操作的表同样是jbpm4_execution,但是该服务对该表进行的查询操作而并非插入操作,根据流程实例ID来查询出该流程实例当前所在的节点。

getTask()获取对应人员的任务环节对应的是TaskService服务,该服务的作用是获取特定角色名的人员的所有任务,它所操作的表示jbpm4_task表,该表所存储的是各个实例的当前任务,所以根据角色名所查询出的很可能是不同实例的相同角色名对应的所有任务。

最后一个是completeTask()环节,该环节对应的同样是TaskService服务,它的作用也十分的单一,就是根据任务ID来结束任务,使得流程实例进入到下一个节点。

JBPM工作流引擎原理相关推荐

  1. java activiti jbpm_activiti和jbpm工作流引擎哪个比较好?

    原标题:activiti和jbpm工作流引擎哪个比较好? 在常用的ERP系统.OA系统的开发中,工作流引擎是一个必不可少的工具.之前在选择工作流引擎时曾经在activiti和jbpm之间有过比较,当时 ...

  2. 说说 jBPM 工作流引擎的设计原理

    1服务 API 设计 jBPM4 工作流引擎的核心 PVM 主要依靠 4 组服务 API : 流程定义服务 - Process Service. 流程执行服务- Execution Service. ...

  3. JBPM工作流引擎内核设计思想及构架

    1 前言 流程引擎内核仅是"满足Process基本运行"的最微小结构,而整个引擎则要复杂很多,包括"状态存储"."事件处理"."组 ...

  4. jBPM 工作流引擎可视化编辑器

    What is jBPM? JBPM,全称是Java Business Process Management(业务流程管理). https://www.jbpm.org/ jBPM is a tool ...

  5. 学习JBPM 工作流引擎 API方法(二)

    分享一套j简单的JBPM入门视频 https://pan.baidu.com/s/1sNv5n0Xk3lXn-YSLxum2EQ 提取码:idfq 我是在eclipse当中安装的JBPM 安装好JBP ...

  6. 宅急送 项目第八天 JBPM工作流框架

    项目第八天和项目第九天 学习 JBPM 理论部分 项目第十天 权限管理模块 项目第十一天 项目第十二天 JBPM 应用 1. 工作流框架概述 1.1. 什么是工作流 工作流(Workflow),就是& ...

  7. SaaS-IHRM 项目-Activiti7基础原理与使用 工作流引擎 工作流使用

    第1章 什么是工作流 1.1工作流介绍 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者 之间按照某种预定义的规则自动进行传递文档.信息或任 ...

  8. Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow

    首先,这个评论是我从网上,书中,搜索和整理出来的,也许有技术点上的错误点,也许理解没那么深入.但是我是秉着学习的态度加以评论,学习,希望对大家有用,进入正题! 四大主流工作流引擎:Shark,oswo ...

  9. 常见的工作流引擎(osworkflow、jbpm、activiti、flowable、camunda)比较

    参考文章:osworkflow.jbpm.activiti.flowable.camunda开源流程引擎哪个好?_大龄码农有梦想的博客-CSDN博客_流程引擎有哪些 工作流引擎选择(为何使用activ ...

  10. Activiti7工作流引擎-环境搭建及创建数据库

    第1章 什么是工作流 1.1工作流介绍 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者 之间按照某种预定义的规则自动进行传递文档.信息或任 ...

最新文章

  1. python提高办公效率-几个可以提高工作效率的Python内置小工具
  2. c# 读取大文件方法
  3. python数字图像处理、色彩空间类型转换_Python+OpenCV图像处理—— 色彩空间转换...
  4. iOS中几种定时器 - 控制了时间,就控制了一切
  5. 前端学习(669):流程控制
  6. mongodb python 存文件_Python保存MongoDB上的文件到本地的方法介绍
  7. flex Module之间的通信
  8. xgboost输出特征重要性排名和权重值
  9. vue.js多页面开发 webpack.config.js 配置方式
  10. Logistic(逻辑)回归分析
  11. 【原创】matlab 2010的下载和安装
  12. cmd命令把GHO转换成虚拟机可直接加载的硬盘格式实例
  13. android view translateanimation,Android:有没有办法在TranslateAnimation之后获得View的最新位置?...
  14. 如何控制局域网网速_无线路由器如何限制局域网网速 无线路由器限制局域网网速方法【介绍】...
  15. 优点家庭服务器修改wifi,家庭联网三种方式---不看后悔! - 【 网络基础 】 - 我是网管论坛 - 畅通网络 因......
  16. 基于JAVA学生成绩管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  17. animate发布html5教程,Adobe Animate CC 中的 HTML 发布模板 - Adobe Animate 用户指南
  18. 服务器柜机位置摆放电子图,柜式空调摆放位置有什么要注意的吗
  19. 央妈是怎么印钱的(1)--资产负债表
  20. aws部署web_运营酿酒厂解释了Amazon Web Services(AWS)

热门文章

  1. char 类型的取值范围
  2. windows的消息机制
  3. c语言程序运行时可以从键盘上读入,C语言程序设计题库之
  4. Android刷机Windows10,蓝魔i9s Win10+Android双系统的刷机教程及固件下载
  5. Flash网络游戏简单的源代码
  6. 全球名校AI课程库(23)| Harvard哈佛 · 基于Python/JavaScript的Web编程课程『Web Programming with Python and JavaScript』
  7. fpga烧写bin文件_FPGA烧写的方式和具体过程分析
  8. 基于PHP的学生选课管理系统
  9. 学生选课管理系统(python)
  10. 【Python玩转自动化运维】Python-基础1