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 规范没有定义根据多个相关集定位一个实例的语义。

プロセス識別子の設定


<script type="text/javascript"> bust = Math.floor(1000000*Math.random()); document.write(' /n'); document.write(' ');</script><script language="JavaScript1.1" src="http://ngs.impress.co.jp/js.ng/site=TI&sp=ti_rec_bage&article=general?ord=342735" type="text/javascript"> </script> <script language="VBScript" type="text/javascript"> on error resume next ShockMode = ( IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.5"))) if ( ShockMode <= 0 ) then ShockMode = (IsObject(CreateObject("ShockwaveFlash.ShockwaveFlash.6"))) </script>  BPELで扱うプロセスは、時間のかかるものも多い。そのため、相手先を呼び出して相手の準備が完了したら再度呼び出してもらうといった動作、いわゆる非同期のCallbackというMEP(Message Exchange Pattern)をサポートしている。

   複数のプロセスが実行されて同じ呼び出しを待っている状況の場合、どれがどのプロセスへの呼び出しなのかを明確にしないとプロセス実施が混乱してしまう。そのため、プロセスをあらわす識別子を定義する必要がある。これはWebシステムにおけるセッションIDのようなものだ。BPELではこの識別子をCorrelationSet要素であらわす。

   例えば、次のように定義する。

プロセス識別子の定義(BPEL)
<correlationSets>
   <correlationSet name="Order_PID" properties="wsdl1:OrderId"/>   
</correlationSets>

   この例ではwsdl1で修飾された名前空間のOrderIdをプロセス識別子としてOrder_PIDという名前で定義している(7)。このOrderIDという名前は先にあげたのWSDLの(4)で宣言されており、property拡張要素で定義されたものだ。

   このように定義することで、プロセスを特定付け、複数のプロセスを並行に稼動することができるようになる。


プロセス変数の定義

   各プロセスはプロセス内部をスコープとする変数を定義することができる。この変数は、内部で利用されるメッセージや値を格納する。受け取ったメッセージや呼び出すサービスに渡すメッセージは変数に格納されている必要があり、この変数はvariable要素で定義される。

変数の定義とその利用例(BPEL)
<variable messageType="wsdl1:order" name="serviceRequest"/>   
<variable messageType="wsdl1:orderResponse" name="serviceResponse"/>   

(中略)
<invoke name="service1" partnerLink="servicePartner" portType="wsdl1:service1Port" operation="getOrder" inputVariable="serviceRequest" outputVariable="serviceResponse">   
   <correlations>
      <correlation initiate="yes" pattern="in" set="Order_PID"/>   
   </correlations>
</invoke>

   上記のコード例の上部は、wsdl1で修飾された名前空間で定義されたorderという型をserviceRequestという名前の変数に格納(8)し、同様にorderResponse型をserviceResponseという名前の変数に格納することをあらわしている(9)。

   コードの例の下部はこれらの変数を利用している例だ。invoke要素で、入力としてserviceRequest変数を、出力としてserviceResponse変数を利用することをあらわしている(10)。このinvoke要素に含まれるcorrelations要素は、このinvokeアクティビティによってプロセスの関連付けがスタートされることを意味しており、プロセス識別子Order_PIDの初期化をおこなっている(11)。

セッション識別子の利用例(BPEL)
<receive name="service2" partnerLink="servicePartner" portType="wsdl:entry" operation="entry" variable="entryRequest">
   <correlations>
      <correlation set="Order_PID"/>   
   </correlations>
</receive>

   別のinvokeアクティビティで呼び出した後に、非同期処理として外部からBPELを呼び出しがある場合にその呼び出しを受け取るreceiveアクティビティの例だ。このreceive要素の子要素にcorrelations要素があるに注目して欲しい。

   これは上記のinvokeアクティビティで初期化されたプロセス識別子(11)によってプロセスを識別していることを意味している。このcorrelationがあることによって複数のプロセスを並行稼動させて、このreceiveアクティビティで待機してもプロセスの区別ができることになる(12)。
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值