JBPM-工作流
来源:互联网 发布:陈路 微屏软件 编辑:程序博客网 时间:2024/05/17 01:12
1. JBPM基础
JBPM,全称是Java Business Process Management(业务流程管理),工作流(Workflow)即业务过程的部分或整体在计算机应用环境下的自动化。基于Java的业务流程管理系统,使用Hibernate来管理它的数据库,通过Hibernate,jBPM将数据的管理职能分离出去,自己专注于商务逻辑的处理。
2. JBPM4.4开发环境
2.1 相关资源
- jbpm-4.4.zip下载地址:http://pan.baidu.com/s/1dEbrayH
- Eclipse(eclipse-jee-luna-SR2-win32-x86_64) 下载地址:http://pan.baidu.com/s/1i4yP3DV
(这里我把 Eclipse设置成UTF-8编码了)
2.2 安装插件
在jbpm解压目录找到JBPM_HOME\install\src\gpd\jbpm-gpd-site.zip
然后在Eclipse安装,安装时记得断开网络连接如图:
添加jPDL4.4 Schema校验 :
在jbpm解压目录找到JBPM_HOME/src/jpdl-4.4.xsd
3 配置运行环境
新建Web工程添加相应的Jar包依赖库,和配置文件jar包从JBPM_HOME/lib/文件夹下拷贝
配置文件从JBPM_HOME/examples/src下拷贝
jbpm.cfg.xml、
logging.properties、
jbpm.hibernate.cfg.xml。
如图:
4 流程核心概念
4.1 流程定义 ProcessDefinition
4.1.1 process(流程)
是.jpdl.xml的根元素,指定的属性有:
name:流程定义的名称
key:流程定义的key,如未指定,则默认为name的值
version:版本,如果指定,则不能与已有的流程定义的版本重复;如未指定,则此key的流程定义的第1个为版本1,以后的是版本递增(每次加1)
4.1.2 transition(连线、转移)
一个活动中可以指定一个或多个Transition(Start中只能有一个,End中没有)。
• 开始活动中只能有一个Transition。
• 结束活动中没有Transition。
• 其他活动中有1条或多条Transition
如果只有一个,则可以不指定名称(名称是null);如果有多个,则要分别指定唯一的名称。
4.1.3 流程活动的控制
• start(开始活动)
代表流程的开始边界,一个流程有且只能有一个Start活动。开始活动只能指定一个Transition。在流程实例启动后,会自动的使用这个唯一的Transition离开开始活动,到一下个活动
• end、end-error、end-cancel(结束活动)
代表流程的结束边界,可以有多个,也可以没有。如果有多个,则到达任一个结束活动,整个流程就都结束了;如果没有,则到达最后那个没有Transition的活动,流程就结束了
• task(任务活动)
任务节点,相关属性assignee任务受理人,name任务名称
• decision(判断活动)
使用表达式判断流程的走向,如:expr=”#{‘to state2’}”,此外还可以使用Handler,要实现DecisionHandler接口
• fork、join(分支/聚合活动)
这是多个分支并行(同时)执行的,并且所有的分支Execution都到Join活动后才离向后执行。
4.1.4 事件
… … 待补充 … …
注:关于 Eclipse画流程图中文乱码的问题,修改Eclipse初始化文件添加-Dfile.encoding=UTF-8
即可
设计一个简单的请假流程,首先流程中有学生、班主任、教务处、教务处领导四种角色,学生请假先经由班主任的批准,然后提交到教务处,最终由领导决定;班主任请请假直接提交到教务处,由领导批准。
如图:
<?xml version="1.0" encoding="UTF-8"?><process name="leave" xmlns="http://jbpm.org/4.4/jpdl"> <start g="274,5,48,48" name="start1"> <transition g="-60,-10" name="申请请假" to="请假"/> </start> <task assignee="JBPM_Leave_Form" g="244,79,107,52" name="请假"> <transition g="-59,-12" name="提交申请" to="exclusive1"/> </task> <decision g="274,155,48,48" name="exclusive1" expr="#{isTeacher == 1 ? '提交班主任' : '提交教务处'}"> <transition g="-53,-19" name="提交班主任" to="班主任"/> <transition g="2,-19" name="提交教务处" to="教务处"/> </decision> <task assignee="JBPM_Teacher" g="174,225,92,52" name="班主任"> <transition g="-31,-19" name="班主任同意" to="教务处"/> <transition g="221,368:-48,-38" name="班主任驳回" to="end1"/> </task> <task assignee="JBPM_OfficeOfAffair" g="352,225,92,52" name="教务处"> <transition g="9,-12" name="提交教务处领导" to="教务处领导"/> <transition g="297,339:-8,-33" name="教务处驳回" to="end1"/> </task> <task assignee="JBPM_OfficeOfAffairLeader" g="345,330,104,52" name="教务处领导"> <transition g="-16,-9" name="教务处领导同意" to="end1"/> </task> <end g="276,424,48,48" name="end1"/></process>
4.1 流程部署
首先初始化数据库,建立流程相关的表(结尾有相关的表说明),有两种方式:
1. 手动执行相应的sql文件,文件目录为JBPM_HOME\install\src\db\create
2. 使用 hibernate 自动建表,这里使用自动建表,在jbpm.hibernate.cfg.xml中配置:hibernate.hbm2ddl.auto=update。
连接Mysql创建数据库 dbleave
public class Deploy { public static void main(String[] args) { //使用默认的配置jbpm.cfg.xml获取engine,单例 ProcessEngine processEngine = Configuration.getProcessEngine(); //部署流程到数据库 String deployId = processEngine.getRepositoryService() .createDeployment().addResourceFromClasspath("leave.jpdl.xml") .deploy(); System.out.println("deployId======="+deployId); }}
直接运行,就把相关流程信息存储到数据库了,部署结束后,数据库信息如图:相关表说明
4.2 JBPM操作
JBPM的操作都是通过Service完成的,以下是获取Service的方式和各Service的用途:
首先获取流程引擎 ProcessEngine
① RepositoryService:管理部署对象和流程定义
② ExecutionService:管理执行的,包括启动、推进、删除Execution等操作
③ TaskService :管理任务的
④ HistoryService:历史管理(执行完的数据管理,主要是查询)
RepositoryService repositoryService = processEngine.getRepositoryService(); ExecutionService executionService = processEngine.getExecutionService(); TaskService taskService = processEngine.getTaskService(); HistoryService historyService = processEngine.getHistoryService(); ManagementService managementService = processEngine.getManagementService();
4.3 流程实例的执行
流程实例创建后,直接就到开始活动后的第一个活动,不会在开始活动停留。
1. 流程启动
使用指定的 key 启动流程实例(不特殊指定key的值,其与流程name相同),在流程启动的时候,可以设置一些流程变量,如请假人名字、请假天数等
//1> 不附加流程变量 ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processName);//2> 附加流程变量 Map<String, Object> result = new HashMap<String, Object>(); // 通过ExecutionService启动流程实例,并设置一些流程变量 ProcessInstance pi = processEngine.getExecutionService().startProcessInstanceByKey(processName, variables);
2. 走一步流程
http://my.oschina.net/yangzhiyuan/blog/213817?fromerr=OqvJ1yoc#OSC_h4_24
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- JBPM工作流
- jBPM工作流
- JBPM工作流
- JBPM-工作流
- 【工作流】:JBPM
- 工作流--JBPM
- JBPM工作流
- JBPM工作流引擎理论基础
- jBPM工作流定义部署
- jbpm 工作流引擎
- JBPM工作流介绍
- jBPM工作流部署
- Android Service详解
- IEnumerable与IEnumerator区别
- JVM内存模型
- 【Spark工作机制详解】 执行机制
- implements与extends知识点整理
- JBPM-工作流
- 【CSS3】设置动画播放方式
- orm-mybatis开发系列之一:环境搭建
- shell脚本常用命令简单总结
- 配置Openfire
- H.264视频在android手机端的解码与播放
- BestCoder Round #72 (div.1) Clarke and MST
- xcode插件XAlign
- Rectangle Functions