注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

工作流与jbpm介绍  

来自genww   2013-03-25 18:40:10|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
工作流需求特点
为了方便开发和使用,作为企业级应用的流程管理,需要能够支持如下功能特点

流程功能
这是工作流的最基本功能,当工作流定义完成并提交后,有权限的用户可以根据需要创建流程并填写表单内容。引擎负责按定义的工作流条件将该工作流实例流转到下一个定义好的节点上处理,其中节点的处理可以是任意任务,如用户任务(如审批),或者是逻辑任务(如通知某人,物理上可以是发送一个邮件或其他相关操作)。下图是最简单的一个流程流转定义:
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
一个简单的流程定义(jbpm例)
 

可动态变更
作为企业级应用,经常变化流程是很常见的事情,这需要工作流提供一种机制需要动态支持企业经常改变流程流转等需求变化,在线提交。新发起的流程可以应用在更新后的流程描述中,同时老的未完成的流程流转还不能受到影响。

持久化
由于工作流是一个需要支持用户操作任务节点等操作。所以他并不要求某个流程能够及时结束(一个流程发起到结束可能是毫秒级,也可能是几天,因为需要用户参与)。工作流的持久化就是为了在流转过程中保存中间数据使其能够非实时的流转。同时他需要支持多种持久化平台,因为在可能存在多种系统同时协作的企业级引用中强制要求客户使用哪种持久化平台不太现实。

流程管理
在流程流转中,我们需要能够有显示流程状态的界面来进行管理,当管理员登陆登录后,可以查看运行流转状态如查看表单内容,流转状态等,甚至我们可以终止该流程继续执行

统计报表
由于报表是企业级应用管理最核心的功能之一,故工作流也需要进行实时统计(如什么时间段发起了多少实例,实例在哪些节点处理了多少次等)。以满足企业应用的不同需求


bpm与工作流

jbpm工作流是现在企业级常用的工作流引擎框架,提供了工作流的流转和管理功能。在谈及jbpm工作流前,需要谈谈workflow与bpm之间的关系。

workflow与bpm早期原是属于两个领域,workflow用于解决“办公自动化”和“流程自动化”而形成的应用技术和解决方案。但是这对开发人员来讲还存在着很多的未知性,如流程的开发形态,业务的集成和分析,数据的管理与决策支持等。而bpm则是一套比较完善的处理企业流程的管理系统平台领域,由于他收到广大IT巨头的大力支持,故形成了一套比较完善的规范和体系。但是作为同是处理企业级流程处理解决方案,workflow中有很多概念其实和BPM没有明显的不同,而是在推动业务过程管理,整合、统计与上层支持等方面做了更加细致的优化和统一,可以说BPM的蓬勃发展是受到了workflow的深远的影响。所以后来我们不对workflow与bpm做太大的区分,或者说BPM是由workflow和企业级应用相互集成并融合

bpm有很多组织和规范的定义,了解这些规范和组织有助于我们对工作流引擎的理解。业务流程管理促进会(Business Process Management Initiative,BPMI)是一个致力于推广BPM(业务流程管理)标准和规范的组织。BPMI的目标是将不同业务类型、不同行业的公司通过互联网等技术进行业务流程的整合,以实现管理的最优化、生产利益的最大化。
2002年BPMI联合WFMC宣布合作制定业务流程和工作流的标准和规范,即利用BPML(Business Process Modeling Language)进行工作流程描述,以及采用XPDL定义工作流业务模型。WFMC定义的XPDL(XML Process Definition Language)成为工作流领域最重要的一个标准,当今很多主流工作流产品都是依据这个标准和规则进行设计和开发的。而OMG在原来WFMC定义的规范基础结合自身对对象模型的经验提出了一个新的BPMN规范,该规范定义了采用标准符号对流程进行标准定制。BPMN和XPDL这两个规范是相辅相成的,前者定义了可视符号,而后者可以理解成将这些可视符号转换成(序列化)对应的xml语言描述方式。

JBPM
· jbpm是一个开源的工作流引擎,由jboss社区维护。该引擎也是当前企业级应用广泛采用的工作流引擎职业。到目前为止jbpm已经发展到了jbpm5。推荐新的用户使用jbpm5来作为工作流引擎实现企业级工作流应用。因为这不仅是因为它更稳定和健全,而且是到目前为止最忠实于业界工作流规范的一个版本(现在能支持bpmn2.0规范的常用功能)

jbpm支持以下功能:
  1. 支持基于eclipse和web的editor环境。通过图形界面采用简单拖拽方式实现创建你的业务流程逻辑
  2. 可扩展的基于jpa/jta的持久化和事务
  3. 可扩展的支持 WS-HumanTask规范的human task服务。支持采用human actors来展示插入的任务
  4. 管理控制台支持流程实例管理,任务列表和任务结构管理和报告
  5. 支持可选的持久化平台来开发你的流程
  6. 历史日志查询监控和分析
  7. 支持整合到seam,spring,OSGi等

jbpm用于处理和分析工作流定义的实例knowledgeBase,包含了处理ProcessDefinition的功能。我们需要通过它来分析和处理符合xpdl规范的流程定义。由于他处理处理和解析都比较重量级,在工作流引擎整个生命周期中,该实例应该只有一个。一旦knowledgeBase生成后,我们可以用它来创建session,session是操作流程实例的具体对象,比如创建新的流程实例,触发事件操作等。session被做成相对轻量级一些。所以一个knowledgeBase可以创建多个session。而这些session各自维护了一个engin级别的线程,他们相互独立。事实上,一般一个应用只需要一个session实例就够了。下面是这些主要操作对象之间的关系
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
jbpm引擎主要对象关系
 
流程节点
一般创建一个流程需要做如下几步:首先是建模,需要定义节点,表单或输出输出参数,定义流转方向和条件,在一些特定场合还需要定义一些事件用于特殊业务处理。然后是创建事件实现,如具体的事件处理逻辑,触点逻辑等,这部分一般需要根据业务编写代码实现具体流程。最后是调用接口触发流程,jbpm提供了多种方式实现对流程的管理和操作。最常用的是调用他提供的high level api,这也是jbpm推荐的方式,这些api能够在版本升级后尽量保持向下兼容。

工作流节点bpmn2.0有大量的定义。jbpm对其常用的功能进行了实现。节点主要包含event,activities,gateways三种类型,下面一一进行描述

event节点

start event节点
用于标示流程的起始,一个流程中应该只有一个start节点。当一个新的流程发起时,也就意味着该流程从这个节点上发起,并迅速自动流向该节点指向的下一个节点。
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 start event节点

end event节点
end节点表示一个流程的结束为止,当流程流转到该节点时表示该流程结束,流程实例被销毁。一个流程可以有一个或多个end节点,如果有多个end节点,可以通过参数terminate指定是否结束该流程,或者所有的并行流程(一个流程通过分支产生出多个并发执行的流程,他们都属于同一个流程实例)都流转到了end节点的话也会自动结束该流程。
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 end event节点

error event节点
当流程在流转过程中出现错误(如发生异常)则触发该事件。流程会查询合适的handler来处理这个异常,如果这个流程没有定义error节点或没有合适的handler,则该流程会被abort
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
error event节点
catching timer event节点
定时器节点,当流程流转到该节点后,会触发一个定时器,可以指定后续流程将在多久以后执行,或每隔多久执行一次
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 catching timer event节点
Catching signal event节点
定义逻辑事件,可以是任意业务逻辑事件如用户请假。在物理执行上是当process在执行过程中通过代码(session.signalEvent)触发事件操作,则该节点流程会继续向下执行。该节点可以有输入输出流转方向,也可只有输出流转方向。
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 caching signal event
 
activities节点

script task节点
该节点很简单,当流程处理到该节点时则触发一个指定的脚本。不过需要注意的是jbpm使用engine线程来执行该脚本。这意味着脚本的执行一定是高效的。否则建议开一个新的线程来执行
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 script task节点
service task节点
所有需要执行在流程之外的任务都建议使用该节点。该节点被设计为逻辑上代表则某个业务任务操作,如发送邮件,记录日志等,所以我们一般给给该节点取一个表示该任务的确切名称。在物理上service task也一般task使用没有大的区别
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 service task节点
user task节点
该节点表示当流程流转到此处时需要用户操作,如领导审批等。jbpm支持使用 WS-HumanTask规范来定义一个user task。这表示该task可以有多种状态。同时也能够支持外部满足该协议的系统的整合。除此之外,在物理上和一般task使用没有大的区别
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 user task节点
resuable sub-process 节点
当流程到达该节点时,通过节点中的定义,可以让引擎发起一个新的流程。同时可以指定相关参数来管理父流程和子流程的耦合关系。如父流程abort后是否影响子流程等
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
resuable sub-process 节点 
Business rule task 节点
该节点用于处理指定的business rule,通过执行ruleflow,可以创建新的活动到agenda中。ruleflow采用另一套执行脚本来操作,用于定义并验证业务逻辑
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
Business rule task 节点
embedded sub-process 节点
该节点内部可以包含一个新的子流程。当新的子流程执行完后该节点才继续往后执行。子流程可以共享父流程的中间变量,但是除非子流程显示的提供给父流程,父流程在自身的范围中不能获取到子流程的中间变量。物理上与Resuable sub-process的区别是前者子流程的定义是新起一个流程定义的xml,而后者子流程定义也嵌入在主流程的xml中。
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 Embedded sub-process 节点
Multi-instance sub-process 节点
该节点和embedded sub-process类似,但是允许你执行多次里面的子流程。

gateway节点

Diverging gateway节点
分支节点只允许一个流入接口,同时需要至少两个流出接口。是提供流程实现流转方向的基本节点。另外,根据流转逻辑,分支节点支持以下三种方式的流转:
AND:或叫parallel,当流程流转到此后,会生成多个流程并行执行
OR:或inclusive,表示凡是evaluates为true的都通过,即支持同时流向多个节点。都通不过抛异常
XOR:或exclusive,表示只有优先级最低并且evaluates为true的通过,都通不过抛异常,和OR的区别是前者允许有一个或多个并行输出流程,后者只能有一个输出流程。
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
 Diverging gateway节点

Converging gateway节点
有分支就有合并,该节点就是对上面分支后的节点进行合并操作,允许多个输入,但是只能有一个输出
jbpm介绍 - 网易杭研后台技术中心 - 网易杭研后台技术中心的博客
其他说明 
在jbpm中,并不是只有上面介绍的几个节点才是jbpm支持的。实际上jbpm对xpdl的支持规范主要分两个部分,一个是基于eclipse插件的图形界面设计对节点的支持,另一个是jbpm引擎对xml描述文件的支持。也就是说虽然在eclipse插件上看到的节点或者属性没有提供,但是实际上我们还是可以通过编写符合xpdl的规范的xml文件。jbpm官方文档有描述对BPMN2.0的大部分常用功能都有支持。可以通过http://docs.jboss.org/jbpm/v5.4/userguide/ch.core-bpmn.html提供的介绍来查看支持的具体内容。
最后谈谈在使用jbpm进行开发需要注意的有关工作流的逻辑多线程问题:这是指一个工作流流转定义了一个分支,当实例进入到这个分支时就分支出来了多个同时运行的流程进行后续流转。但是从物理上,它还是单线程的(为了避免不同线程间的竞争和交互)。推荐一个应用使用一个session进行流程管理,如果使用多个session,则需要考虑数据库锁的问题。应避免使用表锁而使用行锁,否则很容易发生死锁问题。
  评论这张
 
阅读(723)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017