浅析JBPM工作流引擎

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

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

2.      JBPM如何应用

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

首先来看我们的jpdl文件:

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <process key="test" name="test" xmlns="http://jbpm.org/4.4/jpdl">
  3. <start g="275,16,48,48" name="start1">
  4. <transition g="-60,-15" name="挂号" to="进行挂号"/>
  5. </start>
  6. <task assignee="nurse" g="255,101,92,52" name="进行挂号">
  7. <transition g="-69,-20" name="提交到医师" to="医师看病"/>
  8. </task>
  9. <task assignee="doctor" g="259,186,92,52" name="医师看病">
  10. <transition g="-50,-20" name="抓药" to="end1"/>
  11. </task>
  12. <end g="283,283,48,48" name="end1"/>
  13. </process>

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

[java] view plain copy
  1. public class seeDoctor extends TestCase {
  2. /**
  3. * 部署流程
  4. */
  5. public void deploy(){
  6. //创建流程引擎
  7. ProcessEngine processEngine = Configuration.getProcessEngine();
  8. //创建服务
  9. RepositoryService repositoryService = processEngine.getRepositoryService();
  10. //部署流程
  11. repositoryService.createDeployment().addResourceFromClasspath("seeDoctor.jpdl.xml").deploy();
  12. }
  13. /**
  14. * 创建流程实例
  15. */
  16. public void createInstance(){
  17. //创建流程引擎
  18. ProcessEngine processEngine = Configuration.getProcessEngine();
  19. ExecutionService executionService = processEngine.getExecutionService();
  20. ProcessInstance processInstance = executionService.startProcessInstanceByKey("seeDoctor");
  21. System.out.println("流程实例ID===============" + processInstance.getId());
  22. }
  23. //查询流程实例当前所在节点
  24. public void getCurrentActivity(){
  25. ProcessEngine processEngine = Configuration.getProcessEngine();
  26. ExecutionService executionService = processEngine.getExecutionService();
  27. String activityName = executionService.createProcessInstanceQuery().processInstanceId("seeDoctor.10001").uniqueResult().findActiveActivityNames().toString();
  28. System.out.println("当前任务所在节点======" + activityName);
  29. }
  30. /**
  31. * 获取对应人员的任务
  32. */
  33. public void getTask(){
  34. ProcessEngine processEngine = Configuration.getProcessEngine();
  35. TaskService taskService = processEngine.getTaskService();
  36. List<Task> tasks = taskService.findPersonalTasks("nurse");
  37. Task task = tasks.get(0);
  38. System.out.println("任务数量===" + tasks.size() );
  39. System.out.println("任务名词===" + task.getActivityName());
  40. System.out.println("任务人员===" + task.getAssignee() + "任务ID===" + task.getId());
  41. }
  42. //完成任务
  43. public void completeTask(){
  44. ProcessEngine processEngine = Configuration.getProcessEngine();
  45. TaskService taskService = processEngine.getTaskService();
  46. taskService.completeTask("20001");
  47. }
  48. }

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

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

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

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

  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. Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow

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

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

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

  9. 几种开源工作流引擎的简单比较(转)

    摘要:目前开源工作流引擎用的最多的是jbpm , 各种特性都不错, 文档也比较多, 下面只简单列举一下 目前开源工作流引擎用的最多的是jbpm , 各种特性都不错, 文档也比较多, 下面只简单列举一下 ...

  10. 工作流引擎--swamp

    什么是工作流引擎(Workflow Engine ) 例如开发一个系统最关键的部分不是系统的界面,也不是和数据库之间的信息交换,而是如何根据业务逻辑开发出符合实际需要的程序逻辑并确保其稳定性.易维护性 ...

最新文章

  1. 程序进入后台继续执行
  2. support library目录解释说明内容
  3. ubuntu下使用filezilla上传文件权限问题(open for write: permission denied)
  4. JavaScript的标签
  5. elk中kibana中如何显示写入elasticsearch的数据
  6. Python矩阵的创建(不使用numpy)
  7. python图论库_Python 图论工具
  8. SQL 中操作XML类型数据
  9. lamp mysql安全_LAMP第三部分php,mysql配置
  10. Spring Bean初始化的几种常规方式
  11. count(*) 的实现方式
  12. MATLAB数字水印处理技术的实现
  13. 对图像 香农费诺编码 matlab 实现,香农编码费诺编码.doc
  14. qq linux 2014,linux下安装 QQ2014
  15. 2022年熔化焊接与热切割考试模拟100题及在线模拟考试
  16. Pytorch并行处理机制
  17. VS2013,MFC,在视图类里添加鼠标左键响应函数OnLButtonDown
  18. 乐高计算机游戏泡泡龙的目标,乐高游戏教案
  19. halcon机器视觉软件系统框架源码visi onpro
  20. uniapp GPS定位功能的实现

热门文章

  1. MySql表空间的概念
  2. 密码库LibTomcrypt的内容介绍及分析
  3. 电商网站项目总结(面向对象编程篇)
  4. 简单的小说阅读网站JavaWeb项目
  5. 信息学奥赛GoC编程测试题题库
  6. EFR32FG1开发教程1--点亮LED
  7. zsh fg: no job control in this shell.
  8. usb通讯——读《圈圈教你玩usb》
  9. 《离散数学及其应用》章节总结与github地址
  10. 给input设置css样式,input能改变css样式吗