jBPM 定时器(Timer)实现了以下功能:

  • timer 定义在 transition 元素中,当流程处于 state、task、sub-process 类型活动的等待状态时,会开始计算 timer 的时间,当时间耗尽时,就会触发转移。
  • timer 也可以定义在用户代码活动中,负责事件监听的 on 元素支持 timeout 事件。当事件监听器 on 在监听 timeout 事件时,timer 元素必须是 on 元素的第一个子元素。当流程的执行(Execution)进入这个等待活动时,就会激活定时器。如果此活动的持续等待时间超过定时器指定的时间时(超时),就会触发事件;如果流程的执行在定时器指定的时间之内离开此活动,那么就会取消这个定时器。

timer 元素的属性:

属性 类型 默认值 是否必需 描述
duedate 持续时间表达式 必需 指定多长时间以后触发事件。如:15 分钟、2 天等
repeat 持续时间表达式 可选 第一个触发事件后,每隔多长时间再触发事件,这是一个持续的过程。

1 持续时间表达式

持续时间表达式语法如下:

quantity [business]{second | seconds | minute | minutes | hour | hours | day | days | week | weeks | month | months | year | years
}
关键字 是否可选 说明
quantity 正整数,描述时间的值。
business 如果存在,则表示按照工作日历来计算时间;如果没有,则按照正常的公历来计算时间。工作日历会按照预先配置的规则,计算时会去除节假日与休息的时间,只考虑工作时间。

配好以上关键字之后,加上需要的时间单位即可。

2 工作日历

系统默认的工作日历配置文件是 jbpm.businesscalendar.cfg.xml,它存在 jbpm4.jar 的根目录下,内容为:

<?xml version="1.0" encoding="UTF-8"?><jbpm-configuration><process-engine-context><business-calendar><monday    hours="9:00-12:00 and 12:30-17:00"/><tuesday   hours="9:00-12:00 and 12:30-17:00"/><wednesday hours="9:00-12:00 and 12:30-17:00"/><thursday  hours="9:00-12:00 and 12:30-17:00"/><friday    hours="9:00-12:00 and 12:30-17:00"/><holiday period="01/07/2008 - 31/08/2008"/></business-calendar></process-engine-context></jbpm-configuration>

上面配置的工作时间为:周一到周五 9:00-12:00 与 12:30-17:00。01/07/2008 - 31/08/2008 为节假日时间。

工作日历的默认实现类是 BusinessCalendarImpl。

也可以通过实现 org.jbpm.pvm.internal.cal.BusinessCalendar 类来自定义的工作日历,需要实现以下两个方法:

方法 说明
Date add(Date date, String duration) 计算从一个时间点,经过 duration 后,到达的时间点。
Date subtract(Date date, String duration) 计算从一个时间点,减去 duration 后,到达的时间点。这个方法不支持 business 模式。

字符串 duration 通过 new Duration(duration) 来构造出 Duration 对象,它就是持续时间表达式的对象。

在 jbpm.cfg.xml 中配置自定义的工作日历:

<process-engine-context><object class="xxx.xxx.CustomBusinessCalendar"/>
</process-engine-context>

3 定时转移

流程定义:

jPDL:

<?xml version="1.0" encoding="UTF-8"?><process name="TimerTransition" xmlns="http://jbpm.org/4.4/jpdl"><start name="start1" g="124,206,48,48"><transition to="处理(业务员)"/></start><state name="处理(业务员)" g="222,203,111,52"><transition name="超时" to="处理(业务经理)" g="-34,-4"><timer duedate="15 minutes"/></transition><transition name="继续" to="回复" g="-2,-22"/></state><state name="处理(业务经理)" g="214,305,124,52"/><state name="回复" g="422,205,92,52"/>
</process>

这里假设如果业务员在 15 分钟之内没有进行处理,那么将会发生超时转移,流程将流向 【处理(业务经理)】的活动节点。

单元测试:

//发起流程实例
Execution processInstance = executionService.startProcessInstanceByKey("TimerTransition");//在 job 中会生成一条【定时器】信息
Job job = managementService.createJobQuery().timers().processInstanceId(processInstance.getId()).uniqueResult();//触发定时器(模拟)
managementService.executeJob(job.getId());//断言流程进入【处理(业务经理)】活动
processInstance = executionService.findExecutionById(processInstance.getId());assertEquals("处理(业务经理)", ((ExecutionImpl) processInstance).getActivityName());

4 定时事件

jPDL:

<?xml version="1.0" encoding="UTF-8"?><process name="TimerEvent" xmlns="http://jbpm.org/4.4/jpdl"><start name="start1" g="138,204,48,48"><transition to="等待"/></start><state name="等待" g="228,200,92,52"><on event="timeout"><timer duedate="15 minutes"/><event-listener class="net.deniro.jbpm.OvertimeEvent"/></on><transition to="下一步操作"/></state><state name="下一步操作" g="366,202,92,52"/>
</process>

timer 元素是 timeout 事件的必需元素,这里表示如果在【等待】活动上停留了 15 分钟,那么就会触发 timeout 事件。

自定义 timeout 事件:

public class OvertimeEvent implements EventListener {@Overridepublic void notify(EventListenerExecution execution) throws Exception {//设置流程变量,来表示触发了该事件execution.setVariable("OvertimeEvent",Boolean.TRUE);}
}

单元测试:

//发起流程实例
Execution processInstance = executionService.startProcessInstanceByKey("TimerEvent");//在 job 中会生成一条【定时器】信息
Job job = managementService.createJobQuery().timers().processInstanceId(processInstance.getId()).uniqueResult();//触发定时器(模拟)
managementService.executeJob(job.getId());//断言流程进入【等待】活动(因为我们在事件监听器中并没有发出执行信号)
processInstance = executionService.findExecutionById(processInstance.getId());
Set<String> expectedActivityNames = new HashSet<>();
expectedActivityNames.add("等待");
assertEquals(expectedActivityNames, processInstance.findActiveActivityNames());//断言事件被触发
assertEquals(Boolean.TRUE, executionService.getVariable(processInstance.getId(), "OvertimeEvent"));assertEquals("等待", ((ExecutionImpl) processInstance).getActivityName());

如果【等待】活动在 15 分钟之内被完成,那么就会取消自定义的 timeout 事件,相关的 Job 记录也会被删除。

5 工作日历上的定时转移

这个定时转移与我们第 3 节所说的定时转移类似,只不过在配置持续时间表达式时,加入了 business 关键字:

<process name="TimerTransition" xmlns="http://jbpm.org/4.4/jpdl">...<state name="处理(业务员)" g="222,203,111,52"><transition name="超时" to="处理(业务经理)" g="-34,-4"><timer duedate="15 business hours"/></transition>...</state>
...
</process>

这里表示如果当前活动停留了超过 15 个 “工作” 小时,那么就会发生超时转移。工作日历中可以配置每天的工作时间段。

6 定时重复

利用 timer 的 repeat 属性,可以不断地触发事件。

<process name="TimerRepeatEvent" xmlns="http://jbpm.org/4.4/jpdl">...<state name="等待" g="228,200,92,52"><on event="timeout"><timer duedate="15 minutes" repeat="15 seconds"/><event-listener class="net.deniro.jbpm.OvertimeEvent"/></on><transition to="下一步操作"/></state>...
</process>

这里的定义表示:事件被触发后,每隔 15 s,会重复触发事件,直到发生转移。

说说 jBPM 工作流的定时器相关推荐

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

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

  2. JBPM工作流入门总结

    关于JBPM工作流 1.工作流 工作流是一项分离业务操作和系统流程的技术.工作流由实体(Entity).参与者(Participant).流程定义(Flow Definition).工作流引擎(Eng ...

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

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

  4. 宅急送项目的第七天笔记!(JBPM工作流)

    宅急送项目的第七天  三个主要功能模块: 基础设置. 取派业务.中转配送业务 基础设置: 标准管理.取派员管理.区域设置.分区设置.定区管理 取派业务: 业务受理.工作单快速录入(追单.销单). 工作 ...

  5. 宅急送项目的第七天笔记!(JBPM工作流和介绍 -- 权限管理模型)

    一.回顾第一天核心内容  1. JBPM是什么? 为我的项目带来什么?  工作流, 就是将业务流程实现自动化,非人工方式,控制任务的执行 -------- 所有业务流程 执行信息 都可以存放到数据库 ...

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

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

  7. jbpm工作流(jBPM工作流组件设计分析)

    jbpm工作流会签 同意上面的说法,不过会签问题不只是jbpm才有的,很多工作流的软件都会遇到这个问题.会签可以说是工作流中的一个非常特殊的操作.实际流转举例说说吧: A办文,同时提交给B.C两个人办 ...

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

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

  9. JBPM工作流(二)——数据库表说明

    以下为JBMP的数据库说明(18张): 1 流程配置类数据库表: 1.1 JBPM_PROCESSDEFINITION:流程模版表 字段名 字段含义 主键 外键 ID_ 流程模版标识 √ × NAME ...

最新文章

  1. 美团智能问答技术探索与实践
  2. Windows平台Android开发环境搭建几个注意点
  3. Servlet中判断浏览器版本的代码
  4. java sendredirect报错_java 中sendredirect()和forward()方法的区别
  5. Avast I Love You
  6. SharePoint Designer - View
  7. php公众号多域名授权,多个网站用一个微信公众号授权域名的坑
  8. 英语语法之形容词与副词
  9. 【计算机网络 (谢希仁) 习题题解】第5章 运输层 (5)——TCP的运输连接管理
  10. 高乐计算机课程,长春理工大学
  11. 无需编写代码,Windows设置开机无需手动登录,自动拨号上网
  12. Unity Fingers Gesture手势插件教程(新)
  13. 青蛙跳台阶 php,php中青蛙跳台阶的问题解决方法
  14. mysql之my.cnf
  15. Oracle安装后检查内容,ORA-12541:TNS:no listener错误解决方法
  16. JMeter性能测试之使用CSV文件参数化
  17. Android 简单的折叠布局,上滑监听透明度
  18. Windows认证机制详解(借物表在文章末尾)
  19. 三元简化模型,助你加速团队成长
  20. 谷歌大数据的三驾马车

热门文章

  1. Java实现吃货联盟订餐系统
  2. 网易服务器维护,网易15日未停服维护,所有服务器正常运行中
  3. netapp3210存储更换故障硬盘过程
  4. 恭喜!胡哥官宣当爸,透露老婆非公众人物
  5. 汇川plc可以用C语言吗,汇川小型PLC梯形图编程系列教程(七):数值存储与二进制数据知识详解...
  6. 十分钟搞懂Lombok使用与原理
  7. 【云原生】k8s(Kubernetes)中yaml文件快速阅读理解
  8. 网易易盾滑块逆向分析 js 滑动轨迹生成_1
  9. Java JDK 1.8 新特性 Stream流
  10. 2016广东工业大学第一次月赛补题