概念:

流程图的组成:

a. 活动 Activity / 节点 Node

b. 流转 Transition / 连线(单向箭头)

c. 事件

1.流转(Transition)

  a) 一般情况一个活动中可以指定一个或多个Transition

    i. 开始活动(Start)中只能有一个Transition。

    ii. 结束活动(End)中没有Transition。

    iii. 其他活动中有一条或多条Transition

  b) 如果Transition只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。

2.活动(Activity)

  a) 流转控制活动(预定义活动)

  

   

i. start开始活动

          代表流程的开始边界,一个流程有且只能有一个Start活动。开始活动只能指定一个Transition。在流程实例启动后,会 自动的使用这个唯一的Transition离开开始活动,到一下个活动。

    ii. end/end-error/end-cancel(结束活动)

      代表流程的结束边界,可以有多个,也可以没有。如果有多个,则到达任一个结束活动,整个流程就都结束了;如果没 有,则到达最后那个没有Transition的活动,流程就结束了。

iii. state状态活动

      作用:等待。可以使用signal使其结束等待,并向后执行一步。

  

    iv. task任务活动

-->个人任务的分配

  

    1. 使用流程变量:assignee="#{manager}"

    2. AssignmentHandler:assignable.setAssignee(userId); // 指定当前任务的办理人(分配任务)

      a) 需要在.jbdl.xml的<task>元素中写

      

<assignment-handler class="cn.grace.AssignmentHandlerImpl"/>

      b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口

      c) 在AssignmentHandlerImpl类中可以使用assignable.setAssignee(userId),分配个人任务。

    3. TaskService.assignTask(taskId, userId)// 把指定的任务分配给指定的人

      

processEngine.getTaskService().assignTask(taskId, userId);

  -->组任务的分配

    1.  使用流程变量:assignee="#{userIdsString}" // 要是String型的变量,多个候选人之前用','隔开

    2. AssignmentHandler:assignable.addCandidateUser(userId);// 添加组任务的候选人

      a) 需要在.jbdl.xml的<task>元素中写

      

<assignment-handler class="cn.grace.GroupTaskAssignmentHandlerImpl"/>

     b) 指定的AssignmentHandlerImpl类要实现AssignmentHandler接口

     c) 在AssignmentHandlerImpl类中可以使用assignable.addCandidateUser(userId),添加组任务候选人。

     3. TaskService.addTaskParticipatingUser(taskId,userId,Participation.CANDIDATE);//添加组任务的候选人

  v. Decision判断活动

    1. 使用expression,如:expr="#{'to state2'}"

    2. 使用Handler,在Handler Class里配置指定的DecisionHandlerImpl类的路径

    DecisionHandlerImpl.java

public class DecisionHandlerImpl implements DecisionHandler {// 计算离开当前节点用的Transition的名称并返回@Overridepublic String decide(OpenExecution execution) {System.out.println("DecisionHandlerImpl.decide()");// 获取业务数据Integer days = (Integer) execution.getVariable("请假天数");// 选择Transitionif (days > 7) {return "to 总经理审批";} else {return "to end1";}}
}

  ProcessTest.java

@Test
public void test() {// 1,部署流程定义InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); // 当前类所在包中的文件processEngine.getRepositoryService()//.createDeployment()//.addResourceFromInputStream("test.jpdl.xml", in)//.deploy();// 2,启动流程实例Map<String, Object> variables = new HashMap<String, Object>();// variables.put("请假天数", 10);启动流程实例后,进行到to 总经理审批环节。variables.put("请假天数", 3);//启动流程实例后,进行到to end1环节。ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test", variables);
}

  此时,如果variables.put("请假天数", 3);启动流程实例后,进行到to end1环节。

  此时,如果variables.put("请假天数", 10);启动流程实例后,进行到to 总经理审批环节。

3. 如果同时配置了expression与Handler,则expression有效,忽略Handler。

  vi. fork、join分支/聚合活动

  

public class ProcessTest {private ProcessEngine processEngine = Configuration.getProcessEngine();@Testpublic void test() {// 1,部署流程定义InputStream in = this.getClass().getResourceAsStream("test.jpdl.xml"); // 当前类所在包中的文件processEngine.getRepositoryService()//.createDeployment()//.addResourceFromInputStream("test.jpdl.xml", in)//.deploy();// 2,启动流程实例ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey("test");System.out.println("processInstanceId = " + pi.getId());System.out.println("当前正在执行的活动:" + pi.findActiveActivityNames());}
}

  输出结果为:

    processInstanceId = test.330007

    当前正在执行的活动:[汇款, 发货]

    可以看出,汇款和发货同时执行中。并且,只有当2条路线都到join活动,流程才会继续往后执行。

  b) 自定义活动(custom)

    i. 在<custom>元素中指定class属性为指定的类ExternalActivityBehaviourImpl

    ii. 这个类要实现ExternalActivityBehaviour接口,其中有两个方法:

      1. execute(ActivityExecution):节点的功能代码

2. signal(ActivityExecution, String, Map):在当前节点等待时,外部发信号时的行为

3. 在execute()方法中,可以调用以下方法对流程进行控制

  a) ActivityExecution.waitForSignal():在当前节点等待。

  b) ActivityExecution.takeDefaultTransition():使用默认的Transition离开,当前节点中定义的第一个为默认的。

  c) ActivityExecution.take(String transitionName):使用指定的Transition离开

  d) ActivityExecution.end():结束流程实例

4. 也可以实现ActivityBehaviour接口,只有一个方法execute(ActivityExecution),这样就不能等待,否则signal时会有类转换异常。

public class ExternalActivityBehaviourImpl implements ExternalActivityBehaviour {// 到达这个活动时执行的方法@Overridepublic void execute(ActivityExecution execution) throws Exception {System.out.println("已发送信息.");//此处写自己要执行的事件// 默认是执行完代码后离开当前活动,不会执行signal方法,也可以写如下代码// execution.takeDefaultTransition(); // 离开当前活动// // 使用指定名称的Transition离开当前活动// execution.take(transitionName);// 执行完后不要离开,而是要等待外部调用signal()方法时才离开execution.waitForSignal();}// 调用signal()方法离开当前节点前执行的方法(如果在execute()中直接离开当前节点了,这个方法就不会被执行)@Overridepublic void signal(ActivityExecution execution, String signalName, Map<String, ?> parameters) throws Exception {System.out.println("ExternalActivityBehaviourImpl.signal()");}
}

  

3.事件

a) 在根元素中,或在节点元素中,使用<on event="">元素指定事件,其中event属性代表事件的类型。

b) 在<on>中用子元素<event-listener class="EventListenerImpl" />,指定处理的类,要求指定的类要实现EventListener接口

c) 事件类型:

i. <on>元素放在根元素(<process>)中,可以指定event为start或end,表示流程的开始与结束。

ii. <on>元素放在节点元素中,可以指定event为start或end,表示节点的进入与离开

iii. 在Start节点中只有end事件,在End节点中只有start事件。

iv. 在<transition>元素中直接写<event-listener class="">,就是配置事件。(因为在这里只有一个事件,所以不用写on与类型)

v. 在<task>元素中还可以配置assign事件,是在分配任务时触发的。

<?xml version="1.0" encoding="UTF-8"?><process name="test" xmlns="http://jbpm.org/4.4/jpdl"><!-- 流程实例的启动事件 --><on event="start"><event-listener class="cn.grace.EventListenerImpl"></event-listener></on><!-- 流程实例的结束事件 --><on event="end"><event-listener class="cn.grace.EventListenerImpl"></event-listener></on><start name="start1" g="86,69,7,1"><!-- 开始活动中只有离开活动的事件 --><on event="end"><event-listener class="cn.grace.EventListenerImpl"></event-listener></on><transition name="to task1" to="task1" g="-53,-17" /></start><task name="task1" g="61,171,92,52" assignee="张三"><!-- 进入活动的事件 --><on event="start"><event-listener class="cn.grace.EventListenerImpl"></event-listener></on><!--离开活动的事件 --><on event="end"><event-listener class="cn.grace.EventListenerImpl"></event-listener></on><transition name="to end1" to="end1" g="-47,-17" /></task><end name="end1" g="86,272,48,48"><!-- 结束活动中只有进入活动的事件 --><on event="start"><event-listener class="cn.grace.EventListenerImpl"></event-listener></on></end>
</process>

  根据上述.jpdl.xml和对应的.png图,启动流程实例会执行3次EventListenerImpl事件,结束流程实例也会执行3次EventListenerImpl事件。

转载于:https://www.cnblogs.com/a757956132/p/4449609.html

JBPM学习(六):详解流程图相关推荐

  1. C语言学习——运算符详解

    C语言学习--运算符详解 一.学习运算符 (1)运算对象的数目 C语言中,运算符的运算对象可以是一个,称单目运算符:运算对象也可以是两个,称双目运算符:运算对象还可以是三个,称三目运算符. (2)运算 ...

  2. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG) 优化算法

    深度学习优化函数详解系列目录 深度学习优化函数详解(0)– 线性回归问题 深度学习优化函数详解(1)– Gradient Descent 梯度下降法 深度学习优化函数详解(2)– SGD 随机梯度下降 ...

  3. 【深度学习】详解Resampling和softmax模型集成

    [深度学习]详解Resampling和softmax模型集成 文章目录 1 图像重采样1.1 次级采样(sub-sampling)1.2 高斯金字塔(Gaussian pyramids)1.3 上采样 ...

  4. Java JUC学习 - ConcurrentLinkedDeque 详解

    Java JUC学习 - ConcurrentLinkedDeque 详解 0x00 前言 如何实现并发程序,对于Java以及其他高级语言来说都是一件并不容易的事情.在大一上学期的时候,我们学习了链表 ...

  5. php add action,WordPress学习——add_action()详解

    add_action() 是 WordPress 核心代码执行期间或特定事件发生时启动的钩子函数. 插件可以指定使用 Action API 在这些特定点上执行其一个或多个PHP函数.简单来说就是通过 ...

  6. 深度学习优化函数详解(5)-- Nesterov accelerated gradient (NAG)

    深度学习优化函数详解系列目录 本系列课程代码,欢迎star: https://github.com/tsycnh/mlbasic 深度学习优化函数详解(0)-- 线性回归问题 深度学习优化函数详解(1 ...

  7. 视频教程-深度学习原理详解及Python代码实现-深度学习

    深度学习原理详解及Python代码实现 大学教授,美国归国博士.博士生导师:人工智能公司专家顾问:长期从事人工智能.物联网.大数据研究:已发表学术论文100多篇,授权发明专利10多项 白勇 ¥88.0 ...

  8. JavaSE学习笔记 详解Set集合中实现类:LinkedHashSet以及TreeSet

    详解Set集合中实现类:LinkedHashSet以及TreeSet 1.LinkedHashSet概述 2.TreeSet概述 2.1 自然排序 2.1.1 TreeSet存储常见引用数据类型 2. ...

  9. web前端开发入门学习线路图详解-2019升级版

    现如今,Web前端工程师已经成为各大互联网公司不可或缺的热门职位,从业者队伍日渐庞大,这其中不乏零基础学习者和转行人士.为了方便大家系统而全面的掌握前端基础知识,千锋小编特意整理了web前端开发入门学 ...

  10. EFLS开源 | 阿里妈妈联邦学习解决方案详解

    ▐ 项目背景 移动互联网时代出于隐私保护和数据安全,APP 之间的开放与互联越来越少,使大量的信息孤岛逐渐形成,限制了信息技术更好地服务广大用户的能力.2016年 Google 提出了以保护终端隐私为 ...

最新文章

  1. linux 查看硬件信息
  2. python语言使用什么语句实现上下文管理协议_Python with语句上下文管理器两种实现方法分析...
  3. 做diff_Virtual Dom amp;amp; Diff原理,极简版
  4. C语言学习之求∑n!(即求1!+2!+3!+...+20!)
  5. Leetcode--75. 颜色分类
  6. oracle账号密码修改后特别容易锁定_Oracle数据库用户锁定原因以及处理方式(ORA-28000)...
  7. windows date格式
  8. cie规定的标准光源_孩视宝:健康自然的光源是护眼灯发展的重点
  9. hadoop(2.5) 分布式部署
  10. android flag,Android 屏幕锁 - FLAG_KEEP_SCREEN_ON
  11. UTF-8 字符处理在 Web 开发中的应用
  12. python爬虫网络中断_python爬虫中断
  13. java二路归并排序算法_java二路归并排序示例分享
  14. 三宝小精灵机器人_“三宝”机器人
  15. 利用矩阵特征值求解多项式的根
  16. 基于JavaWeb的网上订餐网站设计与实现 毕业论文+任务书+外文翻译及原文+答辩PPT+项目源码及数据库文件
  17. 客服客户聊天系统源码分享
  18. c++ stl栈容器stack用法介绍
  19. Visual Studio 2012 代码块注释快捷键和格式化快捷键
  20. 为何两个完全一样的字符串相比较却不一样

热门文章

  1. 图像处理之边缘检测概述
  2. 程序安装后依然是老版主页的修改办法
  3. 杀软厂商开源--从此走向平台化?
  4. fd_set struct
  5. C# 【无法修改XX返回值,因为它不是变量】
  6. LeetCode.11-装水最多的容器(Container With Most Water)
  7. Python为何能成为数据分析的主流工具?
  8. Git中的有个致命的远程执行漏洞
  9. if else和switch的效率
  10. 如何在C/S下打印报表