文章
架构师:SOA
将 BPMN 转换为 BPEL:原因和方法将 BPMN 模型转换为可执行的 BPEL 流程时,牢记 BPMN 和 BPEL 之间的语义差异很重要。 作者:Lonneke Dikmans 2008 年 9 月发布 收购 BEA 后,多个新产品加入到了已经存在的 Oracle 业务流程管理 (BPM) 产品系列的 Oracle 业务流程分析套件中。这些新工具现在统称为 Oracle 业务流程管理套件(包括 Oracle Business Process Management Studio,之前称为 BEA AquaLogic Business Process Management Studio),是 Oracle WebLogic 套件的一个选件。 Oracle 业务流程分析套件是新的 Oracle 业务流程管理套件的补充,可用于采用业务流程建模标注 (BPMN) 形式对组织的业务体系结构进行建模。使用 Oracle 业务流程分析套件对业务流程进行建模的优势之一是,可以重用这些说明作为可执行的业务流程执行语言 (BPEL) 流程的蓝图。 但是,您需要了解 BPMN 和 BPEL 之间的一些差异。第一,BPMN 和 BPEL 在 BPM 的生命周期中的应用阶段不同。BPMN 在设计和改进业务流程时使用,而 BPEL 则用于实施。不同的阶段有不同的需求。第二,BPMN 由业务分析人员使用,而 BPEL 由技术分析人员和编程人员使用。他们使用不同的范例,对流程进行建模时关注的问题也各不相同。 在本文中,将通过一个示例进一步说明和阐释 BPMN 和 BPEL 以及这两种语言间的差异。 前提条件:
业务流程管理的生命周期BPM 是基于业务流程建模流程图的符号,于 2006 年 2 月成为 OMG 最终采用的标准。它涵盖了组织执行的从管理到改进业务流程(如果需要)的各种活动。Oracle 有不同的工具支持 BPM 生命周期中的各种活动:
那么,为什么不能使用 BPEL 设计流程呢?BPEL 是一种执行语言,如果用于供业务分析人员来捕获或设计业务流程则显得过于琐碎和专业化。意识到这点后,BPMN 规范委员会试图使用 BPMN 达到两个目标:
他们成功实现了这两个目标。业务分析人员可以很轻松地掌握 BPMN,市场上也有很多软件可以将 BPMN 转换为 BPEL。但是在将 BPMN 流程转换为 BPEL 时还有一些问题。导致这些问题的原因各不相同。下面我将主要介绍这两种建模语言并重点说明它们之间的差异。 了解 BPMNBPMN 中的业务流程图 (BPD) 包括流对象、连接对象、泳道和构件。规范定义了 BPD 的符号和语义。Oracle 业务流程分析套件并非完全符合 BPMN 标准。在本节中,我将更加详细地描述这些元素,并讨论如何使用 Oracle 业务流程分析套件对该流程进行建模。 流对象有三种类型的流对象:活动、事件和网关。 活动活动是在业务流程中执行的工作。有三种类型的活动:任务、循环活动和子流程。正如规范所描述的那样,子流程不出现在 Oracle 业务流程分析套件中,但可以通过编辑 BPMN 的属性在该套件中对子流程进行建模。循环活动亦是如此。
在不影响图表所占资源的情况下,供应商可以使用 BPMN 工具将标记或图标添加到任务中。在 Oracle 业务流程分析套件中,通过以下对象来表示任务:函数、自动化活动、通知、人工任务和业务规则函数。
事件事件是在业务流程中发生的事情。它通常由某件事情触发和/或产生某个结果。事件的类型取决于在业务流程中的位置。有三种类型的事件:起始事件、中间事件和结束事件。在 BPMN 中,可以使用属性对话框对触发器和结果进行建模。 网关网关是最后一类流对象。网关有不同的类型。它们合并或分散流程。如果不需要控制流,那网关也无需存在。在 Oracle 业务流程分析套件中,可以建模 XOR(异或)网关(基于数据和基于事件)、OR、AND 和复杂的网关。 连接对象连接对象可以是顺序流(连接两个活动的连接器)、消息流或关联流。 泳道BPMN 中有两种类型的泳道:池和道。池用来标记组织的边界。池之间通过消息流交互。禁止顺序流跨越池边界。这意味着流程总是完全包含在池中。可以用道来分割池 — 例如,在组织内标记不同的组织角色。顺序流可以跨越道。 构件BPMN 中的最后一类对象是构件。有三种类型的构件:数据对象、组和注释。Oracle 业务流程分析套件不支持注释和组。数据对象有多种类型:person 类型函数、数据集群等。 BMPN 示例了解了 BPD 上可能出现的对象后,我们从一个示例开始。在本例中,我们对将一篇文章发表到 Oracle 技术网 (OTN) 的部分流程建模。 摘要获得批准后,流程开始。将其建模为附有消息的起始事件。在 BPMN 属性触发器/结果中选择 Message 时,会出现标记器。 文章已写好并提交给编辑。构件文章用于描述信息载体。然后,作者等待审查结果。收到带有审阅意见的文章后,作者查看意见。根据结果的不同,流程结束或文章得到编辑后重新提交给编辑。该建模过程通过“异或数据”网关和一个流 回 到“编辑文章”的顺序流来完成。文章发表后,流程结束。
如您所见,这里有三个事件:起始事件、中间事件和结束事件。此处的网关类型是“异或”。有三个活动,均为任务。所有的流对象均使用顺序流相连。有两个构件:发送到 OTN 的文章和发送到作者的审阅意见。使用关联将它们连接到任务。 通常在流程模型中要识别不同级别的抽象。最详细的流程包含将流程链接到 IT 系统的信息;抽象程度高的模型则不包含。 这些流程模型的目标是虚拟化组织中的业务流程。这些模型可用于不同的目标:使用 IT 服务实现流程自动化以支持并改进流程,为雇员撰写说明,向审计人员彰显合规性以及洞察业务。在本文中,您将使用模型自动化并监视流程。要达此目的,需要将模型转换为可执行语言 BPEL。进行此操作前,需要创建一个流程变量,附有转换任务所需的实施细节。将人工任务“撰写文章”和“审阅修改”创建为活动。这样,我们可以监视最终期限并跟踪状态。将“提交文章”转换为通知。
BPELBPEL 包括基本活动和结构化活动、变量、合作伙伴链接以及处理程序。它使用 XML 来描述这些事物。Oracle SOA 套件 10g 支持 BPEL 1.0。此外,Oracle 添加了规范中没有的扩展功能。最新的规范是最终的 BPEL 2.0 规范;可以在 OASIS 站点上查到。 活动 变量
可以在流程开始时(全局变量)或在某个作用域内声明变量。 合作伙伴链接 处理程序 BPEL 示例
<!-- HelloWorld BPEL Process -->
<process name="HelloWorld"
targetNamespace="http://samples.otn.com/helloworld"
suppressJoinFailure="yes"
xmlns:tns="http://samples.otn.com/helloworld"
xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
>
<!-- List of services participating in this BPEL process -->
<partnerLinks>
<!--
The 'client' role represents the requester of this service. It is
used for callback. The location and correlation information associated
with the client role are automatically set using WS-Addressing.
-->
<partnerLink name="client"
partnerLinkType="tns:HelloWorld"
myRole="HelloWorldProvider"
partnerRole="HelloWorldRequester"
/>
</partnerLinks>
<!-- List of messages and XML documents used as part of this
BPEL process
-->
<variables>
<!-- Reference to the message passed as input during initiation -->
<variable name="input"
messageType="tns:HelloWorldRequestMessage"/>
<!-- Reference to the message that will be sent back to the
requestor during callback
-->
<variable name="output"
messageType="tns:HelloWorldResultMessage"/>
</variables>
<!-- Orchestration Logic -->
<sequence>
<!-- Receive input from requestor.
Note:This maps to operation defined in HelloWorld.wsdl
-->
<receive name="receiveInput" partnerLink="client"
portType="tns:HelloWorld"
operation="initiate" variable="input"
createInstance="yes"/>
<!-- Generate content of output message based on the content of the
input message.
-->
<assign>
<copy>
<from expression="concat('Hello ',bpws:getVariableData('input', 'payload','/tns:name'))"/>
<to variable="output" part="payload" query="/tns:result"/>
</copy>
</assign>
<!-- Asynchronous callback to the requester.
Note:the callback location and correlation id is transparently handled
using WS-addressing.
-->
<invoke name="replyOutput"
partnerLink="client"
portType="tns:HelloWorldCallback"
operation="onResult"
inputVariable="output"
/>
</sequence>
</process>
如您所见,这是个异步的 BPEL 流程接收存储在变量“input”中的消息。然后,该流程将“Hello”和消息负载的连接结果分配给变量“output”。 然后将其通过 invoke 活动返回给请求方。 本例中有一个合作伙伴链接:调用流程的同一客户端接收响应。 BPEL 没有 Goto现在,我们已经对两种语言都进行了讨论,下面将重点讨论从 BPMN 向 BPEL 的转换。 Oracle 业务流程分析套件在从 BPMN 图表生成 BPEL 流程时通常会使用以下映射:
BPMN 规范在附录 A 中对该映射进行了详细解释。这个映射不完整,所以不同的工具运用的转换规则不同也就不足为奇。 示例应用程序要使用 Oracle JDeveloper 和 Oracle 业务流程分析套件对此进行测试,首先将 SOA 配置文件导入 Oracle 业务流程分析套件,然后将 BPMN 图表转换为 BPEL。然后,转到 Oracle JDeveloper,为 Oracle JDeveloper 安装 Oracle 业务流程分析套件插件,并根据蓝图启动一个项目。我们将使用上一段中的流程示例。首先,向流程中添加一些细节。决定实施流程后,需要确定哪些活动是自动化活动,哪些活动是人工任务,哪些消息需要交换等。
现在 Oracle JDeveloper 中已经有框架 BPEL 流程了。开发人员向该流程中添加实施细节。模型结构受到保护:开发人员可以在现有的作用域之间添加新的作用域,但不能删除任何现有的作用域。可以从 Oracle JDeveloper 导入新版的 BPMN 模型。 通过 Oracle JDeveloper 进行的流程更改在通过 Oracle JDeveloper 上载后,在 Oracle 业务流程分析套件中显示并视为改进建议。在 Oracle 业务流程分析套件的 explorer 视图中可以找到它们。 处理不兼容的流程在尝试将有效的 BPMN 模型转换为 BPEL 流程和发生错误时,这是常见的故障。通常在两个或两个以上的活动流 回 到前一个活动时发生。原因是 BPMN 支持任意循环,而 BPEL 仅支持结构化循环,即一个入口点和一个出口点 (while)。 假设流程发生变化,需要扩展我们的示例:如果提交没有修订的文章,则无需将修改意见发送给作者就可立即发表。流程如下:
如果验证该业务流程,Oracle 业务流程分析套件会通知您这个 BPMN 图表是有效的。但当您将其转换为 BPEL 流程时,收到如下错误:
如您所见,是个语义错误:这是有效的 BPMN,但却无法转换成 [ Q:“into”?]BPEL。图表显示在撰写文章活动上出现一个错误:
有多个方案可以解决此问题。通常,解决该问题的最佳方法是从流程中去除一般化。在 IT 系统中进行的一般化不属于业务流程。例如,在业务流程中,首次(撰写并提交文章)和后续操作是有区别的。虽然无法避免首次编辑和审阅,但此后的编辑操作应该尽可能少。因此,我们创建了新的活动(称为修改文章),来代替编辑文章。在 IT 系统中执行这些活动时,我们显然希望复用组件和服务。我们还添加了一个事件来表明我们期待修改或出版消息。最终,我们还更改了审阅流:即使作者同意编辑所做的所有修改,也需要明确地批准更改。总的说来,模型变更如下:
这个流程流还相对容易理解。现在可以生成蓝图并在 Oracle JDeveloper 中进行编辑。最终的 BPEL 有点复杂。需要注意的是:BPMN 图表中的流和循环越多,在对应 BPEL 中的差异就越多。也可以用本质上为纯技术的分配和复制操作来扩展 BPEL 模型。模型的形状各异导致开发人员和企业之间的交流变得更加困难,也加深了解决问题、添加特性和改进业务流程的难度。这是在 Oracle 业务流程分析套件中设计流程时需要考虑的问题。以块的形式和不同的抽象级别组织流程可以显著减少 BPMN 和 BPEL 之间的差异。 结论本文介绍了在 Oracle 业务流程分析套件中通过生成蓝图将 BPMN 模型转换为可执行的 BPEL 流程的方法。使用这个方法时,务必牢记 BPMN 和 BPEL 之间的语义差别。一般化仅限于技术模型:BPEL 和服务。这使得流程更易于更改和转换为 BPEL。 阅读更多内容:
Lonneke Dikmans 是 Oracle ACE 总监,在一家专门从事 SOA 和 BI 的荷兰 IT 公司 Approach Alliance 管理合作伙伴。 |
||||||||||||||||||||||||||||||||||||||||||||||