控制流和数据流的区别_jdk动态代理底层原理

控制流和数据流的区别_jdk动态代理底层原理JBPM工作流原理

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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

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

2.      JBPM如何应用

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

首先来看我们的jpdl文件:

[html] 
view plain 
copy 
在CODE上查看代码片
派生到我的代码片

  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.      */  
  6.     public void deploy(){  
  7.         //创建流程引擎  
  8.         ProcessEngine processEngine = Configuration.getProcessEngine();  
  9.           
  10.         //创建服务  
  11.         RepositoryService repositoryService = processEngine.getRepositoryService();  
  12.           
  13.         //部署流程  
  14.         repositoryService.createDeployment().addResourceFromClasspath(“seeDoctor.jpdl.xml”).deploy();  
  15.           
  16.           
  17.     }  
  18.       
  19.     /** 
  20.      * 创建流程实例 
  21.      */  
  22.     public void createInstance(){  
  23.         //创建流程引擎  
  24.         ProcessEngine processEngine = Configuration.getProcessEngine();  
  25.           
  26.         ExecutionService executionService = processEngine.getExecutionService();  
  27.           
  28.         ProcessInstance processInstance = executionService.startProcessInstanceByKey(“seeDoctor”);  
  29.           
  30.         System.out.println(“流程实例ID===============” + processInstance.getId());  
  31.     }  
  32.       
  33.     //查询流程实例当前所在节点  
  34.         public void getCurrentActivity(){  
  35.             ProcessEngine processEngine = Configuration.getProcessEngine();  
  36.             ExecutionService executionService = processEngine.getExecutionService();  
  37.             String activityName = executionService.createProcessInstanceQuery().processInstanceId(“seeDoctor.10001”).uniqueResult().findActiveActivityNames().toString();  
  38.             System.out.println(“当前任务所在节点======” + activityName);  
  39.         }  
  40.       
  41.     /** 
  42.      * 获取对应人员的任务 
  43.      */  
  44.     public void getTask(){  
  45.         ProcessEngine processEngine = Configuration.getProcessEngine();  
  46.         TaskService taskService = processEngine.getTaskService();  
  47.         List<Task> tasks = taskService.findPersonalTasks(“nurse”);  
  48.         Task task = tasks.get(0);  
  49.         System.out.println(“任务数量===” + tasks.size() );  
  50.         System.out.println(“任务名词===” + task.getActivityName());  
  51.         System.out.println(“任务人员===” + task.getAssignee() + “任务ID===” + task.getId());  
  52.     }  
  53.       
  54.       
  55.       
  56.     //完成任务  
  57.     public void completeTask(){  
  58.         ProcessEngine processEngine = Configuration.getProcessEngine();  
  59.         TaskService taskService = processEngine.getTaskService();  
  60.         taskService.completeTask(“20001”);  
  61.     }  
  62. }  


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

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来结束任务,使得流程实例进入到下一个节点。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196220.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月1日 上午10:43
下一篇 2025年10月1日 上午11:15


相关推荐

  • JavaScript之深入理解立即调用函数表达式(IIFE),你对它的理解,决定了它的出镜率(系列六)

    JavaScript之深入理解立即调用函数表达式(IIFE),你对它的理解,决定了它的出镜率(系列六)本篇文章 主要讲解的立即执行函数或自执行匿名函数的含义 用法 以及使用它的主要场景 系列的前面几篇文章主要讲解了作用域 原型 执行上下文 本篇文章一样起到了承上启下的作用

    2026年3月20日
    2
  • pycharm提示no python interpreter_pycharm代码运行不了

    pycharm提示no python interpreter_pycharm代码运行不了Pycharm配置:解决方法如下方法一:Pycharm配置环境变量,ProjectInspector确认有Python3.7齿轮栏点Add,选ExistingEnvironment就好然后在Inspector选项找安装目录的Python.exe选择好了之后点击OK,之后选择Makeavaliableforallappliction再点OK就行了New新建一个pythonfile,然后就可以开始写代码了写完之后右键代码选择下面绿色的播放键Run就可以测试.

    2022年8月25日
    10
  • 莫比乌斯反演的两种形式及其证明

    莫比乌斯反演的两种形式及其证明莫比乌斯反演形式一 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 证明 把代入右边的式子 得 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 根据莫比乌斯函数的性质 有定理 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 因此 只有

    2025年6月28日
    5
  • php一键安装包winnt,(推荐)Windows一键安装包安装

    php一键安装包winnt,(推荐)Windows一键安装包安装为了简化大家在 windows 下面的安装 我们在 xampp 基础上做了禅道企业版的 windows 一键安装包 xampp 是业内非常著名的 AMP 集成运行环境 禅道企业版的一键安装包主要在它基础上做了大量的精简 并集成了我们自主开发的控制面板 使用起来会更加方便 关于 xampp 一键安装包 大家有兴趣可以访问下面的官方网站 https www apachefriend org 注 这个是 xampp 官

    2026年3月18日
    3
  • excel查找结果导出_excel数据怎么导出

    excel查找结果导出_excel数据怎么导出使用PhpSpreadsheet导入&amp;amp;导出Excel,通用方法。适用各种Excel操作场景!

    2025年12月14日
    4
  • java.lang.NullPointerException – 如何处理空指针异常

    java.lang.NullPointerException – 如何处理空指针异常当应用程序试图 null 在需要对象的情况下使用时抛出 这些包括 调用 null 对象的实例方法 访问或修改 null 对象的字段 把长度 null 当作一个数组 像访问或修改 null 阵列一样访问或修改插槽 投掷 null 就好像它是一个 Throwable 价值 应用程序应该抛出此类的实例来指示 null 对象的其他非法使用 NullPointerE 对象可以由虚拟机构造 就像抑制被禁

    2026年3月19日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号