flowアクティビティ内のアクティビティ実行の同期化

flowアクティビティ内のアクティビティの実行を同期化すると、他のアクティビティが完了した後にのみ特定のアクティビティを実行できるようになります。たとえば、invokeアクティビティverifyFlightがあり、flowの開始時に他のinvokeアクティビティ(verifyHotelverifyCarRentalおよびscheduleFlight)と並行して実行されると仮定します。ただし、フライトのスケジュールが必要なのは、フライトが使用可能であることを確認した後のみです。したがって、verifyFlight invokeアクティビティとscheduleFlight invokeアクティビティの間にリンクを追加できます。このリンクにより、リンクのターゲットであるアクティビティ(scheduleFlight)は、リンクのソースであるアクティビティ(verifyFlight)が完了した場合のみ実行されることを示す、依存関係のレベルが指定されます。

次の例に詳細を示します。リンク名verifyFlight-To-scheduleFlightは、ソースverifyFlight invokeアクティビティおよびターゲットscheduleFlight invokeアクティビティに割り当てられます。ソースverifyFlightの実行が完了した後、ターゲットscheduleFlightが実行されます。

<flow ...>
   <links>
      <link name="verifyFlight-To-scheduleFlight" />
   </links>
   <documentation>
      Verify the availability of a flight, hotel, and rental car in parallel
   </documentation>
   <invoke name="verifyFlight" ...>
      <sources>
         <source linkName="verifyFlight-To-scheduleFlight" />
      </sources>
   </invoke>
   <invoke name="verifyHotel" ... />
   <invoke name="verifyCarRental" ... />
   <invoke name="scheduleFlight" ...>
      <targets>
         <target linkName="verifyFlight-To-scheduleFlight" />
      </targets>
   </invoke>
</flow>

前の例は、BPELバージョン2.0におけるリンク構文の例を示しています。BPELバージョン1.1とBPELバージョン2.0では、リンク構文が若干異なります。

  • BPELバージョン1.1では、<target><source>を使用します。

  • BPELバージョン2.0では、<targets><sources>を使用します。

表10-1に詳細を示します。

表10-1 BPELバージョン1.1とBPELバージョン2.0のリンク構文

BPELバージョン1.1の例 BPELバージョン2.0の例
<flow>
   <links>
     <link name="XtoY"/>
     <link name="CtoD"/>
   </links>
   <sequence name="X">
      <source linkName="XtoY"/>
      <invoke name="A" .../>
      <invoke name="B" .../>
   </sequence>
   <sequence name"Y">
      <target linkName="XtoY"/>
      <receive name="C" ...>
         <source linkName="CtoD"/>
      </receive>
      <invoke name="E" .../>
   </sequence>
   <invoke partnerLink="D" ...>
     <target linkName="CtoD"/>
   </invoke>
 </flow>
<flow>
      <links>
        <link name="AtoB"/>
      </links>
      <assign name="B">
        <targets>
          <target linkName="AtoB"/>
        </targets>
        <copy>
          <from>concat($output.payload,
            'B')</from>
          <to>$output.payload</to>
        </copy>
      </assign>
      <assign name="A">
        <sources>
          <source linkName="AtoB"/>
        </sources>
        <copy>
          <from>concat($output.payload,
           'A')</from>
          <to>$output.payload</to>
        </copy>
      </assign>
    </flow>