jBPM4.4详细讲解
- 格式:docx
- 大小:102.32 KB
- 文档页数:8
JBPM4.4应用开发——入门篇2010-10-27 20:38:24标签:JBPM工作流工作流程入门原创作品,允许转载,转载时请务必以超链接形式标明文章原始出处、作者信息和本声明。
否则将追究法律责任。
/1931202/411612首先简单说说JBPM——java Business Process Management (java 业务流程管理)jBPM是一个框架、一堆开放的源代码。
而非一套“应用程序”。
jBPM的流程引擎可以看做是一个java工程——若干java类、依赖库和配置文件;使用和学习jBPM需要如下条件:1.jBPM的流程定义和运行时的上下文需要被存储到关系型数据库中——可以是基于调试目的的内存数据库HSQLDB,也可以是真正的持久化数据库(MySql,Oracle,PostgreSql,Sybase等等);2.jBPM的流程设计一般都需要一个基于客户端的图形化流程设计器软件,当然在jBPM4版本以后可以支持在web上做流程设计(这要归功于Sigvio项目)3.最终,基于jBPM开发出来的应用程序一般都会被部署到一台应用服务器中,以便服务于来自web的访问、监控和管理等。
注意:在jBPM4.3以后,几乎所有的准备工作(安装数据库,建表,安装应用服务器,安装图形化设计器插件等)jBPM软件包的发布者都帮我们做好了。
只要通过Ant脚本“一键获取”所需要的jBPM4整套开发、运行和管理环境。
在安装jBPM之前首先要安装JDK和Ant。
快速开始--------------------------------------------------------一、1.打开cmd命令控制台:进入到${jbpm.home}/install2.运行脚本:ant demo.setup.tomcat或ant.demo.setup.jboss使用这两个服务器都可以。
具体这个命令做了上面事:请查看install目录下的build.xml文件中的目标。
1. JBPM简介JBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的基于java实现的流程业务处理框架(Business Process Management)。
jBPM是公开源代码项目,它使用要遵循Apache License。
支撑企业的流程性业务应用:解释业务规则,使得协作自动化2.JBPM最大特色就是它的商务逻辑定义没有采用目前的一些规范,如WfMC´s XPDL, BPML, ebXML, BPEL4WS等,而是采用了它自己定义的JBoss jBPM Process definition language (jPdl)。
jPdl认为一个商务流程可以被看作是一个UML状态图。
jPdl就是详细定义了这个状态图的每个部分,如起始、结束状态,状态之间的转换,过图型化的流程定义,直观地描述业务流程。
jBPM的另一个特色是它使用Hibernate来管理它的数据库。
Hibernate是目前Java领域最好的一种数据存储层解决方案,只要是Hibernate 支持的数据库,jBPM 也就支持。
通过Hibernate,jBPM将数据的管理职能分离出去,自己专注于商务逻辑的处理。
3.JBPM带来的益处实现了无纸化的工作模式;过程可监控:便于对执行过程的跟踪和监控数据可管理:便于对数据进行检索、分析可靠性:减少人-人交互的主观错误的机率4.JBPM常见应用领域行政管理:行政、事业单位、大中型(国有)企业产品研发和制造:用于对整个研发、生产制造过程的管理和调度电子商务:订单处理其他如大型内容管理系统的多步审核5.JBPM常见场景公文流转、行政审批、订单处理、产品研发、制造过程其他需要多个角色协作、多步完成的活动6.JBPM模型说明加载流程定义:定义工具可以系统提供,也可以只是读取定义结果启动流程:启动选定的流程,创建流程实例办理任务(流程的每一步):执行流程的每个步骤(不一定都需要人参与:自动任务节点)记录流程的状态:对状态的管理是工作流引擎的主要职责7.JBPM主要概念流程定义:预先定义的业务流转逻辑流程实例:业务的一次实际流转过程参与者:任务的执行者活动(任务):组成流程定义的节点活动实例:组成流程实例的元素流转:从一个节点到另一个节点这一行为工作列表:当前需要办理的任务集合工作流引擎:工作流的核心组件,对流程实例、任务实例以及其状态进行管理8.JBPM套件的组成jPDL Designer:流程定义设计器,流程建模工具jPDL Library:流程执行引擎WebConsole:参与者和流程执行环境的交互界面,流程运行期间的监控工具9. 使用jBPM开发工作流的一般流程1) jBPM的运行需要数据库的支持,因此系统设计时要选定所用数据库。
jbpm4 数据库结构关系图JBPM数据库分析持久化基础知识持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
我们可以这样理解:在一定周期内保持不变就是持久化,持久化是针对时间来说的.数据库中的数据就是持久化了的数据,只要你不去删除或修改.Session会话中Session对象变量也是不变的,是Session容器中持久化对象持久化的方式有很多种,根据周期不同有,page,Session,Application,对象序列化机制对于需要将对象的状态保存到文件中,而后能够通过读入对象状态来重新构造对象,恢复程序状态,对象序列化的过程是对象持久化的方法之一,把对象保存到文件中.广义上说我们需要持久化是由于内存的易失性和过于昂贵造成的。
JBPM流程引擎的持久化有什么特点JBPM流程引擎的持久化层使用的当前流行的ORM框架hibernate,得益于hibernate的一些强大特性,导致JBPM也具有了这样的一些特性,比如通过hibernate的HSQL,我们可以专注我们的业务逻辑,而不用考虑不同的数据库之间T-SQL的差异,这样是jbpm具备一套代码,可以平滑的从不同数据库间进行更换。
JBPM需要持久化基于以下特点1.工作流作为典型的交互性应用,其必须精细控制执行过程,并记录执行的状态,在用户唤醒流程时,能够在流程持久化的那个点继续运行。
同时在流程挂起时,我们将相关数据持久化,也有性能和故障恢复的考虑。
2.流程引擎的运行本身也会产生相关的对象(流程实例、Execution等),需要持久化到数据库3.流程引擎需要记录相关的业务数据4.流程引擎需要记录相关的执行历史数据JBPM流程引擎的数据库结构图各个数据表的功能简单介绍流程部署jbpm4_deployment:发布的记录表,通过dbid跟后两个表进行关联。
整合例子(附完整的请假流程例子,jbpm基础,常见问题解决)jbpmhibernatespringstrutsvariables任务整合例子(附完整的请假流程例子)。
1. jbpm4.4 测试环境搭建整合环境搭建3. jbpm4.4 基础知识4. 整合过程中常见问题的解决5. 请假流程例子(s2sh+jbpm )6. 总结及参考文章jbpm4.4 测试环境搭建刚接触jbpm 第一件事就是快速搭建环境,测试jbpm 所给的例子。
Jbpm 是一个工作流引擎框架,如果没有javaEE 开发环境,jbpm 也提供了安装脚本(ant ),一键提供安装运行环境。
同时也可以将jbpm 整合到eclipse 或者myeclipse 中。
快速搭建环境的步骤是:1. 安装jbpm-myeclipse 插件,这个插件随jbpm4.4 一起发布,位于jbpm-4.4/install/src/gpd 目录下,这个安装好后,就可以在myeclipse 中编辑流程图了(可视化流程设计)在myeclipse->help->myeclipse configuration centre->software->add site->add from archive file 选择jbpm-4.4/install/src/gpd 下的jbpm-gpd-site.zip安装这个插件应该注意断网,避免其到网上更新。
同时注意:需要选择双击每一项,确保每一项被加入到了(说明:事实上不用选完,带source 的部件不用选择,为了省事就全部选择了)提示:如果安装时不断网,jbpm 插件会自动到网上更新。
同时会弹出一个错误窗口,安装速度异常缓慢。
安装完成后,myeclipse 的references 菜单会变得面目全非。
2. 搭建jbpm 运行环境。
3 .然后配置jpdl 支持4. 确定是否配置jbpm 正确在myeclipse->new->other->关于myeclipse 中配置jbpm 请参考jbpm 的帮助文档,文档给的是在eclipse 下配置jbpm 。
jBPM4.4一、什么是jBPMJBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。
同时它还能被部署在任何一款JAVA应用服务器上。
java Business Process Management :工作流,工作流引擎注:记得j小写,因为j代表java,与Log4j中j一样工作流管理系统不止一中,如还有Intaliol BPMS …但JBoss jBPM灵活性且扩展性高。
jBPM项目于2002.3由Tom Baeyens 发起,2003.12发布1.0版本,2004年10.18发布2.0,并在这天加入了JBOSS组织-→被RedHat公司二、能干什么提供工作流的实现,帮助更好的进行BPM三、jBPM有什么,简介jBPM的Service API 各种服务1:ProcessEngine:流程引擎。
并不负责具体的业务,而是用于获取各种Service。
2:RepositoryService:流程资源服务的接口,如流程定义发布、查询、删除等。
3:ExecutionService:用于操作流程实例的服务,可以进行流程实例发布、查询、流程推进、设置流程变量等操作。
4:TaskService:用于操作人工任务的服务,可以进行任务创建、查询、获取、提交完成、保存、删除等操作。
5:HistoryService:用于操作流程历史的服务,提供对流程历史库(就是已经完成的流程实例)的操作。
比如:历史流程实例,历史活动实例等。
6:IdentityService:用于操作用户、用户组以及成员关系的服务7:ManagementService:流程管理控制服务的接口,只提供异步工作(Job)相关的执行和查询操作。
四、Myeclipse8.5 搭配开发环境1.jbpm-4.4.zip 下载完2.myeclipse→help→Myeclipse Configuration Center →add…….3.找到\jbpm-4.4\install\src\gpd\jbpm-gpd-site.zip 安装这个插件4.记得不要联网安装,不要选source文件5.安装完后window→JBoss jBPM→runtime Location→add 添加jbpm的路径6.添加lib下所有jar包,如果你使用的是tomcat6.0则:要把Juel-api.jar ,juel-impl.jar,juel-engine.jar 拷到tomcat lib 下并把原来的el-api.jar删掉项目中就不要再导上面三个包五、修改配置文件1、将example中的下列配置文件拷贝到java项目的src目录下:jBPM.cfg.xml、jBPM.hibernate.cfg.xml、jBPM.mail.properties、jBPM.mail.templates.xml、process_forms.css2、在以上配置文件中的jBPM.hibernate.cfg.xml,实际上就是我们熟悉的hibernate.cfg.xml,这里,要修改为连接我们的数据库。
基于S2SH+JBPM4.4的学生请假系统仅供参考,请勿照搬职责分工表技术集成(S2SH+JBPM4.4),业务逻辑设计与实现,报告撰写界面设计与实现(jQuery),S2SH相关问题共同讨论数据库设计及建表,参与逻辑设计与问题讨论姓名:学院:计算机科学与技术专业:软件工程指导老师:目录1 前言 (1)1.1 背景介绍 (1)1.2 研究现状 (1)1.3 课题研究内容 (1)1.4 本文章节安排 (1)1.5 本章小结 (2)2 核心技术简介 (3)2.1 S2SH技术简介 (3)2.2 Struts2框架简介 (3)2.3 Spring框架简介 (4)2.4 Hibernate框架简介 (4)2.5 JBPM流程管理技术简介 (5)2.6 jQuery技术简介 (6)2.7 本章小结 (7)3 请假系统需求分析 (8)3.1 任务概述 (8)3.2 用户特点 (8)3.3 功能需求 (8)3.4 界面需求 (10)3.5 操作需求 (10)3.6 本章小结 (10)4 概要设计 (11)4.1 设计思想 (11)4.2 总体设计 (11)4.3 数据库结构说明 (11)4.4 流程设计 (13)4.5 本章小结 (13)5 详细设计 (14)5.1 数据库物理结构设计 (14)5.2 各功能模块详细设计 (14)5.3 本章小结 (18)6 具体实现 (19)6.1 系统开发与运行环境 (19)6.2 开发环境的搭建 (19)6.3 数据库系统实现 (27)6.4 DAO层实现 (28)6.5 Action层的实现 (28)7 总结 (36)1 前言1.1背景介绍近几年,我国校园网络建设取得了实质性的进展。
网络已经不再局限于单纯地提供信息服务,而是日益成为一个操作平台,为用户提供强大的服务功能。
在关注信息技术与课程教学整合的同时,学校日常工作也逐渐走上信息化的道路,结合软件系统,满足老师和学生的日常需求,是我们目前要考虑的问题。
jbpm4⼯作流详解jBPM4的学习流程 1>jBPM4通过org.jbpm.pvm.internal.ant.JbpmDeployTask通过读取jbpm.cfg.xml中的JDBC数据连接信息 2>对jbpm4的数据库表简单介绍 3>通过ProcessEngine类的贯穿来获取服务接⼝(Service API)来认识所有的常⽤类 4>对流程定义语⾔中活动⼏个常⽤的介绍 5>事件的介绍 JBPM:部署流程定义 jBPM4通过org.jbpm.pvm.internal.ant.JbpmDeployTask通过读取jbpm.cfg.xml中的JDBC数据连接信息直接将业务流程部署到数据库中。
它不仅可以部署单个业务流程,也可以部署⼀组业务流程归档到服务器上。
jbpm⾸先扫描业务流程归档中所有以.jpdl.xml结尾的⽂件,并解析,然后⽤来发起流程实例,业务流程归档中所有其他资源也会在部署过程中被持久化到数据库中。
所有这些资源被统⼀编号保存在数据库表jbpm4_lob中我们可以通过jbpm4提供的RepositoryService.getResourceAsStream API随时访问这些资源。
jbpm4的数据库表简单介绍JBPM4_DEPLOYMENT 流程定义表 JBPM4_DEPLOYPROP 流程定义属性表JBPM4_EXECUTION 流程实例表 JBPM4_HIST_ACTINST 流程活动(节点)实例表JBPM4_HIST_DETAIL 流程历史详细表JBPM4_HIST_PROCINST 流程实例历史表JBPM4_HIST_TASK 流程任务实例历史表 JBPM4_HIST_VAR 流程变量(上下⽂)历史表JBPM4_ID_GROUP ⾓⾊表 JBPM4_ID_MEMBERSHIP ⽤户⾓⾊表 JBPM4_ID_USER ⽤户表 JBPM4_JOB 定时表 JBPM4_LOB 存储表JBPM4_PARTICIPATION 参与者表 JBPM4_SWIMLANE 泳道表 JBPM4_TASK 任务表 JBPM4_VARIABLE 上下⽂表(1)JBPM4_DEPLOYMENT、(2)JBPM4_DEPLOYPROP及(3)JBPM4_LOB:存储上传⼀个包含png和jpdl.xml的zip包的相关数据 jbpm4_deployment表多了⼀条记录 jbpm4_deployprop表多了四条记录,对应langid,pdid,pdkey,pdversion jbpm4_lob 表多了⼆条记录,保存流程图png图⽚和jpdl.xml (4)JBPM4_HIST_PROCINST与(5)JBPM4_HIST_ACTINST 分别存放的是Process Instance、Activity Instance的历史记录。
1.工作流与工作流管理系统1.1. 工作流(Work Flow)工作流就是工作流程的计算机模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算。
工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。
通俗的说,流程就是多个人在一起合作完成某件事情的步骤,把步骤变成计算机能理解的方式就是工作流。
公司内采用纸张表单,手工传递的方式,一级一级审批签字,工作效率低下,对于统计报表功能则不能实现。
而采用工作流软件,使用者只需在电脑上填写有关表单,会按照定义好的流程自动往下跑,下一级审批者将会收到相关资料,并可以根据需要修改、跟踪、管理、查询、统计、打印等,大大提高了效率,实现了知识管理,提升了公司的核心竞争力。
作为一个成熟稳定的工作流产品,不仅提供日常办公和关键业务流程智能化管理,而且能根据公司的特殊实际要求轻松方便地随时定制各种流程,并可实现不同角色不同的跟踪、查询、统计、打印等强大功能1.2.工作流管理系统(Workflow Management System)工作流管理系统(WfMS)的主要功能是通过计算机技术的支持去定义、执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互。
工作流需要依靠工作流管理系统来实现。
工作流管理系统是定义、创建、执行工作流的系统,应能提供以下三个方面的功能支持:1.定义工作流:包括具体的活动、规则等2.运行控制功能:在运行环境中管理工作流过程,对工作流过程中的活动进行调度3.运行交互功能:指在工作流运行中,WfMS与用户(活动的参与者)及外部应用程序工具交互的功能。
一、定义工作流二、执行工作流1.3.什么地方使用工作流技术OA中的审批流转的功能,其作用是能按照指定的流程(步骤)流转要审批的表单(就像流水线一样)。
有如下问题:1,流程有很多。
2,不同的公司,流程的具体步骤是不一样的,有时还需要增加新流程或修改现有流程。
通过ProcessEngine获得repositoryService1.部署流程定义,获得一个Id,id的格式为{key}-{version},key 和version之间使用连字符连接,没有key,系统会默认取,一般是jpdl.xml文件的名字2.流程的部署:processEngine.getRepositoryService().createDeployment().addResourc eFromClasspath("process\\sss.jpdl.xml").deploy()3.启动新的流程实例:ProcessInstance processInstance = executionService.startProcessInstanceByKey("ICL");ProcessInstance processInstance =executionService.startProcessInstanceByKey("ICL", "CL92837");为流程定义了一个id,若第一条,getId为ICL.7,7为主键第二条getId为ICL.CL92837注:尽量使用第二条自定义keyProcessInstance processInstance =executionService.startProcessInstanceByKey("ICL", variables);variables为HASHMAP,第3中方式启动流程实例部署jdpl.xml之后,直接返回的是deploymentId,将这个id拼接key,放入方法executionService.startProcessInstanceById(ke+”-”+deploymentId);也可以启动实例格式如:{key}-{version}3. <on event="start"><event-listener class="com.system.listener.JbpmListener"/></on>在jdpl.xml中加入事件监听器,在class中实现EventListener接口在处理完之后executionService.signalExecutionById()移动到下一节点实例processInstance有两种方法判断节点状态isActive("state1"),state1节点是否是活动的;isEnded()是否流程已经结束另:注意啊在做单元测试的时候,如果jdpl.xml用了表达式,一定要将这三个包考进来,要不单元测试报错4.关于taskService,同样是由processEngine获得,不同的是,任务是指具体到某个人或是定义的某个组,如Map map = new HashMap();map.put("user","jhon");ProcessInstance processInstance =executionService.startProcessInstanceByKey("ceshi", map);int a = taskService.findPersonalTasks("jhon").size();在jdpl.xml中定义了<task g="224,222,92,52"name="task1"assignee="#{user}"><transition name="to end1"to="end1"g="-47,-17"/> </task>#{user}故在map中要以user为key放用户姓名,然后查找以用户名查找代办任务在taskService里要使向下一节点传递,需用方法pleteTask(task.getId());要使需要传送参数,应在以上方法前加taskService.setVariables(task.getId(),map);pleteTask(task.getId());达到传递的目的Eg: <?xml version="1.0"encoding="UTF-8"?><process name="ceshi"xmlns="/4.3/jpdl"> <on event="start"><event-listener class="com.system.listener.JbpmListener"/> </on><start g="294,93,48,48"name="start1"><transition g="-53,-17"name="task1"to="task1"/> </start><end g="297,394,48,48"name="end1"/><task g="274,198,92,52"name="task1"assignee="#{user}"> <transition g="-53,-17"name="task2"to="task2"/> </task><task g="274,305,92,52"name="task2"assignee="#{bieren}"> <transition g="-47,-17"name="end1"to="end1"/></task></process>public void testHello(){Map map = new HashMap();map.put("user","jhon");ProcessInstance processInstance =executionService.startProcessInstanceByKey("ceshi", map);List<Task> list = taskService.findPersonalTasks("jhon");System.out.println(list.size());if(list.size()>0){Task task = list.get(0);map = new HashMap();map.put("bieren","haha");taskService.setVariables(task.getId(),map);pleteTask(task.getId());}list = taskService.findPersonalTasks("jhon");System.out.println(list.size());list = taskService.findPersonalTasks("haha");System.out.println(list.size());}这是由jhon发出,此时jhon有代办任务,由jhon带上参数map发送给了haha,haha待办任务就能看到,而jhon没有了,这两个参数分别是在xml中配置的#{user}、#{bieren}任务的分支(根据画线名称走):ProcessInstancepi=executionService.startProcessInstanceByKey("ceshi"); executionService.signalExecutionById(pi.getId(),"wait");System.out.println(pi.isActive("wait"));pi = executionService.signalExecutionById(pi.getId(),"accept"); System.out.println(pi.isActive("submit"));特别注意这里将重新返回一个新的processInstance任务的选择分支decision(根据判断条件走):<start g="28,131,80,40"><transition to="evaluate document"/></start><decision g="157,132,80,40"name="evaluate document"><transition to="submit document"><condition expr="#{content=='good'}"/></transition><transition to="try again"><condition expr="#{content=='not so good'}"/></transition><transition to="give up"/></decision><state g="291,252,80,40"name="submit document"/><state g="278,24,80,40"name="try again"/><state g="310,129,80,40"name="give up"/>Map map= new HashMap();map.put("content","good");ProcessInstancepi=executionService.startProcessInstanceByKey("ceshi",map); System.out.println(pi.isActive("submit document")); System.out.println(pi.isActive("give up"));返回值是true,false可以在<decision g="157,132,80,40"name="evaluate document"> <transition to="submit document"><condition expr="#{content=='good'}"/></transition>加入表达式也可将 xml改变为<start ><transition to="evaluate document"/></start><decision name="evaluate document" expr="#{content}" ><transition name="good" to="submit document" /><transition name="bad" to="try again" /><transition name="ugly" to="give up" /></decision><state name="submit document" /><state name="try again" /><state name="give up" /></process>两种写法在判断中使用java类<start g="83,155,80,40"><transition to="evaluate document"/></start><decision name="evaluate document"g="173,154,80,40"><handler class="com.system.util.ContentEvaluation"/><transition name="good"to="submit document"g="-29,-17"/><transition name="bad"to="try again"g="-23,-17"/><transition name="ugly"to="give up"g="-29,-17"/></decision><state name="submit document"g="289,105,80,40"/><state name="try again"g="291,162,80,40"/><state name="give up"g="295,215,80,40"/>ContentEvaluation.java需要实现DecisionHandler接口。
JBPM4之重要节点说明一、start节点start表示了一个流程在哪里开始执行。
在一个流程至少得有一个start节点。
一个start节点中必须有一个外流迁移(transition)并且这个转移在流程开始时就会执行。
到目前为止,一个流程有且只有一个start节点。
二、state节点state表示了一个等待状态。
流程的执行将会等到有通过API提供的外力触发。
state节点除了常用的节点内容(name, transition)外没有其他的属性或元素。
2.1、state序列如以下实例,展现了一个通过transition链接的state序列此序列的代码如下:1.<process name="StateSequence"xmlns="/4.4/jpdl">2.3.<start>4.<transition to="a"/>5.</start>6.7.<state name="a">8.<transition to="b"/>9.</state>10.11.<state name="b">12.<transition to="c"/>13.</state>14.15.<state name="c"/>16.17.</process>你可以通过以下方式启动执行:1.ProcessInstance processInstance =2.executionService.startProcessInstanceByKey("StateSequence");当你执行启动此流程后,此流程将会停留在a节点上,可以通过方法signalExecution提供一个外力使其继续执行。
第 1 章导言上一页下一页第 1 章导言最好使用firefox浏览这份教程。
在使用internet explorer的时候会有一些问题。
1.1. 许可证与最终用户许可协议jBPM是依据GNU Lesser General Public License(LGPL)和JBoss End User License Agreement(EULA)中的协议发布的,请参考完整的LGPL协议和完整的最终用户协议。
1.2. 下载可以从sourceforge上下载发布包。
/projects/jbpm/files/1.3. 源码可以从jBPM的SVN仓库里下载源代码。
https:///repos/jbpm/jbpm4/1.4. 什么是jBPMjBPM是一个可扩展、灵活的流程引擎,它可以运行在独立的服务器上或者嵌入任何Java应用中。
1.5. 文档内容在这个用户指南里,我们将介绍在持久执行模式下的jPDL流程语言。
持久执行模式是指流程定义、流程执行以及流程历史都保存在关系数据库中,这是jBPM实际通常使用的方式。
这个用户指南介绍了jBPM中支持的使用方式。
开发指南介绍了更多的、高级的、定制的、没有被支持的选项。
1.6. 从jBPM 3升级到jBPM 4没办法实现从jBPM 3到jBPM 4的升级。
可以参考开发指南来获得更多迁移的信息。
1.7. 报告问题在用户论坛或者我们的支持门户报告问题的时候,请遵循如下模板:=== 环境 ==============================- jBPM Version : 你使用的是哪个版本的jBPM?- Database : 使用的什么数据库以及数据库的版本- JDK : 使用的哪个版本的JDK?如果不知道可以使用'java -version'查看版本信息- Container : 使用的什么容器?(JBoss, Tomcat, 其他)- Configuration : 你的jbpm.cfg.xml中是只导入了jbpm.jar中的默认配置,还是使用了自定义的配置?- Libraries : 你使用了jbpm发布包中完全相同的依赖库的版本?还是你修改了其中一些依赖库?=== Process ==================================这里填写jPDL流程定义=== API ===================================这里填写你调用jBPM使用的代码片段=== Stacktrace ==============================这里填写完整的错误堆栈=== Debug logs ==============================这里填写调试日志=== Problem description =========================请保证这部分短小精悍并且切入重点。
jbpm4.4常用接口使用说明jbpm任务stringsession设计模式manager在jbpm4.4开发过程中,我们需要使用其提供的接口来完成任务,1.AssignmentHandlerAssignmentHandler是jbpm为我们提供的一个绑定用户,分配任务的接口,我们可以通过实现这个接口来指定Task 的执行者,必须配合jpdl.xml下的标签和程序来使用,web环境下一般都是session中的用户。
举个例子:一个员工提交一个请假申请,如果我们给这个Task添加一个AssignmentHandler,把员工的姓名绑定进去,那么jbpm就会知道,这个流程是这个员工创建的……按正常逻辑请假单已经提交到了领导那,我们可以通过再实现一个AssignmentHandler接口,通过AssignmentHandler动态的对流程实例定义Actor,将领导设置成task的执行者。
这样做的好处就是灵活……当领导登录时,session中是领导的姓名,领导查自己的任务列表就会看到那份员工提交的请假单了。
jpdl.xml的一部分(主要是<assignment-handler >和<decision >两个标签)1.<task assignee="${name}"g="235,146,92,52"name="LeaveApplication">2.<assignment-handler class="com.mtf.jbpm.handler.NewApplicationAssignmentHandler"/> //创建请假单前绑定用户,员工3.<transition g="-113,-17"name="SubmitApply"to="ManagerApprove"/>4.</task>5.<task assignee="${name}"g="244,235,92,52"name="ManagerApprove">6.<assignment-handler class="com.mtf.jbpm.handler.ManagerApproveAssignmentHandler"/>//当请假单流转到manager那时触发,领导7.<transition g="-46,-23"name="ManagerApproved"to="DaysCheck"/>8.<transition g="-15,-35"name="ManagerDisApproved"to="end"/>9.</task>10.<decision g="67,240,48,48"name="DaysCheck">11.<handler class="com.mtf.jbpm.handler.DaysCheckHandler"/> //分支流程12.<transition g="-20,-2"name="LessThan3Days"to="HrMakeSure"/>13.<transition g="-49,-11"name="MoreThan3Days"to="ExecutiveApprove"/>14.</decision>15.∙申请请假单的AssignmentHandler1.public class NewApplicationAssignmentHandler implements AssignmentHandler{2.3.@Override4.public void assign(Assignable assignable, OpenExecution execution)5.throws Exception {6. System.out.println("pxj 创建一leave");7. String name =(String) execution.getVariable("name");8. System.out.println(name);9. assignable.setAssignee(name);10. }11.}∙领导的AssignmentHandler1.public class ManagerApproveAssignmentHandler implements AssignmentHandler{2.3.@Override4.public void assign(Assignable assignable, OpenExecution execution)5.throws Exception {6. System.out.println("经理开始审批");7. String id = (String) execution.getVariable("parentId");8.int managerId = Integer.parseInt(id);9. EmployeeDao employeeDao = new EmployeeDaoImpl();10. Employee e= employeeDao.findEmployeeById(managerId);11. assignable.setAssignee(e.getE_name_cn());12. }13.}其中parentId是请假单提交的时候设定的,解释一下:员工提交请假单当然是提交到自己领导那了,于是我在提交请假单的方法中查找了一下自己领导的id,存在这个parentId中,到这里面在寻找这个人的姓名(领导的名字)通过assignable.setAssignee(e.getE_name_cn()); 将这个Task的执行者设置成领导……于是乎当领导查自己的任务列表时,就能查到自己下属提交的请假单了∙这个方法就是提交请假单的方法,应该写在前面才对,思路有些混乱……1./**2. * submitApplication 2012-7-93. */4.@Override5.public void submitApplication(String actorId, float days,6. ProcessInstance pi, int id) {7. String taskId = processEngine.getTaskService().createTaskQuery()8. .processInstanceId(pi.getId()).uniqueResult().getId();9.// 绑定流程10.// 寻找上级11. LeaveDao dao = new LeaveDaoImpl();12. Leaves leaves = null;13.try {14. List<Leaves> all = dao.queryParentById(id, 1);15.for (int i = 0; i < all.size(); i++) {16. leaves = all.get(i);17. }18. } catch (Exception e) {19. }20. System.out.println("TaskId" + taskId);21. Task tasks = processEngine.getTaskService().getTask(taskId);22. String executionId = tasks.getExecutionId();23. processEngine.getExecutionService().setVariable(executionId,24."parentId",new String(leaves.getL_emp_id()+""));25. processEngine.getExecutionService().setVariable(executionId,"days",26. days);27. processEngine.getTaskService().completeTask(taskId);28.}主要接收:流程实例id,创建人姓名,请假人id,本次总结我只想把jbpm的接口总结一下,关于流程的部分请看下部分。
JBPM4.4相关详细配置及使用文档所需软件:Jbpm 4.4、Myeclipse8.6(或eclipse3.5)、Apache、Tomcat6.0、jdk1.6、sqlserver2000一、Myclipse中安装jbpm插件(以Myeclipse8.6为例)1)下载jbpm4.4并解压;2)打开myclipse→选择help菜单,选择software and workspace center3)选择software然后选择右上角add site4)选择add from archive filejbpm-gpd-site.zip6) name 随便输入即可(比如jbpm )→点击OK ,这样下面就看到多一个jbpm ,一个一个选中jpd 下面的文件,点击右击“add to profile ”,点击右下角“apply change ”按钮7) 安装完成后会重启Myeclipse ,重启后在新建项目里会多出一项“JBoss${jbpm_home}\jbpm-4.4\install\src\gpd\jbp m-gpd-site.zipjBPM”,如下图所示:8)表单定制图形化界面乱码解决:找到安装目录Genuitec\MyEclipse8.5\myeclipse.ini文件添加-Dfile.encoding=UTF-8重启MyEclipse即可。
(注此方法适于MyEclipse7.5以上版本)MyEclipse7.5以下(或eclipse3.5)直接找eclipse安装文件下的eclipse.ini添加-Dfile.encoding=UTF-8二、安装Apache-ant(以1.8.1为例)下载Ant,本文使用apache-ant-1.8.1:/dist/ant/binaries/安装方法如下:1)解压到后的apache-ant-1.8.1目录;2)设置环境变量:在环境变量中添加ANT_HOME,值为安装目录(如F:\java\java_tool\ant\apache-ant-1.8.1);3)把%ANT_HOME%\bin 加入到环境变量 PATH 中;4)测试是否安装成功:在CMD DOS模式下运行 ant -version 回车,看输出说明配置成功三、sqlserver配置(以sqlserver2000为例)1)创建Dynamic Web project或Java project工程;2)右击工程导入jbpm4.4 \lib下所有jar包及jpbm.jar包;3)将解压的jbpm-4.4\examples\src下的所有配置文件拷贝工程src下;配置文件名如下:jbpm.cfg.xml、jbpm.hibernate.cfg.xml、jbpm.mail.properties、jbpm.mail.templates.xml、logging.properties4)修改jbpm.hibernate.cfg.xml<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property><property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property><property name="hibernate.connection.url">jdbc:sqlserver://192.168.1.100:1433;DatabaseName=jbpm</property><property name="ername">sa</property><propertyname="hibernate.connection.password">sa123456</property><property name="hibernate.hbm2ddl.auto">create-drop</property><property name="hibernate.format_sql">true</property>5)下载JDTS第三方驱动(支持SQL2000,2005,SYBASE),下载解压后找jtds-1.2.5.jar并复制WEB-INF/lib目录下,然后右击工程导入此jar驱动包,下载地址:/为什么要用第三方驱动的原因是微软公司的驱动的兼容性不太好如下:✓如果采用jdbc-odbc驱动,那么就必须按照查询顺序来一次读取(不论有没有image或text类型);✓如果采用微软提供的ms sql server jdbc driver,如果查询语句中,不存在image或text类型字段,那么可以按照无序获取;✓如果采用微软提供的ms sql server jdbc driver,如果查询语句中,存在image或text类型字段,那么就必须按照顺序读取,否则就会报告Driver]ResultSet can not re-read row data for column之类的错误;✓如果想不查询语句中有没有image或text类型字段,都可以不按照顺序获取,或重复获取。
JBPM⼯作流⼀.开发环境的搭建1.下载Jbpm4.41.1下载地址:1.2解压后的⽬录2.安装GPD插件(eclipse图形化流程设计器)2.1打开eclipse--------选择help--------选择install new software2.2选择add添加插件:点击Archive选择插件⽬录:插件⽬录所在位置就是下载的解压后的路径中找jbpm-4.4\install\src\gpd2.3选择插件后续直接下⼀步就⾏,等待安装插件。
1.配置运⾏时的环境打开eclipse-------------preference1.配置JPDL xml的schema dtd4.1⽬的有时在建jpdlxml⽂件的时候没有节点的提⽰,我们配置⼀下这个schema dtd,就有提⽰了。
4.2配置步骤打开eclipse-------------preference⼆.JBPM简介2.1什么是jbpmJBPM,全称是Java Business Process Management(业务流程管理),它是覆盖了业务流程管理、、服务协作等领域的⼀个开源的、灵活的、易扩展的可执⾏流程语⾔框架。
2.2为什么⽤jbpm业务分析师和开发⼈员使⽤的是同⼀种语⾔来交谈,⼤⼤降低了开发的风险,如果要开发⼀个项⽬,速度也更快了,因为开发⼈员不⽤再将⽤户需求转化成软件设计了。
其次,JBPM采⽤的不是⼀般的开发⼯具,⽽是⾃⼰的图形化开发⼯具,⾮常⽅便随时了解和掌握运⾏的进程。
最后,JBPM的流程框架⾮常灵活,使⽤起来也⾮常安全,它经过了安全认证,因此可以保证⼀些商业机密不被泄露。
三.开发步骤1.引⼊jar包在jbpm4.4的解压包中根⽬录Jbpm的jar包还有lib⽂件夹中除report-engine,war包外所有jar包注:因为Jbpm4.4是⽤Mysql作为DB的,如果要⽤Oracle作为DB需要引⼊相应的驱动包。
2.创建配置⽂件<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- 连接数据库的⼀些信息 --><property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property><property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property><property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property><property name="ername">jbpm</property><property name="hibernate.connection.password">jbpm</property><property name="hibernate.hbm2ddl.auto">update</property><property name="hibernate.format_sql">true</property><!-- ⼩配置:映射⽂件 --><mapping resource="jbpm.repository.hbm.xml"/><mapping resource="jbpm.execution.hbm.xml"/><mapping resource="jbpm.history.hbm.xml"/><mapping resource="jbpm.task.hbm.xml"/><mapping resource="jbpm.identity.hbm.xml"/></session-factory></hibernate-configuration>3.画流程图新建jpdl.xml⽂件/*** 创建表结构:有18张表*/@Testpublic void createTable(){// 读取配置⽂件new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory(); }18张表的含义:/a757956132/p/4774188.html5.获取⼯作流引擎//获取⼯作流引擎//ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();//获取⼯作流引擎ProcessEngine processEngine =Configuration.getProcessEngine();6.部署流程定义//获取⼯作流引擎//ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();//获取⼯作流引擎ProcessEngine processEngine =Configuration.getProcessEngine();7.启动流程实例//获取⼯作流引擎//ProcessEngine processEngine = new Configuration().setResource("jbpm.cfg.xml").buildProcessEngine();//获取⼯作流引擎ProcessEngine processEngine =Configuration.getProcessEngine();8.查询任务@Testpublic void selectMyStack(){//根据指定的⼈员去查看他的任务List<Task> stacks= processEngine.getTaskService().findPersonalTasks("部门经理");System.out.println("经理的任务");for (Task task : stacks) {System.out.println("任务ID:"+task.getId()+"\t任务名称:"+task.getName()+"\t任务的办理⼈:"+task.getAssignee());}}9.查询当前任务所在节点@Testpublic void getActivity(){String name=processEngine.getExecutionService().createProcessInstanceQuery().processInstanceId("jbpm01.10001").uniqueResult().findActiveActivityNames().toString(); System.out.println("当前任务所在节点:"+name);}10.办理任务@Testpublic void saveTask(){processEngine.getTaskService().completeTask("80002");System.out.println("任务办理成功");}流程管理四.流程管理四.4.1部署流程4.2查看所有流程定义的信息@Testpublic void findAll(){List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().list();for (ProcessDefinition pd : list) {/*** id的格式 name-版本号* name:jbpm.cfg.xml⽂件中根据点的name属性值* key,如果在配置⽂件中指定了,那么就是根据点中的test的值,如果不指定默认是name的值* version版本号,同⼀个名称的第⼀个为1后续的⾃增*/System.out.println("id:"+pd.getId()+"\tname:"+pd.getName()+"\tkey"+pd.getKey()+"\t版本号:"+pd.getVersion()+"\t部署的id:"+pd.getDeploymentId()); }}4.3删除指定id流程信息@Testpublic void deleteByid(){pe.getRepositoryService().deleteDeploymentCascade("100001");System.out.println("删除成功");}4.4删除指定key的所有流程信息@Testpublic void deleteByids(){//01.取出当前key对应的版本信息List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey("jbpmtest").list();for (ProcessDefinition pd : list) {pe.getRepositoryService().deleteDeploymentCascade(pd.getDeploymentId());}System.out.println("删除成功");}4.5获取流程图@Testpublic void getImage() throws Exception{String deploymentId="10001";//根据id去查询所有对应的资源名Set<String> resourceNames = pe.getRepositoryService().getResourceNames(deploymentId);for(String item: resourceNames){System.out.println("资源名称:"+item);}InputStream in=pe.getRepositoryService().getResourceAsStream(deploymentId, resouceName);OutputStream os=new FileOutputStream("D:\\1.png");int a=in.read();while (a!=-1) {os.write(a);a=in.read();}in.close();os.close();System.out.println("成功");}4.6部署zip格式的资源public void addZipResource(){InputStream is=this.getClass().getClassLoader().getResourceAsStream("two.zip");ZipInputStream zs=new ZipInputStream(is);String id= pe.getRepositoryService().createDeployment().addResourcesFromZipInputStream(zs).deploy();System.out.println("部署成功:deploymentid:"+id);}4.7找到所有最新版本的流程定义@Testpublic void findNewVersionInfo(){//查询所有List<ProcessDefinition> list = pe.getRepositoryService().createProcessDefinitionQuery()//.orderAsc(ProcessDefinitionQuery.PROPERTY_VERSION).list();Map<String,ProcessDefinition> map=new java.util.HashMap<String,ProcessDefinition>();for (ProcessDefinition item : list) {map.put(item.getKey(),item);}for (ProcessDefinition pd : map.values()) {System.out.println("id:"+pd.getId()+"\tname:"+pd.getName()+"\tkey"+pd.getKey()+"\t版本号:"+pd.getVersion()+"\t部署的id:"+pd.getDeploymentId()); }4.8设置流程变量public void setVariable() {pe.getExecutionService().setVariable("jbpm01.90001", "请假天数", 18);}@Testpublic void getVariable() {Integer days = (Integer) pe.getExecutionService().getVariable("jbpm01.90001", "请假天数");System.out.println(days);}五.JBPM和SSH整合⽬的:整合jBPM的⽬的就是能够通过注⼊的⽅式得到ProcessEngine实例,因为ProcessEngine是jbpm 的核⼼.1.关于jar包在Tomcat/lib⽬录下添加jBPM软件包⾥的下列三个jar包,删掉Tomact/lib下的el-api2.关于配置⽂件修改jbpm.cfg.xml⽂件<?xml version="1.0" encoding="UTF-8"?><jbpm-configuration><import resource="jbpm.default.cfg.xml"/><import resource="jbpm.businesscalendar.cfg.xml"/><!-- Hibernate的事务管理器 --><!-- <import resource="jbpm.tx.hibernate.cfg.xml" /> --><!-- 修改为Spring的事务管理器 --><import resource="jbpm.tx.spring.cfg.xml"/><import resource="jbpm.jpdl.cfg.xml"/><import resource="jbpm.bpmn.cfg.xml"/><import resource="jbpm.identity.cfg.xml"/><!-- Job executor is excluded for running the example test cases. --><!-- To enable timers and messages in production use, this should be included. --><import resource="jbpm.jobexecutor.cfg.xml" />--></jbpm-configuration>修改applicationcontext.xml⽂件<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance" xmlns:tx="/schema/tx" xmlns:aop="/schema/aop" xmlns:context="/schema/context" xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/tx/schema/tx/spring-tx.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/context/schema/context/spring-context.xsd"><!-- 扫描包中注解标注的类 --><context:component-scan base-package="cn"></context:component-scan><!-- 1.引⼊jdbc.properties⽂件 --><bean id="propertyConfigurer"class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="location"><value>classpath:jdbc.properties</value></property></bean><!-- 2.配置dataSource c3p0数据源 --><bean id="datasource" class="boPooledDataSource"><!-- 数据库连接信息 --><property name="jdbcUrl" value="${jdbc.url}"></property><property name="driverClass" value="${jdbc.driver}"></property><property name="user" value="${ername}"></property><property name="password" value="${jdbc.password}"></property><!-- 其他配置 --><!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。
jBPM4.4一、什么是jBPMJBPM是一个扩展性很强的工作流系统,百分百用JAVA语言开发,持久层采用Hibernate实现,理论上说,只要Hibernate支持的数据库JBPM都支持。
同时它还能被部署在任何一款JAVA应用服务器上。
java Business Process Management :工作流,工作流引擎注:记得j小写,因为j代表java,与Log4j中j一样工作流管理系统不止一中,如还有Intaliol BPMS …但JBoss jBPM灵活性且扩展性高。
jBPM项目于2002.3由Tom Baeyens 发起,2003.12发布1.0版本,2004年10.18发布2.0,并在这天加入了JBOSS组织-→被RedHat公司二、能干什么提供工作流的实现,帮助更好的进行BPM三、jBPM有什么,简介jBPM的Service API 各种服务1:ProcessEngine:流程引擎。
并不负责具体的业务,而是用于获取各种Service。
2:RepositoryService:流程资源服务的接口,如流程定义发布、查询、删除等。
3:ExecutionService:用于操作流程实例的服务,可以进行流程实例发布、查询、流程推进、设置流程变量等操作。
4:TaskService:用于操作人工任务的服务,可以进行任务创建、查询、获取、提交完成、保存、删除等操作。
5:HistoryService:用于操作流程历史的服务,提供对流程历史库(就是已经完成的流程实例)的操作。
比如:历史流程实例,历史活动实例等。
6:IdentityService:用于操作用户、用户组以及成员关系的服务7:ManagementService:流程管理控制服务的接口,只提供异步工作(Job)相关的执行和查询操作。
四、Myeclipse8.5 搭配开发环境1.jbpm-4.4.zip 下载完2.myeclipse→help→Myeclipse Configuration Center →add…….3.找到\jbpm-4.4\install\src\gpd\jbpm-gpd-site.zip 安装这个插件4.记得不要联网安装,不要选source文件5.安装完后window→JBoss jBPM→runtime Location→add 添加jbpm的路径6.添加lib下所有jar包,如果你使用的是tomcat6.0则:要把Juel-api.jar ,juel-impl.jar,juel-engine.jar 拷到tomcat lib 下并把原来的el-api.jar删掉项目中就不要再导上面三个包五、修改配置文件1、将example中的下列配置文件拷贝到java项目的src目录下:jBPM.cfg.xml、jBPM.hibernate.cfg.xml、jBPM.mail.properties、jBPM.mail.templates.xml、process_forms.css2、在以上配置文件中的jBPM.hibernate.cfg.xml,实际上就是我们熟悉的hibernate.cfg.xml,这里,要修改为连接我们的数据库。
<propertyname="connection.driver_class">oracle.jdbc.driver.OracleDriver</property><propertyname="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property><property name="ername">test</property><property name="connection.password">test</property><property name="dialect">org.hibernate.dialect.Oracle9iDialect</property>3、在这里还需要强调,其中的一个配置:<property name="hibernate.hbm2ddl.auto">create-drop</property>如果这个配置存在的话,那么每次操作数据库都会把原来的数据表干掉,然后重新建立。
所以,我们在第一次访问数据库的时候打开它,以后则关闭。
六、工作方式采用xml定义流程方式,这Xml代码既可以直接放在java中,也可以单独存在一个xml文件中,然后我们对其进行解析。
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(“<xml>…”)ProcessDefinition.parseXmlResource("helloWorld.xml");七、JPDL学习JPDL(JBPM Process Definition Language)是构建于jBPM框架上的流程语言之一。
JPDL详细定义了这个状态图的每个部分,如: 开始、结束状态,状态之间的转换等。
这种语言的定义对于用户来说比较容易理解,也比较容易对其进行扩展。
一个JBPM的流程定义XML文件中包含一个< process-definition>元素,而一个< process-definition>元素又包含零个或一个< description>元素,零个或多个的< swimlane>元素,一个< start-state>元素,零个或多个的< state>元素或< decision>元素或< fork>元素或< join>元素,以及零个或多个的< action>元素,零个或多个<task-node>和<node>元素,一个< end-state>元素等等。
此外,< process definition>元素有一个标示符,以“name”属性来表示,这个属性必须存在,用来表示该流程的名称。
在jPDL中提供了任务(tasks)、待处理状态(wait states)、计时器(timers)、自动处理(automated actions)…等术语,并通过图型化的流程定义,很直观地描述业务流程。
总结:可以理解为一个产生XML的图形化设计建模软件。
八、流程定义(ProcessDefinition)就是对一个流程抽象的对象化定义。
一套系统中,用户可以定义并保存多个流程定义实体,如:报销流程定义、请假流程定义、人事录用流程定义等。
流程节点:是对流程中的过程环节/行为的抽象对象化定义。
结点有两个主要职责:一,实现某个指定行为,这在jBPM中就是执行一段制定的Java代码;二,传递、维持流程的延续,直至达到最终结点。
流程实例(ProcessInstance):流程实例是流程定义的运行时状态,它记录了一个流程运行的起始时间、结束时间等状态信息。
任务实例(Task):用来描述一个任务实例对象,可以分配给指定的操作者处理,当任务完成后,将触发流程继续向下流转。
任务实例的生命周期很简单,生成实例-->处理-->任务结束。
九、ProcessEngine流程引擎工作流软件的核心,负责装载并解释过程定义、控制过程实例、安排活动上面的代码演示了如何通过classpath根目录下默认的配置文件jbpm.cfg.xml创建一个//2.第二种发布的方式,发布打包的zip文件repositoryService.createDeployment().addResourcesFromZipInputStre am(zipInputStream).deploy();//拿到已经发布的所有流程List<ProcessDefinition> lists =processEngine.getRepositoryService().createProcessDefinitionQuery().l ist();注: 在流程发布的时候流程引擎会吧一个ID分配给流程定义。
这个ID的格式为{key}-{version}如果没哟指定key则引擎会再流程的名称基础上自动生成,其实将不是字母和数字的字符替换成下划线。
然后我们就可以检索流程定义了!十一、启动流程//第一种:processEngine.getExecutionService().startProcessInstanceById(Proc essId,map);这里processId是已经发布的流程定义Id,我们告诉jBPM我们启动哪个流程,而map是作为我们向下传递数据的map封装。
这里主要是确定开始申请节点的名称//第二种:key就是流程的名称如我们发布了一个MyProcess.zip流程executionService.startProcessInstanceByKey("MyProcess",map);分析quaApplyAdd方法:十二、流程下发pleteProcessById(taskIdString, "task", "分公司级飞管标准专员审核报批", map);十三、任务列表(Worklists)List<Task> tasks =processEngine.getTaskService().createTaskQuery().list();for(Task t :tasks){System.out.println(t.getActivityName());//当前节点System.out.println(t.getId()); //System.out.println(t.getAssignee());//发起者System.out.println(t.getCreateTime());System.out.println(t.getName());}过程执行中需要用户交互的地方,工作流引擎把任务添加到任务表中,以便任务表处理器对其处理,任务表处理器管理与工作流参与者的交互。
用户自己从任务表中选择执行任务,任务表也用来指示任务的完成。
十四、任务操作ProcessEngine processEngine = Configuration.getProcessEngine();TaskService taskService = processEngine.getTaskService();String taskId = “70003”;//这个是流程运行中生成的任务idMap map = new HashMap();map.put("dmResult", 1);map.put("days", 15);pleteTask(taskId,map);//任务下发十五、历史操作ProcessEngine engine = Configuration.getProcessEngine();HistoryService hs = engine.getHistoryService();List<HistoryProcessInstance> list =hs.createHistoryProcessInstanceQuery().list();for(HistoryProcessInstance hpi : list){System.out.println("state="+hpi.getState()+" ,pdid=”+hpi.getProcessDefinitionId()+",piid=”+hpi.getProcessInstanceId()+",startTime="+hpi.getStartTime());}Start活动:Start活动的意义在于指定了一个流程实例应该从哪来开始,即流程定义的入口。