例: イベント順序付け

イベント順序付けの仕組みを理解するために、ソース・アプリケーション (コンポーネント A) が ターゲット・アプリケーション (コンポーネント B) を非同期的に呼び出して 新規オーダーを作成した後、変更後のデータでそれらのオーダーを 更新する場合について考えます。

コンポーネント A はコンポーネント B を検索し、Order ビジネス・オブジェクトを 使用することによって create メソッドを呼び出してオーダーを作成します。Order ビジネス・オブジェクトは 以下の属性を持ちます。
属性 タイプ
ID string
customer string
productName string
quantity integer
コンポーネント A は次に update メソッドを呼び出し、 新しく作成したオーダーのデータを更新します。
この例では、コンポーネント A からコンポーネント B に 以下の順序で 5 つのイベントが送信されたと想定します。

イベントごとに、メッセージは、呼び出しと同じ順序で サービス統合バス宛先に格納されます。メッセージ駆動型 Bean (MDB) がメッセージを読み取り、ターゲット・コンポーネント (この場合はコンポーネント B) に 送信して処理させます。モジュールごとの MDB の数は 1 個だけですが、 その MDB の複数のインスタンスが存在し、これら 5 つのメッセージは 並列に処理されます。Update2 に対するメッセージを 処理している MDB スレッドが、Create1 イベントに対するメッセージを処理している スレッドより先に完了する可能性があります。その場合にはオーダーが まだ作成されていないため、Update2 イベントは失敗します。

このようなエラーを防ぐために、この例ではイベント順序付けを 実装しています。下記のコンポーネント定義の例では、create メソッドと update メソッドの両方に イベント順序付け修飾子を指定しています。 これらのメソッドはいずれも同じイベント順序付けキー (Order ビジネス・オブジェクトの ID 属性に 設定されます) を使用し、同じイベント順序付けグループに 置かれます。3 番目のメソッド (retrieve) は順序付けしていません。

<interfaces>
   <interface xsi:type="wsdl:WSDLPortType" portType="ns1:ProcessOrder">
      <method name="create">
         <scdl:interfaceQualifier xsi:type="es.EventSequencingQualifier">
         <es:eventSequencing sequencingGroup="default" conintueOnError="true">
            <keySpecification>
               <parameter name="Order">
                  <xpath>ID</xpath>
               </parameter>
            </keySpecification>
         </es:eventSequencing>
         </scdl:interfaceQualifier>
      </method>
      <method name="update"/>
         <scdl:interfaceQualifier xsi:type="es:EventSequencingQualifier">
         <es.eventSequencing sequencingGroup="default' continueOnError="true">
            <keySpecification>
               <parameter name="Order">
                  <xpath>ID</xpath>
               </parameter>
            </keySpecification>
         </es:eventSequencing>
         </scdl:interfaceQualifier>
      <method name="retrieve/">
   </interface>
</interfaces>    
イベント順序付けを使用可能にすると、この例の 5 つのイベントは 以下のように処理されます。
  1. コンポーネント A が Create1 要求を送信します。これは宛先に置かれ、MDB の インスタンスによって処理されます。
  2. Create1 イベントがロックを獲得し、コンポーネント B に送信して処理させます。
  3. コンポーネント A が Update1 要求を送信します。これは宛先に置かれ、MDB の インスタンスによって処理されます。
  4. Update1 イベントがロックを獲得しようとします。Create1 イベント (Update1 と 同じイベント順序付けキー値を共用) がまだロックを持っている場合は、Create1 に対する ロックが解放されるまで、このイベントの処理は中断されます。
  5. コンポーネント A が Create2 要求を送信します。これは宛先に置かれ、MDB の インスタンスによって処理されます。
  6. Create2 要求 (イベント順序付けキーの値が異なる) がロックを獲得し、 コンポーネント B に送信して処理させます。
  7. コンポーネント A が Update2 要求を送信します。これは宛先に置かれ、MDB の インスタンスによって処理されます。
  8. Update2 イベントがロックを獲得しようとします。Create1 イベントまたは Update1 イベントの いずれか (Update2 と同じイベント順序付けキー値を共用) がまだロックを保持している場合は、 このイベントの処理は中断されます。Update1 イベントが ロックを獲得して処理され、ロックが解放されるまで 処理は行われません。
  9. コンポーネント A が Update3 要求を送信します。Create2 イベント (Update3 と 同じイベント順序付けキー値を共用) がまだロックを持っている場合は、Create2 に対する ロックが解放されるまで、このイベントの処理は中断されます。
関連概念
イベントの順次処理

(c) Copyright IBM Corporation 2005, 2006. All rights reserved.
(c) Copyright IBM Japan 2006
このインフォメーション・センターでは、Eclipse テクノロジー (http://www.eclipse.org) が採用されています。