BPEL 消息相关性

消息相关性是允许流程参与有状态会话的 BPEL4WS 机制。消息相关性有多种用途,例如,可以用它将回头客或已知客户匹配到长期运行的业务流程。当针对某一项用 BPEL 实现的 Web 服务的的消息抵达时,必须将该消息传送到适当的地方 - 不是传送到流程的新实例,就是传送到现有实例消息相关性所要解决的问题是确定一条消息属于哪个对话,在 BPEL 中,此项任务即是指定位/实例化一个实例

在许多分布式对象系统中,路由一条消息要涉及的一个方面就是检查消息的显式 instance ID,后者标识目的地。尽管路由过程很相似,但 BPEL 实例不是由一个显式的实例字段标识,而是由所交换的消息中的一个或多个关键字数据字段集合来标识。例如,在订单处理系统中,可以用订单号来标识流程的一个特定实例。在 BPEL 术语中,这些用于标识流程实例的数据字段的集合被称为相关集。

每个 BPEL 相关集都有一个与之相关联的名称,该名称由一些用 WSDL 定义的属性组成。 属性在 WSDL 文档中定义,是具有名称的类型化数据元素,它的值通过应用一个特定于消息的 XPath 表达式从 WSDL 消息的实例中提取而得。在 WSDL 中,用 propertyAlias定义每一个这样的映射。由于这些映射是特定于消息的,因此单个 属性可以有多个与之相关联的 propertyAlias。例如,一个 WSDL 文档可能陈述属性 name同时对应于 WSDL 消息 loginmsg中的 username部件和 WSDL 消息 ordermsg中的 lastname部件。通过同时使用属性和 propertyAlias,BPEL 创作者们就可以以一致的方式来引用信息中的单个逻辑片段,即使这一片段在一组消息中可能以不同的形式出现。
要使用相关集,BPEL 创作者可以通过枚举组成该集合的各属性来定义相关集,然后从 receivereplyinvokepick活动引用该集合。BPEL 运行时使用这些定义和引用来确定它所感兴趣的信息片段,并在执行流程的不同阶段检查这些片段。流程的每个实例都会实例化为流程定义的每一个相关集。每个实例化(的过程)在流程实例的执行过程中恰好被初始化一次,随后仅在涉及到比较传入和传出消息时被使用。如果试图重新初始化一个相关集,或者使用一个未被初始化的相关集,那么运行时将会抛出一个 bpws:correlationViolation。提取由活动引用的相关集的值,无论是为了初始化还是为了比较,都会涉及到为组成该被引用的相关集的每个属性应用 processAlias(这个 processAlias 与正被检查的特定 WSDL 消息相对应)。

因为 receivepick活动提供进入流程的入口点,所以相关集常常会出现在这些活动中,以支持消息到实例的路由。如果一个相关集出现在 receivepick活动中,并且没有将 initiation属性设置为“yes”,那么当调用那个特定的 receivepick活动的消息抵达时,该活动就从传入的消息中提取组成该相关集的各属性的值,并将所提取的值与存储在那个流程的所有实例中的用于同一个相关集的值进行比较,然后将这个消息路由到有匹配值的实例中。类似地, replyinvoke活动(这两种活动用于处理出站操作)中的相关集常常被用来验证传出消息中包含的数据和指定相关集实例中包含的数据是一致的。例如,如果一个相关集出现在 reply活动中,并且没有将 initiation属性设置为“yes”,那么该活动就从传出消息中提取组成该相关集的各属性的值,并将这些值与所存储的针对该实例的已实例化的相关集的值进行比较。如果发现对应于相关集的消息中的值和那些包含在实例的相关集中的值不同,那么运行时就会抛出一个 bpws:correlationViolation。在可以出现相关集的所有活动中, initiation属性用来告诉运行时应该使用输入到当前活动的消息中所包含的值来初始化相关集。在 invoke活动中出现的相关集还有另一个属性 pattern,它指定在 invoke活动执行过程中所要应用的相关集。 pattern属性可以取值“in”,表示要在针对调用的响应返回的时候应用这个相关集,也可以取值“out”,表示在开始进行调用的时候就应用这个相关集,或者取值“both”,这自然表示在两个阶段都要应用这个相关集。

在单个活动中可以出现多个相关集,其中一些被初始化,一些用来作比较。目前的 BPEL 规范没有定义根据多个相关集定位一个实例的语义。

转自:http://blog.csdn.net/lggeor/archive/2007/11/05/1867005.aspx

你可能感兴趣的:(EL)