定义
工作流系统是以规格化的流程描述作为输入的软件组件,它维护流程的运行状态,并在人和应用之间分派活动。
为了后面的描述,我们先定义一些基本的术语:流程定义(process definition)和流程实例(process instance). 一个流程定义是一个业务流程或过程的规格化描述。一个流程实例是流程定义的一个运行实体。 都目前为止,概念还比较清晰是不是?但当再深入一步时,我们就要小心使用文字了。如何阐述流程中的步骤,现在还没有一个统一的方式。这是各种工作流规范和工具之间主要的分歧。
为什么应当禁止使用术语“活动(activity)”...
流程定义通常用一些活动表述。我认为这是导致工作流领域所有混乱的主要原因。我告诉你为什么:因为术语“活动”混淆了状态(state)和动作(action)之间的差异。在流程中,状态 (或者说等待状态)代表了一种对外部参与者(actor)的依赖。在流程运行时,这意味着流程引擎必须等待,直到外部参与者通知工作流管理系统指定的状态完成了。比如,等待可进一步运行的认可。动作 是在流程运行过程中,工作流系统为响应指定事件(event)运行的一段程序逻辑(programming logic)。当流程运行过程中指定的事件发生时,工作流系统启动并执行这些动作。比如,当状态分配给一个参与者时,发一封Email。你也能看出,状态和动作是如此不同,因此使用同样的术语去描述这些概念是一个坏习惯。我的建议是避免使用术语“活动”,使用“状态”或者“动作”代替它。
工作流系统另一个重要的职责是维护每一个流程运行的上下文信息。 流程上下文变量(process context variable) ,或简称变量,是与流程实例相关的变量。如,休假申请的开始日期、数据库中一条记录的键值、文档管理系统中一篇文档的索引等。通常在流程定义中声明这些变量,然后在流程实例生成时,这些流程变量被实例化。所有成熟的工作流管理系统都支持定制的变量类型。
目标领域(Target usage)
使用工作流管理系统的目的之一是作为企业应用系统集成(EAI)的平台。在当前大部分企业级IT架构中,各种各样的异构(heterogeneous)应用和数据库运行在企业内网中。在这些系统被应用到组织时,都有一个清晰的目标。例如,客户管理、文档管理、供应链、订单、支付、资源计划等等。让我们称这些系统为专门应用( dedicated applications)。每一个专门应用都包含它们所支持业务流程的领域知识。这些专门应用中的自动化流程,被拼装到企业中更大的非自动化流程中。每当一个这样的专门应用安装并投入使用,都会带来涉及其他多个应用的新功能需求。企业应用系统集成(EAI)就是通过使用多个专门应用满足软件新需求的方法。有时,这只需要在两个应用之间提供数据通讯的通道。专门应用将很多业务流程硬编码在软件中。可以这么说,在你购买专门应用时,你是购买了一组固定的自动化业务流程。而工作流管理系统是不必事先知道问题域的相关信息的。工作流系统将业务流程描述作为输入并管理流程实例的执行,这使得它比专门应用更灵活(当然你也要花精力编写业务流程的规格化描述)。这就是为什么说工作流系统和专门系统是相互补充的。工作流系统可以用来管理全局的业务流程。如果专门应用支持你所需要的业务流程,那么使用专门应用。在此讨论的工作流系统的第一种使用方式就是:结合所有的专门应用,使用工作流系统构建一个EAI平台。
工作流系统能够发挥很大价值的第二个使用方式是:协助涉及多人相关任务工作流软件的开发。为了达到这个目的,大部分工作流系统都有一个方便的机制,来生成执行任务的表单。对于专注于ISO 或者 CMM认证的组织,采用这种方式使用工作流系统能够显著提高生产率。 不用将过程用文字的形式写在纸上,工作流系统使你通过流程定义建模实现过程的自动化(如使用基于Web的应用)。
工作流系统的第三种使用方式是:将工作流引擎嵌入到其他应用中。在前面我们谈到,专门应用将指定问题域相关的业务流程固化在软件中。开发专门应用的公司也可以将工作流引擎嵌入到他们的软件中。在这里,工作流引擎只是作为一个软件组件,对于应用的最终用户是不可见的。将工作流引擎嵌入到应用中的主要原因是为了重用(不重复发明轮子)和应用软件的可维护性。
The case for workflow
对于引入工作流的组织,能够在软件开发和业务两个层次受益。
方便开发
工作流管理系统能够简化企业级软件开发甚至维护。
降低开发风险 - 通过使用状态和动作这样的术语,业务分析师和开发人员使用同一种语言交谈。这样开发人员就不必将用户需求转化成软件设计了。
实现的集中统一 -业务流程经常变化,使用工作流系统的最大好处是:业务流程的实现代码,不再是散落在各种各样的系统中 。
加快应用开发 - 你的软件不用再关注流程的参与者,开发起来更快,代码更容易维护。
业务流程管理 (BPM)
在自动化业务流程之前,分析并将它们规格化是一件艰苦但会有很好回报的工作。e-workflow.org对于分析流程能够带了的益处有不错的阐述:
提高效率 - 许多流程在自动化过程中会去除一些不必要的步骤
较好的流程控制 - 通过标准的工作方法和跟踪审计,提高了业务流程的管理
改进客户服务 - 因为流程的一致性,提高了对客户响应的可预见性
灵活 - 跨越流程的软件控制,使流程可以按照业务的需要重新设计。
业务流程改进 - 对流程的关注,使它们趋向于流畅和简单
我认为他们还遗漏了一个使用工作流系统最重要的因数:提高对迭代开发的支持。如果软件中业务流程部分不容易更改,组织就会花很大的精力在开发前的业务流程分析中,希望一次成功。但可悲的是,在任何软件项目开发中,这都很少能实现。工作流系统使得新业务流程很容易部署,业务流程相关的软件可以一种迭代的方式开发,因此使用工作流系统使开发更有效、风险更低。
缺失的一环(Missing link)
我确实认为工作流系统是企业应用开发中缺失的一环。将企业业务流程逻辑在企业级软件中实现的缺省方式是分散的。这意味着业务流程逻辑散布在各种系统中,如EJB、数据库触发器、消息代理等等。这样得到的软件难于维护,结果,企业只能将改变业务流程软件作为最后的选择。他们经常能够做的是,改变流程以适应软件。上述问题也适用于采用大型外部ERP软件包的企业。进一步,假设我们认识到这个问题,并打算将一个流程相关的代码都集中起来。对于一个流程来说这很不错,但当你要实现多个流程时,你会看到管理状态和流程变量的代码被到处复制。最后,我们会整理这些代码放到一个集中的库中。好,...这就是一个工作流管理系统了,不用费心自己来实现,你可以从本文后面的列表中选择一个。
A closer look
WFMS interfaces
一个工作流管理系统以流程定义作为输入。在这里,可以将流程定义看作UML活动图、UML状态图或者有限状态机。在提交一张费用单据、申请休假、要求一个报价、...之后,工作流系统负责维护这些流程定义的执行状态和上下文。为此,需要通知工作流系统状态的变化。运行流程的状态变化可以记录下来,以备监控管理。
Figure 2: Interfaces of a WFMS
定义 工作流系统的定义接口使流程开发人员能够部署流程定义。注意,这里的“流程开发人员”可以是业务分析师和软件开发人员的组合。 圈套(Pitfall)
许多工作流管理系统的开发商想使你相信,通过使用他们的图形化流程开发工具,只要业务分析师就可以生成流程定义。这种幻想源于“编程很难”这样的事实。开发商的销售人员喜欢说“看,你不用写一行代码”。不用写代码是好事,可大部分开发商在这点上走的太远,忽略了在某些场合提供一种将代码集成到流程定义中的机制是很适合的。在将工作流系统作为EAI平台时,必须在流程中集成代码。开发流程定义需要业务分析师和软件开发人员的合作。一个好的图形流程设计工具应该能够支持这种合作。
执行 执行接口使用户和系统可以操作流程实例。流程实例是流程定义的执行。流程定义的控制流通过状态机描述。执行接口的两个主要方法是启动一个流程实例和通知工作流系统一个状态结束了。
应用 应用接口代表了由工作流系统发起的工作流系统和外部系统之间的交互。当一个用户或系统操作一个流程实例的运行时,会生成一些事件(如一个迁移的执行)。流程定义中可以指定一段响应一个事件的可执行代码逻辑,这段代码和组织内外部的其他系统打交道。
监控 管理人员通过监控接口获得流程运行的确切数据。有时,运行日志也可用于审计。
这些是WfMC参考模型(reference model of the WfMC )中定义的五个接口中的四个。
流程定义的四个层次
在下面这部分,我尝试回答这样的问题“什么是流程定义包括的内容?”。这是从各种规范和工具所使用模型的原则和概念中总结得来的,反映了大部分模型中通用的基本思想。流程定义的内容可以分为四个不同的层次:状态(state)、上下文(context)、程序逻辑(programming logic)和用户界面(UI)。
状态层
所有状态和控制流的表述,都属于业务流程的状态层。标准编程语言中的控制流来源于Von Neuman体系。控制流定义了必须被执行的指令的顺序,控制流由我们书写的命令、if语句、循环语句等确定。在业务流程中的控制流基本与此一致。但在业务流程中不是使用命令而是使用状态作为基本元素。
在流程中,状态 (或者说等待状态)代表了一种对外部参与者(actor)的依赖。状态的意思就像“现在X系统或某某人必须作某些事,在此等待直到参与者通知这些任务已完成”。状态定义了一种对外部提供结果的依赖。状态典型的例子是批准步骤(step)。
流程定义中的状态也指定了执行依赖于哪个参与者。在活动图中,泳道(swimlanes)的标注代表这些参与者的名字。工作流系统使用这些信息构建任务列表,这是一般工作流系统都有的功能。如前所述,参与者可以是人也可以是系统。对于需要人参与的状态,工作流系统必须在运行时计算出具体的个人。这样的计算使工作流系统必须依赖于组织结构信息。关于这方面的一篇非常有趣的文章是在 further reading section 提到的“工作流应用中的组织管理”( 'Organizational Management in Workflow Applications')。
流程定义的控制流包含一组状态和它们之间的关系。状态之间的逻辑关系描述了哪些执行路径可以同时执行,那些不可以。同步执行路径用分叉(forks)和联合(joins)建模,异步执行路径用判断(decisions)和合并( merges)建模。注意在大多数模型中,在每个状态之前都有一个隐式合并。
UML活动图经常被用来做业务流程建模。作为一种直观和通用的表达,活动图在图形表述上有一个主要问题,就是没有区分状态和动作,它们都用活动来表示。缺少这种区分(导致状态概念的缺失)是学术派对UML活动图的主要批评。UML活动图的第二个问题是在UML2.0版中引入的。当多个迁移(transitions)到达一个活动时,以前的版本规定这是一个缺省合并(merge),在2.0版中规定这是一个需要同步的缺省联合(join)。在我看来,UML活动图的图形部分仍旧可以用来对业务流程状态层次建模,只要使用时对两条构建语义作如下的变化:
在用图形表述业务流程时,只建模状态层(状态和控制流),不要包括动作。这意味着图形中的矩形都是状态而不是活动
如果多个迁移到达一个状态,缺省定义为不需要同步的合并(merges)
在流程运行过程中,工作流系统用一个令牌(token)作为指针跟踪流程的状态。这相当于Von Neuman体系中的程序计数器。当令牌到达一个状态时,它被分配给工作流系统等待的外部参与者。外部参与者可以是个人、组织或者计算机系统。我们定义流程运行的执行人或系统为“参与者”(actor)。只有在工作流系统将令牌分配给一个参与者时,才需要访问组织结构信息。工作流系统通过分配令牌构建任务列表。
上下文层
流程上下文变量(process context variable) ,或简称变量,是与流程实例相关的变量。流程开发人员可以使用流程变量存储跨越流程实例整个生命周期的数据。一些工作流管理系统有固定数目的数据类型,另一些你可以定义自己的数据类型。
注意变量也可以用来存放引用( references)。一个变量可以引用如数据库中的记录、网络上的文件。什么时候使用引用,取决于使用引用数据的其他应用。
和流程变量相关的另一个令人感兴趣的方面是:工作流系统如何将数据转化为信息。工作流是用于组织内部跨越各种异构系统实现任务和数据协同的。对于业务流程中人工执行的任务,工作流系统负责从其他相关系统,如SAP、数据库、CRM系统、文档管理系统收集数据。在业务流程的每一个人工步骤,只有相关联的数据项被从异构系统中收集和计算。通过这种方式,从不同系统来的数据被转换并展现为信息。
程序逻辑层
如前所述,动作是在流程运行过程中,工作流系统响应指定的事件(event)执行的一段程序逻辑(programming logic)。程序逻辑可以是二进制或源代码形式的、用任何语言或脚本编写的软件。程序逻辑层是所有这些软件片断和关于在什么事件发生时调用它们的信息的组合。程序逻辑的例子包括发Email、通过消息代理发消息、从ERP系统中拿数据和更新数据库。
用户界面层
一个参与者通过向流程变量中填充数据的事件,来触发结束一个状态。比如,在请假的例子中,老板提供“同意”或“不同意”数据到流程中。某些工作流系统允许指定哪些数据可以填充到流程中,以及它们如何在流程变量中存储。通过这些信息,可以生成从用户收集信息的UI表单。基于流程定义生成用户提交表单的Web应用例子,可以访问 the jBpm online demo 。
工作流全景
可执行流程与工作流管理系统的比较(Executional processes versus a WFMS)
当前在BPM领域中,关于可执行业务流程的规范有趋向于统一集中的趋势。 XLANG, WSFL 和BPML合并为基于交互(消息交换)的BPEL。BPEL在面向服务体系结构(SOA)的大背景下定义。它的前提条件之一是涉及的服务必须用WSDL声明。BPEL规定了一套XML语法,这套语法可以看作一种编程语言,用来描述包括对WSDL定义的服务调用的控制流。
在可执行业务流程和基于状态的工作流管理系统所使用的方法中,我注意到了三点主要的区别:
基于状态与面向消息:基于状态的工作流系统以状态(或者活动)概念为中心。工作流引擎维护状态并计算从一个状态到另一个状态的迁移。另一方面,像BPEL这样的可执行流程以对输入消息响应的定义为中心。一组这些响应外加其他信息(other bells and whistles)可以看作一个业务流程。这也解释了为什么BPEL可以看作是对基于状态的工作流系统的某些方面的补充。一个响应输入消息的BPEL onMessage事件处理器,可以在工作流状态之间的迁移中执行。
流程实例ID与消息相关处理:可执行业务流程的复杂性之一来自消息相关性的处理。流程描述的一部分必须说明BPEL引擎如何从输入消息中确定具体流程的标识。这必须基于输入消息的一个数据项。而工作流系统在每个流程实例生成同时生成了实例ID,客户端在后续调用引擎API时使用这个ID。
工作流引擎API与抽象服务端点(endpoint):工作流系统提供一组集中的API,客户端通过调用API完成与所有流程实例的交互。在可执行业务流程中,每个流程表现为一个服务。这意味着对于每个流程定义都有一个不同的访问点。
工作流系统是以规格化的流程描述作为输入的软件组件,它维护流程的运行状态,并在人和应用之间分派活动。
为了后面的描述,我们先定义一些基本的术语:流程定义(process definition)和流程实例(process instance). 一个流程定义是一个业务流程或过程的规格化描述。一个流程实例是流程定义的一个运行实体。 都目前为止,概念还比较清晰是不是?但当再深入一步时,我们就要小心使用文字了。如何阐述流程中的步骤,现在还没有一个统一的方式。这是各种工作流规范和工具之间主要的分歧。
为什么应当禁止使用术语“活动(activity)”...
流程定义通常用一些活动表述。我认为这是导致工作流领域所有混乱的主要原因。我告诉你为什么:因为术语“活动”混淆了状态(state)和动作(action)之间的差异。在流程中,状态 (或者说等待状态)代表了一种对外部参与者(actor)的依赖。在流程运行时,这意味着流程引擎必须等待,直到外部参与者通知工作流管理系统指定的状态完成了。比如,等待可进一步运行的认可。动作 是在流程运行过程中,工作流系统为响应指定事件(event)运行的一段程序逻辑(programming logic)。当流程运行过程中指定的事件发生时,工作流系统启动并执行这些动作。比如,当状态分配给一个参与者时,发一封Email。你也能看出,状态和动作是如此不同,因此使用同样的术语去描述这些概念是一个坏习惯。我的建议是避免使用术语“活动”,使用“状态”或者“动作”代替它。
工作流系统另一个重要的职责是维护每一个流程运行的上下文信息。 流程上下文变量(process context variable) ,或简称变量,是与流程实例相关的变量。如,休假申请的开始日期、数据库中一条记录的键值、文档管理系统中一篇文档的索引等。通常在流程定义中声明这些变量,然后在流程实例生成时,这些流程变量被实例化。所有成熟的工作流管理系统都支持定制的变量类型。
目标领域(Target usage)
使用工作流管理系统的目的之一是作为企业应用系统集成(EAI)的平台。在当前大部分企业级IT架构中,各种各样的异构(heterogeneous)应用和数据库运行在企业内网中。在这些系统被应用到组织时,都有一个清晰的目标。例如,客户管理、文档管理、供应链、订单、支付、资源计划等等。让我们称这些系统为专门应用( dedicated applications)。每一个专门应用都包含它们所支持业务流程的领域知识。这些专门应用中的自动化流程,被拼装到企业中更大的非自动化流程中。每当一个这样的专门应用安装并投入使用,都会带来涉及其他多个应用的新功能需求。企业应用系统集成(EAI)就是通过使用多个专门应用满足软件新需求的方法。有时,这只需要在两个应用之间提供数据通讯的通道。专门应用将很多业务流程硬编码在软件中。可以这么说,在你购买专门应用时,你是购买了一组固定的自动化业务流程。而工作流管理系统是不必事先知道问题域的相关信息的。工作流系统将业务流程描述作为输入并管理流程实例的执行,这使得它比专门应用更灵活(当然你也要花精力编写业务流程的规格化描述)。这就是为什么说工作流系统和专门系统是相互补充的。工作流系统可以用来管理全局的业务流程。如果专门应用支持你所需要的业务流程,那么使用专门应用。在此讨论的工作流系统的第一种使用方式就是:结合所有的专门应用,使用工作流系统构建一个EAI平台。
工作流系统能够发挥很大价值的第二个使用方式是:协助涉及多人相关任务工作流软件的开发。为了达到这个目的,大部分工作流系统都有一个方便的机制,来生成执行任务的表单。对于专注于ISO 或者 CMM认证的组织,采用这种方式使用工作流系统能够显著提高生产率。 不用将过程用文字的形式写在纸上,工作流系统使你通过流程定义建模实现过程的自动化(如使用基于Web的应用)。
工作流系统的第三种使用方式是:将工作流引擎嵌入到其他应用中。在前面我们谈到,专门应用将指定问题域相关的业务流程固化在软件中。开发专门应用的公司也可以将工作流引擎嵌入到他们的软件中。在这里,工作流引擎只是作为一个软件组件,对于应用的最终用户是不可见的。将工作流引擎嵌入到应用中的主要原因是为了重用(不重复发明轮子)和应用软件的可维护性。
The case for workflow
对于引入工作流的组织,能够在软件开发和业务两个层次受益。
方便开发
工作流管理系统能够简化企业级软件开发甚至维护。
降低开发风险 - 通过使用状态和动作这样的术语,业务分析师和开发人员使用同一种语言交谈。这样开发人员就不必将用户需求转化成软件设计了。
实现的集中统一 -业务流程经常变化,使用工作流系统的最大好处是:业务流程的实现代码,不再是散落在各种各样的系统中 。
加快应用开发 - 你的软件不用再关注流程的参与者,开发起来更快,代码更容易维护。
业务流程管理 (BPM)
在自动化业务流程之前,分析并将它们规格化是一件艰苦但会有很好回报的工作。e-workflow.org对于分析流程能够带了的益处有不错的阐述:
提高效率 - 许多流程在自动化过程中会去除一些不必要的步骤
较好的流程控制 - 通过标准的工作方法和跟踪审计,提高了业务流程的管理
改进客户服务 - 因为流程的一致性,提高了对客户响应的可预见性
灵活 - 跨越流程的软件控制,使流程可以按照业务的需要重新设计。
业务流程改进 - 对流程的关注,使它们趋向于流畅和简单
我认为他们还遗漏了一个使用工作流系统最重要的因数:提高对迭代开发的支持。如果软件中业务流程部分不容易更改,组织就会花很大的精力在开发前的业务流程分析中,希望一次成功。但可悲的是,在任何软件项目开发中,这都很少能实现。工作流系统使得新业务流程很容易部署,业务流程相关的软件可以一种迭代的方式开发,因此使用工作流系统使开发更有效、风险更低。
缺失的一环(Missing link)
我确实认为工作流系统是企业应用开发中缺失的一环。将企业业务流程逻辑在企业级软件中实现的缺省方式是分散的。这意味着业务流程逻辑散布在各种系统中,如EJB、数据库触发器、消息代理等等。这样得到的软件难于维护,结果,企业只能将改变业务流程软件作为最后的选择。他们经常能够做的是,改变流程以适应软件。上述问题也适用于采用大型外部ERP软件包的企业。进一步,假设我们认识到这个问题,并打算将一个流程相关的代码都集中起来。对于一个流程来说这很不错,但当你要实现多个流程时,你会看到管理状态和流程变量的代码被到处复制。最后,我们会整理这些代码放到一个集中的库中。好,...这就是一个工作流管理系统了,不用费心自己来实现,你可以从本文后面的列表中选择一个。
A closer look
WFMS interfaces
一个工作流管理系统以流程定义作为输入。在这里,可以将流程定义看作UML活动图、UML状态图或者有限状态机。在提交一张费用单据、申请休假、要求一个报价、...之后,工作流系统负责维护这些流程定义的执行状态和上下文。为此,需要通知工作流系统状态的变化。运行流程的状态变化可以记录下来,以备监控管理。
Figure 2: Interfaces of a WFMS
定义 工作流系统的定义接口使流程开发人员能够部署流程定义。注意,这里的“流程开发人员”可以是业务分析师和软件开发人员的组合。 圈套(Pitfall)
许多工作流管理系统的开发商想使你相信,通过使用他们的图形化流程开发工具,只要业务分析师就可以生成流程定义。这种幻想源于“编程很难”这样的事实。开发商的销售人员喜欢说“看,你不用写一行代码”。不用写代码是好事,可大部分开发商在这点上走的太远,忽略了在某些场合提供一种将代码集成到流程定义中的机制是很适合的。在将工作流系统作为EAI平台时,必须在流程中集成代码。开发流程定义需要业务分析师和软件开发人员的合作。一个好的图形流程设计工具应该能够支持这种合作。
执行 执行接口使用户和系统可以操作流程实例。流程实例是流程定义的执行。流程定义的控制流通过状态机描述。执行接口的两个主要方法是启动一个流程实例和通知工作流系统一个状态结束了。
应用 应用接口代表了由工作流系统发起的工作流系统和外部系统之间的交互。当一个用户或系统操作一个流程实例的运行时,会生成一些事件(如一个迁移的执行)。流程定义中可以指定一段响应一个事件的可执行代码逻辑,这段代码和组织内外部的其他系统打交道。
监控 管理人员通过监控接口获得流程运行的确切数据。有时,运行日志也可用于审计。
这些是WfMC参考模型(reference model of the WfMC )中定义的五个接口中的四个。
流程定义的四个层次
在下面这部分,我尝试回答这样的问题“什么是流程定义包括的内容?”。这是从各种规范和工具所使用模型的原则和概念中总结得来的,反映了大部分模型中通用的基本思想。流程定义的内容可以分为四个不同的层次:状态(state)、上下文(context)、程序逻辑(programming logic)和用户界面(UI)。
状态层
所有状态和控制流的表述,都属于业务流程的状态层。标准编程语言中的控制流来源于Von Neuman体系。控制流定义了必须被执行的指令的顺序,控制流由我们书写的命令、if语句、循环语句等确定。在业务流程中的控制流基本与此一致。但在业务流程中不是使用命令而是使用状态作为基本元素。
在流程中,状态 (或者说等待状态)代表了一种对外部参与者(actor)的依赖。状态的意思就像“现在X系统或某某人必须作某些事,在此等待直到参与者通知这些任务已完成”。状态定义了一种对外部提供结果的依赖。状态典型的例子是批准步骤(step)。
流程定义中的状态也指定了执行依赖于哪个参与者。在活动图中,泳道(swimlanes)的标注代表这些参与者的名字。工作流系统使用这些信息构建任务列表,这是一般工作流系统都有的功能。如前所述,参与者可以是人也可以是系统。对于需要人参与的状态,工作流系统必须在运行时计算出具体的个人。这样的计算使工作流系统必须依赖于组织结构信息。关于这方面的一篇非常有趣的文章是在 further reading section 提到的“工作流应用中的组织管理”( 'Organizational Management in Workflow Applications')。
流程定义的控制流包含一组状态和它们之间的关系。状态之间的逻辑关系描述了哪些执行路径可以同时执行,那些不可以。同步执行路径用分叉(forks)和联合(joins)建模,异步执行路径用判断(decisions)和合并( merges)建模。注意在大多数模型中,在每个状态之前都有一个隐式合并。
UML活动图经常被用来做业务流程建模。作为一种直观和通用的表达,活动图在图形表述上有一个主要问题,就是没有区分状态和动作,它们都用活动来表示。缺少这种区分(导致状态概念的缺失)是学术派对UML活动图的主要批评。UML活动图的第二个问题是在UML2.0版中引入的。当多个迁移(transitions)到达一个活动时,以前的版本规定这是一个缺省合并(merge),在2.0版中规定这是一个需要同步的缺省联合(join)。在我看来,UML活动图的图形部分仍旧可以用来对业务流程状态层次建模,只要使用时对两条构建语义作如下的变化:
在用图形表述业务流程时,只建模状态层(状态和控制流),不要包括动作。这意味着图形中的矩形都是状态而不是活动
如果多个迁移到达一个状态,缺省定义为不需要同步的合并(merges)
在流程运行过程中,工作流系统用一个令牌(token)作为指针跟踪流程的状态。这相当于Von Neuman体系中的程序计数器。当令牌到达一个状态时,它被分配给工作流系统等待的外部参与者。外部参与者可以是个人、组织或者计算机系统。我们定义流程运行的执行人或系统为“参与者”(actor)。只有在工作流系统将令牌分配给一个参与者时,才需要访问组织结构信息。工作流系统通过分配令牌构建任务列表。
上下文层
流程上下文变量(process context variable) ,或简称变量,是与流程实例相关的变量。流程开发人员可以使用流程变量存储跨越流程实例整个生命周期的数据。一些工作流管理系统有固定数目的数据类型,另一些你可以定义自己的数据类型。
注意变量也可以用来存放引用( references)。一个变量可以引用如数据库中的记录、网络上的文件。什么时候使用引用,取决于使用引用数据的其他应用。
和流程变量相关的另一个令人感兴趣的方面是:工作流系统如何将数据转化为信息。工作流是用于组织内部跨越各种异构系统实现任务和数据协同的。对于业务流程中人工执行的任务,工作流系统负责从其他相关系统,如SAP、数据库、CRM系统、文档管理系统收集数据。在业务流程的每一个人工步骤,只有相关联的数据项被从异构系统中收集和计算。通过这种方式,从不同系统来的数据被转换并展现为信息。
程序逻辑层
如前所述,动作是在流程运行过程中,工作流系统响应指定的事件(event)执行的一段程序逻辑(programming logic)。程序逻辑可以是二进制或源代码形式的、用任何语言或脚本编写的软件。程序逻辑层是所有这些软件片断和关于在什么事件发生时调用它们的信息的组合。程序逻辑的例子包括发Email、通过消息代理发消息、从ERP系统中拿数据和更新数据库。
用户界面层
一个参与者通过向流程变量中填充数据的事件,来触发结束一个状态。比如,在请假的例子中,老板提供“同意”或“不同意”数据到流程中。某些工作流系统允许指定哪些数据可以填充到流程中,以及它们如何在流程变量中存储。通过这些信息,可以生成从用户收集信息的UI表单。基于流程定义生成用户提交表单的Web应用例子,可以访问 the jBpm online demo 。
工作流全景
可执行流程与工作流管理系统的比较(Executional processes versus a WFMS)
当前在BPM领域中,关于可执行业务流程的规范有趋向于统一集中的趋势。 XLANG, WSFL 和BPML合并为基于交互(消息交换)的BPEL。BPEL在面向服务体系结构(SOA)的大背景下定义。它的前提条件之一是涉及的服务必须用WSDL声明。BPEL规定了一套XML语法,这套语法可以看作一种编程语言,用来描述包括对WSDL定义的服务调用的控制流。
在可执行业务流程和基于状态的工作流管理系统所使用的方法中,我注意到了三点主要的区别:
基于状态与面向消息:基于状态的工作流系统以状态(或者活动)概念为中心。工作流引擎维护状态并计算从一个状态到另一个状态的迁移。另一方面,像BPEL这样的可执行流程以对输入消息响应的定义为中心。一组这些响应外加其他信息(other bells and whistles)可以看作一个业务流程。这也解释了为什么BPEL可以看作是对基于状态的工作流系统的某些方面的补充。一个响应输入消息的BPEL onMessage事件处理器,可以在工作流状态之间的迁移中执行。
流程实例ID与消息相关处理:可执行业务流程的复杂性之一来自消息相关性的处理。流程描述的一部分必须说明BPEL引擎如何从输入消息中确定具体流程的标识。这必须基于输入消息的一个数据项。而工作流系统在每个流程实例生成同时生成了实例ID,客户端在后续调用引擎API时使用这个ID。
工作流引擎API与抽象服务端点(endpoint):工作流系统提供一组集中的API,客户端通过调用API完成与所有流程实例的交互。在可执行业务流程中,每个流程表现为一个服务。这意味着对于每个流程定义都有一个不同的访问点。