ヘッダーをスキップ
Oracle Fusion Middleware Oracle SOA Suite開発者ガイド
11g リリース1(11.1.1)
B56238-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

20 Oracle Mediatorルーティング・ルールの作成

この章では、ルーティング・ルールの概要およびOracle Mediatorサービス・コンポーネントに対してルーティング・ルールを指定する方法を説明します。

項目は次のとおりです。

20.1 ルーティング・ルールの概要

Oracle Mediatorを使用すると、サービス・コンシューマとサービス・プロバイダの間でデータをルーティングできます。データはサービス間をフローするため、トランスフォーメーションが必要です。ルーティングとトランスフォーメーションの2つのタスクは、Oracle Mediatorの中核となる処理内容です。ルーティング・ルールにより、Oracle Mediatorで処理されたメッセージを次の宛先にどのように送信するかを指定できます。ルーティング・ルールは、Oracle Mediatorによるメッセージの送信先、メッセージの送信方法、およびターゲット・サービスへの送信前にメッセージ構造に加える必要がある変更の内容を指定します。

ルーティング・ルールには、次の2つのタイプがあります。

これらのルーティング・ルールの詳細は、第20.2.2項「静的ルーティング・ルールの作成方法」および第20.2.3項「動的ルーティング・ルールの作成方法」を参照してください。

20.2 ルーティング・ルールの定義

ルーティング・ルールは、インタフェースが定義されているOracle Mediatorにのみ定義できます。インタフェースの定義方法の詳細は、第19.3.1.2項「インタフェース定義を使用しないOracle Mediatorのインタフェースの定義方法」を参照してください。

20.2.1 「ルーティング・ルール」セクションの使用方法

「ルーティング・ルール」セクションを使用する手順は、次のとおりです。

ルーティング・ルールは、メディエータ・エディタの「ルーティング・ルール」セクションで定義できます。メディエータ・エディタには、次のいずれかの方法を使用してアクセスできます。

  • SOAコンポジット・エディタからアクセスする方法

    1. ルーティング・ルールを指定するOracle Mediatorを示すアイコンをダブルクリックします。

    2. 「ルーティング・ルール」セクションの横のプラス(+)アイコンをクリックします。

  • アプリケーション・ナビゲータからアクセスする方法

    1. 「アプリケーション・ナビゲータ」からSOAプロジェクトを開き、次に「SOAコンテンツ」フォルダを開きます。

    2. 「SOAコンテンツ」フォルダで、ルーティング・ルールを指定するOracle Mediatorファイルの名前をダブルクリックします。Oracle Mediatorファイルには、.mplan拡張子が付きます。

    3. 「ルーティング・ルール」セクションの横のプラス(+)アイコンをクリックします。

図20-1に、メディエータ・エディタの「ルーティング・ルール」セクションを示します。

図20-1 メディエータ・エディタ - 「ルーティング・ルール」セクション

図20-1の説明は次にあります。
「図20-1 メディエータ・エディタ - 「ルーティング・ルール」セクション」の説明

図20-2に、「ルーティング・ルール」セクションのアイコンの要約を示します。

図20-2 「ルーティング・ルール」セクションのアイコン

図20-2の説明は次にあります。
「図20-2 「ルーティング・ルール」セクションのアイコン」の説明

20.2.2 静的ルーティング・ルールの作成方法

静的ルーティング・ルールを構成するときは、次の詳細を指定できます。

20.2.2.1 Oracle Mediatorサービスまたはイベントの指定方法

Oracle Mediatorを作成した後は、そのOracle Mediatorをインバウンド・サービス操作またはイベント・サブスクリプションに関連付け、Oracle Mediatorのターゲットを指定します。ターゲットは、アウトバウンド・サービス操作またはイベントの公開です。ターゲットはOracle Mediatorがメッセージを送信する次のサービスまたはイベントを指定し、起動するサービス操作を指定します。サービスまたはイベントをターゲット・タイプとして指定できます。

ソース・メッセージは、トランスフォーメーション、検証、割当てまたは順序操作の実行後に、初期のコール元にエコーして戻すこともできます。エコーが同期、非同期のいずれで行われるかは、コール元のWSDLファイルによって決まります。エコー・オプションは、インバウンド・サービス操作に対してのみ使用可能で、イベント・サブスクリプションには使用できません。

エコー・オプションの目的は、Oracle Mediatorのすべての機能をコール可能なサービスとして公開することによって、他のサービスへのルーティングの必要性をなくすことです。たとえば、Oracle Mediatorをコールしてトランスフォーメーション、検証または割当てを実行した後、別の場所にルーティングすることなくアプリケーションにOracle Mediatorをエコーして戻すことができます。

1つのインバウンド操作またはイベントに複数のルーティングを指定できます。各ルーティングは、1つのターゲット・サービス起動またはイベントにマップされます。したがって、特定のターゲット・サービスに対して複数のサービス起動を指定したり、複数イベントを発生させるには、各ターゲットに1つのルーティング・ルールを指定する必要があります。たとえば、メッセージ・ペイロードについて、サービスに定義された次の操作から、ある操作を起動するとします。

  • insert

  • update

  • updateid

  • delete

各操作に1つずつ、4つのルーティングを作成する必要があります。その後、フィルタ式を指定する場合は、図20-3に示すように、メッセージ・ペイロードに基づいて各メッセージ・インスタンスに適用するターゲットおよび操作を指定できます。

図20-3 インバウンド操作に対する複数のルーティング

図20-3の説明は次にあります。
「図20-3 インバウンド操作に対する複数のルーティング」の説明

サービスを起動する手順は、次のとおりです。

  1. 「ルーティング・ルール」セクションで、「追加」をクリックします。

    図20-4に示すように、「ターゲット・タイプ」ダイアログが表示されます。

    図20-4 「ターゲット・タイプ」ダイアログ

    図20-4の説明は次にあります。
    「図20-4 「ターゲット・タイプ」ダイアログ」の説明

  2. 「サービス」をクリックします。

  3. 「ターゲット・サービス」ダイアログで、図20-5に示すように、サービスが提供する操作に移動し、選択します。

    図20-5 「ターゲット・サービス」ダイアログ

    図20-5の説明は次にあります。
    「図20-5 「ターゲット・サービス」ダイアログ」の説明


    注意:

    図20-5に示すように、サービスは複数の操作で構成できます。

  4. 「OK」をクリックします。

イベントを発生させる手順は、次のとおりです。

  1. 「ルーティング・ルール」セクションで、「追加」をクリックします。

    図20-4に示すように、「ターゲット・タイプ」ダイアログが表示されます。

  2. 「イベント」をクリックします。

    「イベント・チューザ」ダイアログが表示されます。

  3. 「イベント定義」フィールドの右側にある「検索」をクリックします。

    「SOAリソース・ブラウザ」ダイアログが表示されます。

  4. イベント・ファイルを1つ選択して、「OK」をクリックします。

    図20-6に示すように、選択したファイルに定義されているイベントが「イベント」フィールドに移入されます。

    図20-6 「イベント・チューザ」ダイアログ

    図20-6の説明は次にあります。
    「図20-6 「イベント・チューザ」ダイアログ」の説明

  5. イベントを選択します。

  6. 「OK」をクリックします。

サービスをエコーする手順は、次のとおりです。

  1. 「ルーティング・ルール」セクションで、「追加」をクリックします。

    図20-7に示すように、「ターゲット・タイプ」ダイアログが表示されます。

    図20-7 「ターゲット・タイプ」ダイアログ

    図20-7の説明は次にあります。
    「図20-7 「ターゲット・タイプ」ダイアログ」の説明

  2. 「エコー」をクリックします。

    図20-8に、同期エコーのルーティング・ルールを示します。


    注意:

    非同期エコーの場合は、戻りのアイコンが点線になります。

    図20-8 エコー操作をサポートするOracle Mediatorのサンプル

    図20-8の説明は次にあります。
    「図20-8 エコー操作をサポートするOracle Mediatorのサンプル」の説明

20.2.2.2 エコー・オプションの使用に関する注意事項

エコー・オプションには次の制限があります。

  • エコー・オプションは、Oracle Mediatorのインタフェースが、次のタイプのWSDLファイルの場合のみサポートされます。

    • リクエスト/リプライ

    • リクエスト/リプライ/フォルト

    • リクエスト/コールバック


    注意:

    エコー・オプションは、Oracle Mediatorインタフェースがリクエスト/リプライ/フォルト/コールバックのWSDLファイルの場合には使用できません。

  • エコー・オプションは、リクエスト/リプライおよびリクエスト/リプライ/フォルトのような同期操作で使用できます。


    注意:

    エコー・オプションを同期操作で使用できるのは、ルーティング・ルールが順次実行の場合のみです。これは、同期操作のOracle Mediatorでは、パラレルのルーティング・ルールはサポートされないためです。

  • 条件フィルタを設定している同期操作の場合は、フィルタ条件をfalseに設定していると、エコー・オプションではレスポンスがコール元に返されません。かわりに、nullレスポンスがコール元に返されます。

  • エコー・オプションを非同期操作で使用できるのは、Oracle Mediatorインタフェースにコールバック操作が指定されている場合のみです。この場合、エコーは別のスレッドで実行されます。


    注意:

    非同期のエコー・オプションを使用できるのは、ルーティング・ルールがパラレル実行の場合のみです。エコー・オプションを使用する場合、非同期操作のOracle Mediatorでは、順次実行のルーティング・ルールはサポートされません。

20.2.2.3 順次実行またはパラレル実行の指定方法

ルーティング・ルールの実行タイプを指定できます。ルーティング・ルール実行タイプには、パラレルまたは順次を指定できます。ルーティング・ルールの実行タイプを指定するには、「ルーティング・ルール」セクションで「順次」または「パラレル」の実行タイプを選択します。

順次ルーティング・ルールの基本原則

  • 順次実行では、ルーティングが評価され、アクションが順に実行されます。順次ルーティングは、コール元と同じスレッドとトランザクションで評価されます。

  • Oracle Mediatorは常に、受信メッセージを処理しているスレッドを介して伝播されたグローバル・トランザクションにOracle Mediator自体を登録します。たとえば、インバウンドJCAアダプタがOracle Mediatorを起動すると、そのOracle Mediatorは、JCAアダプタが開始したトランザクションにOracle Mediator自体を登録します。

  • Oracle Mediatorは、順次ルーティング・ルールの実行中に、ターゲット・コンポーネントと同じスレッドを介してトランザクションを伝播します。

  • 外部エンティティによって伝播されたトランザクションを、Oracle Mediatorがコミットまたはロールバックすることはありません。

  • Oracle Mediatorがトランザクションを管理するのは、スレッド起動Oracle Mediatorにアクティブなトランザクションが存在していない場合のみです。たとえば、Oracle MediatorがインバウンドSOAPサービスから起動された場合、そのOracle Mediatorはトランザクションを開始し、成功および失敗に応じてトランザクションをコミットまたはロールバックします。

パラレルのルーティング・ルールの基本原則

  • パラレル実行では、ルーティングはキューに入れられ別々のスレッドでパラレルに評価されます。

    パラレル処理の場合、各Oracle Mediatorサービス・コンポーネントのメッセージは、重み付けラウンド・ロビン方式で取得されます。これによって、すべてのOracle Mediatorサービス・コンポーネントが確実にパラレル処理サイクルを受け入れます。これは、1つ以上のOracle Mediatorサービス・コンポーネントで、他のコンポーネントよりも多くのメッセージが生成される場合でも同様です。使用される重み付けは、Oracle Mediatorサービス・コンポーネントの設計時に設定されたメッセージ優先度です。メッセージ優先度の高いコンポーネントほど、多数のパラレル処理サイクルが割り当てられます。

    Oracle Mediatorサービス・コンポーネントの優先度を設定するには、メディエータ・エディタで「優先度」ユーザー・インタフェース構成を使用します。優先度は0〜9まで設定でき、9が最高優先度です。デフォルトの優先度は4です。


    注意:

    「優先度」ユーザー・インタフェース構成の適用対象は、パラレルのルーティング・ルールのみです。

  • 各パラレル・ルールを処理するために、Oracle Mediatorによって新規トランザクションが開始されます。開始されたトランザクションは、Oracle Mediatorのパラレル・メッセージ・デハイドレーション・ストアへのエンキューで終了します。

    たとえば、Oracle Mediatorサービス・コンポーネントにパラレルのルーティング・ルールが1つある場合は、1つのメッセージがOracle Mediatorのパラレル・メッセージ・デハイドレーション・ストアにエンキューされます。次に、ストアに対するパラレル・メッセージ・ディスパッチャがトランザクションを開始し、データベース・ストアからメッセージを読み取り、このルーティング・ルールのターゲット・コンポーネントまたはサービスを起動します。リスナー・スレッドによって開始されるトランザクションは、完全に新規のトランザクションであり、ターゲット・コンポーネントに伝播されます。


    注意:

    メッセージのデハイドレーションは、後でワーカー・スレッドで処理できるように、受信メッセージをパラレルのルーティング・ルール用のデータベースに格納することを意味します。

  • パラレル実行では、Oracle Mediatorはトランザクションの開始元であるため、これらのトランザクションをコミットまたはロールバックします。

操作またはイベントに順次およびパラレルの両方のルーティング・ルールがある場合は、最初に順次ルーティング・ルールが評価されてアクションが実行され、次にパラレルのルーティングがパラレル実行のためにキューに入れられます。


注意:

リクエスト/レスポンス・インタフェースを使用するOracle Mediatorサービス・コンポーネントにパラレルのルーティング・ルールのみが設定されている場合、そのOracle Mediatorサービス・コンポーネントはコール元にレスポンスを返信しません。このタイプのOracle Mediatorサービス・コンポーネントは作成できますが、Oracle Mediatorサービス・コンポーネントのコール元が、実行時にレスポンスを取得することはありません。

20.2.2.4 レスポンス・メッセージの処理方法

レスポンス・メッセージを同期および非同期の相互作用内で処理する方法を指定できます。同期相互作用の場合は、レスポンスとフォルト・メッセージのトランスフォーメーションと割当てを指定できます。レスポンスとフォルト・メッセージを別のサービスまたはイベントに転送できます。あるいは、初期のコール元にレスポンスおよびフォルトを受信する用意がある場合は、それらを初期のコール元に戻すことができます。

非同期相互作用の場合は、レスポンスを受信するまでのタイムアウト時間を指定できます。タイムアウト時間は、秒、時、日、月または年で指定できます。タイムアウト時間のデフォルト値は無限です。コールバック・レスポンスが指定したタイムアウト時間内に返されない場合、タイムアウトしたレスポンスは別のサービス、別のイベントに転送されるか、初期のコール元に戻されます。

Oracle Mediatorのレスポンスを双方向サービスにルーティングすることはできません。レスポンスを双方向サービスにルーティングする場合は、最初のOracle Mediatorと双方向サービスの間に一方向のOracle Mediatorを使用する必要があります。レスポンスを最初に一方向のOracle Mediatorに転送し、その一方向のOracle Mediatorが双方向サービスをコールする必要があります。


注意:

  • 0(ゼロ)のタイムアウト時間指定はサポートされていません。

  • コールバックは受信したが、そのコールバックの処理に失敗した場合は、タイムアウト・ハンドラに指定されているアクションを処理するために、タイムアウト・ハンドラがデフォルトで起動されます。

  • 通常、コール元は、100ミリ秒待機した後でコールバックを受信します。ただし、順次ルーティング・ルールと同期インタフェース・サービスへの接続を使用するブリッジOracle Mediatorがある場合は、ルーティング・ルールがすべて順次であるプログラムのフローが複雑となるため、コール元でのコールバックの受信準備にさらに時間がかかる場合があります。この問題は、ブリッジOracle Mediatorのルーティング・ルールをパラレルに変更することで回避できます。


タイムアウト時間を指定する手順

タイムアウト時間を指定する手順は、次のとおりです。

  1. 「コールバック」セクションの「<<ターゲット操作>>」フィールドの横にある「ターゲット・サービス操作を参照します。」アイコンをクリックします。

    「ターゲット・タイプ」ダイアログが表示されます。

  2. 「サービス」または「イベント」を選択します。

    選択した内容によって「ターゲット・サービス」ダイアログまたは「イベント・チューザ」ダイアログが表示されます。

  3. サービスまたはイベントを選択します。

  4. 「OK」をクリックします。

    タイムアウトしたレスポンスが、指定したサービスまたはイベントに転送されます。


注意:

ルーティング・ルールの数が多く、ルーティング・ルールの実行に要する時間がトランザクション・タイムアウトを超える場合は、トランザクション・タイムアウトの値を、すべてのルーティング・ルールの実行に要する時間より長い時間に設定する必要があります。

20.2.2.5 複数コールバックの処理方法

1つのOracle Mediatorで複数のコールバックを処理することはできません。複数のコールバックを受信するOracle Mediatorが含まれているコンポジット・アプリケーションがある場合、そのコンポジット・アプリケーションの動作は不明です。たとえば、図20-9に示したシナリオについて考えてみます。このシナリオでは、AsyncMediatorAsyncEchoMediator1およびAsyncEchoMediator2からのコールバック・レスポンスをFileInMediatorに転送します。このようなフローでは、AsyncMediatorは、AsyncEchoMediator1AsyncEchoMediator2の両方からのコールバックを返すか、またはいずれか一方のコールバックを返す可能性があります。正確な動作は確率的であり、予測できません。

図20-9 複数のコールバックを処理するOracle Mediatorのサンプル

図20-9の説明は次にあります。
「図20-9 複数のコールバックを処理するOracle Mediatorのサンプル」の説明

20.2.2.6 フォルトの処理方法

ターゲット・サービスのWSDL操作に1つ以上のフォルトがある新規ルーティング・ルールを作成する場合でも、メディエータ・エディタには、単一フォルトのルーティング・セクションが表示されます。ソースOracle Mediatorサービス・コンポーネントが1つ以上のフォルトをサポートしている場合、デフォルトでは、フォルトはコール元に戻されます。ただし、ルーティングするソース・フォルト名およびターゲット・フォルト名を指定できます。サービス・ブラウザを使用して、フォルトを別のターゲットにルーティングすることもできます。

別のフォルト・ルーティングを追加する手順は、次のとおりです。

  1. 図20-10に示すように、「別のフォルト・ルーティングを追加します。」ボタンをクリックします。

    図20-10 2番目のフォルトの追加

    図20-10の説明は次にあります。
    「図20-10 2番目のフォルトの追加」の説明

    この結果、別のフォルト・セクションがルーティング・ルールに追加されます。図20-11では、2番目のフォルトはファイル・アダプタ・サービスにルーティングされています。

    図20-11 2番目のフォルトの追加

    図20-11の説明は次にあります。
    「図20-11 2番目のフォルトの追加」の説明


    注意:

    異なるトランスフォーメーションを使用して、同一のフォルトを多数の異なるターゲットにルーティングすることが可能です。

フォルト・ルーティング・セクションを削除する手順は、次のとおりです。

  1. フォルト・ルーティングのターゲットを選択しているときに、フォルト・ルーティング・セクションを削除する場合は、図20-12に示すように、「選択したフォルト・ルーティングを削除します。」をクリックします。

図20-12 フォルト・ルーティングの削除

図20-12の説明は次にあります。
「図20-12 フォルト・ルーティングの削除」の説明

別の方法として、「ターゲット・タイプ」ダイアログで「ターゲットのクリア」をクリックします。

20.2.2.7 メッセージをフィルタリングする式の指定方法

フィルタ式ルーティング・ルールを使用すると、ペイロードに基づいてメッセージをフィルタリングできます。特定のメッセージ・インスタンスに対してフィルタ式がtrueと評価されると、そのメッセージはルーティング・ルールに指定されているターゲット・サービスまたはイベントに送信されます。

たとえば、アメリカとカナダの異なる2国にいる顧客にデータをルーティングするとします。ただし、アメリカの顧客には、携帯型の製品系列に関する通知のみを、カナダの顧客には固定電話型の製品系列の通知のみを送信します。このルーティングのためには、メッセージをターゲット顧客に送信するコンポーネントと操作の各組合せについてルーティング・ルールを定義する必要があります。さらに、アメリカまたはカナダの顧客にメッセージを送信するルーティング・ルールには、フィルタ式を指定します。

フィルタ式のメッセージ・プロパティまたはメッセージ・ヘッダーを定義することもできます。

フィルタ式のメッセージ・プロパティ

例20-1に、フィルタ式のメッセージ・プロパティの2つ例を示します。

例20-1 フィルタ式のメッセージ・プロパティ

$in.property.custom.Priority = '1'

$in.property.tracking.ecid = '2'

フィルタ式のメッセージ・ヘッダー

例20-2に、フィルタ式のメッセージ・ヘッダーの2つ例を示します。

例20-2 フィルタ式のメッセージ・ヘッダー

$in.header.wsse_Security/wsse:Security/Priority = '234'

$in.header.wsse_Security/wsse:Security/Priority = '234'

このフィルタ式のメッセージ・ヘッダーが機能するには、.mplanファイルのルート要素に例20-3に示す属性を追加する必要があります。

例20-3 追加する属性

wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
 secext-1.0.xsd"

メッセージをフィルタリングする式を指定する手順は、次のとおりです。

フィルタ式は、「式ビルダー」ダイアログを使用して指定できます。

  1. 「ルーティング・ルール」セクションの「フィルタ式」フィールドの右側にあるアイコンをクリックします。

    図20-13に示すように、「式ビルダー」ダイアログが表示されます。

    図20-13 「式ビルダー」ダイアログ

    図20-13の説明は次にあります。
    「図20-13 「式ビルダー」ダイアログ」の説明

    「式ビルダー」ダイアログには、フィルタ式の設計を支援するコンポーネントやコントロールが含まれています。

  2. 「式」フィールドに値を追加するには、「変数」フィールドまたは「関数」パレットで、必要な値をダブルクリックします。変数要素、関数および手動で入力したテキストの組合せを使用して、このウィンドウで、特定のルーティング・ルールに対してメッセージ・ペイロードをフィルタリングする式を作成できます。

    次に、「式ビルダー」ダイアログの各フィールドについて説明します。

    • 「式」フィールド

      フィルタ式を入力できます(手動、または「変数」フィールドおよびこのダイアログ内の「関数」パレットを使用)。

      このフィールドの右上部に表示されている各アイコンを使用すると、最後に行った編集の取消し、最後に行った編集の再実行、または「式」フィールド全体の消去を実行できます。

    • 「変数」フィールド

      このフィールドには、Oracle Mediatorに対して定義されたメッセージが含まれます。Oracle JDeveloperはOracle MediatorのWSDLファイルを解析し、メッセージ定義を「変数」フィールドに表示します。入力メッセージは$in変数の中に格納されます。$in.propertiesを使用して、入力メッセージのプロパティにアクセスできます。

      入力メッセージが複数のパートで構成されている場合は、$in.partnameを使用して、入力メッセージのパートにアクセスできます。

    • 「関数」パレット

      このリストを使用すると、様々な関数を選択して式に挿入できます。関数を選択すると、その関数が「式」フィールドに追加されたときにどのように表示されるかを示すプレビューが「コンテンツのプレビュー」フィールドに表示され、その関数の説明が「説明」フィールドに表示されます。

    • コンテンツのプレビュー

      このフィールドには、「変数」フィールドまたは「関数」パレットで選択した値が「式」フィールドに挿入されたときの表示状態で示されます。

    • 「説明」フィールド

      このフィールドには、「変数」フィールドまたは「関数」パレットで選択した値の説明が表示されます。

メッセージ・ペイロードのフィルタ式を指定する手順は、次のとおりです。

  1. 「ルーティング・ルール」セクションで、フィルタ式の追加アイコン(図20-2を参照)をクリックします。

    「式ビルダー」ダイアログが表示されます。

  2. 「変数」フィールドで、メッセージ定義を開き、式の基礎を形成するメッセージ要素を選択します。たとえば、図20-14では、CustomerId要素が選択された状態が示されています。

    図20-14 「式ビルダー」ダイアログ – 変数要素の選択

    図20-14の説明は次にあります。
    「図20-14 「式ビルダー」ダイアログ – 変数要素の選択」の説明

  3. 「式に挿入」をクリックします。

    図20-15に示すように、式が「式」フィールドに追加されます。

    図20-15 「式ビルダー」ダイアログ – 変数要素の挿入

    図20-15の説明は次にあります。
    「図20-15 「式ビルダー」ダイアログ – 変数要素の挿入」の説明

  4. 「関数」リストから、メッセージ・ペイロードに適用する関数を選択します。たとえば、equalsを選択します。

    関数は、「関数」リストの下矢印をクリックすると表示されるカテゴリ別にリストされます。たとえば、下矢印をクリックして「Logical Functions」を選択すると、図20-15に示すようにリストが表示されます。「Logical Functions」リストで関数を選択すると、その関数の説明が「説明」ボックスに表示されます。

  5. 「式に挿入」をクリックします。

    選択した関数のXPath式が「式」フィールドに挿入されます。

  6. 式を完成します。この例では、図20-16に示すように、値1001を入力します。

    図20-16 サンプルの「式ビルダー」ダイアログ – 値の入力後

    図20-16の説明は次にあります。
    「図20-16 サンプルの「式ビルダー」ダイアログ – 値の入力後」の説明

  7. 式は手動で編集するか、式の編集アイコンを使用できます。図20-17には、これらのアイコンがまとめられています。

    図20-17 式の編集アイコン

    図20-17の説明は次にあります。
    「図20-17 式の編集アイコン」の説明

  8. 「OK」をクリックします。

    式が「ルーティング・ルール」セクションに追加されます。

フィルタ式の変更または削除は、フィルタ式の追加アイコンをダブルクリックし、「式ビルダー」の「式」フィールドで実行します。

20.2.2.7.1 ユーザー定義拡張関数の使用方法

式ビルダーを使用すると、ユーザー定義拡張関数を使用できます。ユーザー定義拡張関数を使用する手順は、次のとおりです。

ユーザー定義拡張関数を使用する手順は、次のとおりです。

  1. XPath関数を作成します。

  2. Jaxen XPath関数を、サーバー側のxpath-function.xmlファイルのOracle Mediatorサービス・コンポーネントに登録します。

  3. Oracle JDeveloperを開きます。

  4. 式ビルダーで式をカスタマイズします。

  5. Oracle JDeveloperプロジェクトをOracle WebLogic Serverにデプロイします。

  6. ユーザー定義拡張関数を格納したJARファイルを$BEAHOME/user_projects/domains/soainfra/autodeploy/soa-infra/APP-INF/libディレクトリにコピーします。

  7. プロジェクトの.mplanファイルを、次のように変更します。

    • 拡張関数用に定義した関数ネームスペースをMediator要素の下に追加します。

    • 関数名をExpression要素に追加します。

    図20-18に、この変更操作を示します。

    図20-18 プロジェクトの.mplanファイル – ユーザー定義拡張関数を使用するように変更済

    図20-18の説明は次にあります。
    「図20-18 プロジェクトの.mplanファイル – ユーザー定義拡張関数を使用するように変更済」の説明

  8. 適切なペイロードでテスト・ページを起動します。

20.2.2.8 トランスフォーメーションの作成方法

Oracle JDeveloperには、XSLTマッパーが用意されています。XSLTマッパーを使用すると、データをXMLスキーマ(XSDファイルで表されます)間で変換するためのマッパー・ファイル(XSLファイル)を指定できます。XSLTマッパーを使用することで、異なるスキーマを使用しているアプリケーション間でのデータ交換が可能になります。たとえば、受信したソース注文書スキーマを、送信する請求書スキーマにマップできます。XSLファイルを定義した後は、そのファイルを複数のルーティング・ルール仕様で再利用できます。

「ルーティング・ルール」セクションの「次を使用して変換」フィールドの右側にあるトランスフォーメーション・マップ・アイコンをクリックすると、「リクエスト・トランスフォーメーション・マップ」ダイアログが表示されます。このダイアログで、既存のXSLファイルを選択するか、またはXSLTマッパーを使用して必要なトランスフォーメーションを実行する新規XSLファイルを作成します。

また、同期リプライ、コールバック・レスポンス・メッセージまたはフォルト・メッセージのトランスフォーメーションを指定できます。同期リプライまたはフォルト・メッセージの場合、「リプライ・トランスフォーメーション・マップ」ダイアログまたは「フォルト・トランスフォーメーション・マップ」ダイアログには、「リクエストをリプライ・ペイロードに含める」オプションがあります。図20-19に、このオプションが表示された「リプライ・トランスフォーメーション・マップ」ダイアログを示します。

図20-19 「リプライ・トランスフォーメーション・マップ」ダイアログ

図20-19の説明は次にあります。
「図20-19 「リプライ・トランスフォーメーション・マップ」ダイアログ」の説明

このオプションを選択すると、図20-20に示すように、同期相互作用の元のメッセージを含む$initial変数が作成されます。

図20-20 XSLファイルの初期変数

図20-20の説明は次にあります。
「図20-20 XSLファイルの初期変数」の説明

初期メッセージも複数のパートで構成されます。$initial.partnameを使用して、初期メッセージのパートにアクセスできます。


注意:

インバウンド・メッセージとアウトバウンド・メッセージのパートが同じ場合、データ交換にトランスフォーメーションは必要ありません。

XSLTマッパーの詳細は、第38章「XSLTマッパーを使用したトランスフォーメーションの作成」を参照してください。

20.2.2.9 値の割当て方法

メッセージのヘッダー、ペイロードおよびプロパティは、「値の割当て」フィールドを使用してソースからターゲットに伝播できます。図20-21に、「値の割当て」ダイアログを示します。このダイアログは、「ルーティング・ルール」セクションの「値の割当て」アイコンをクリックすると表示されます。

図20-21 「値の割当て」ダイアログ

図20-21の説明は次にあります。
「図20-21 「値の割当て」ダイアログ」の説明

ターゲット・メッセージのプロパティを設定する手順は、次のとおりです。

  1. 「値の割当て」ダイアログの「追加」をクリックします。

    図20-22に示すように、「値の割当て」ダイアログが表示されます。

    図20-22 「値の割当て」ダイアログ

    図20-22の説明は次にあります。
    「図20-22 「値の割当て」ダイアログ」の説明

  2. 「From」セクションで、「タイプ」ボックスから次のオプションのいずれかを選択します。

    • プロパティ: ターゲット・メッセージにプロパティの値を割り当てる場合に選択します。「プロパティ」リストには、事前に定義されたプロパティのリストが表示されます。任意のユーザー定義プロパティ名を入力することもできます。

    • : ターゲット・メッセージに式の値を割り当てる場合に選択します。「式」フィールドの右側にある「式ビルダーの起動」アイコンをクリックすると、図20-13に示すような「式ビルダー」ダイアログが表示されます。

      「式ビルダー」ダイアログの詳細は、第20.2.2.7項「メッセージをフィルタリングする式の指定方法」を参照してください。

    • 定数: ターゲット・メッセージに定数値を割り当てる場合に選択します。

  3. 「To」セクションで、次のオプションのいずれかを選択します。

    • プロパティ: メッセージ・プロパティに値をコピーする場合に選択します。「式ビルダー」ダイアログの「変数」フィールドには、出力メッセージを格納する$out変数が表示されます。$out.propertyを使用すると、出力メッセージのプロパティにアクセスできます。

    • : 式に値をコピーする場合に選択します。「式」フィールドの右側にある「式ビルダーの起動」アイコンをクリックすると、「式ビルダー」ダイアログが表示されます。「式ビルダー」ダイアログの「変数」フィールドには、出力メッセージを格納する$out変数が表示されます。$out.partnameを使用すると、出力メッセージ全体または出力メッセージのパートにアクセスできます。

    図20-23に、定数値が式として指定されている、サンプルの「値の割当て」ダイアログを示します。

    図20-23 移入後の「値の割当て」ダイアログ

    図20-23の説明は次にあります。
    「図20-23 移入後の「値の割当て」ダイアログ」の説明

  4. 「値の割当て」ダイアログの「OK」をクリックします。

  5. 「OK」をクリックします。「ルーティング・ルール」セクションの「値の割当て」フィールドに式が追加されます。


注意:

  • イベントの公開時に特定のOracle Mediatorプロパティに値を割り当てた場合、その値はサブスクライブするイベントに伝播されません。

    この問題を回避するには、トランスフォーメーションを使用して、イベント本体の一部としてプロパティを含めます。

  • Oracle WebLogic Serverのjca.db.userNameおよびjca.db.passwordプロパティに値を割り当てることはできません。これは、これらのデータ・ソースでは、getConnectionメソッドへのユーザー名またはパスワードの動的な設定がサポートされていないためです。


表20-1から表20-3に、メッセージの定数とプロパティ、ペイロードおよびヘッダーに関するソースからターゲットへの考えられる様々な割当てを示します。

表20-1 定数とプロパティの場合の考えられる割当て

ソース ターゲット

プロパティ

プロパティ

<copy expression="$in.property.jca.file.FileName" target="$out.property.jca.file.FileName"/>

定数

プロパティ

<copy value="ConstantNameAssigned.xml" target="$out.property.jca.file.FileName"/>


表20-2 ペイロードの場合の考えられる割当て

ソース ターゲット

XPath式

プロパティ

<copy expression="concat('ExprPropMed','-',oraext:generate-guid())" target="$out.property.jca.file.FileName" xmlns:oraext="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc"/>

XPath式(パート・レベルより下)

プロパティ

<copy expression="$in.body/imp1:request/ProductReq/Make" target="$out.property.jca.file.FileName" xmlns:imp1="http://xmlns.oracle.com/psft"/>

プロパティ

XPath式(パート・レベルより下)

<copy value="$in.property.jca.file.FileName" target="$out.request/inp1:request/ProductReq/Model" xmlns:inp1="http://xmlns.oracle.com/psft"/>

定数

XPath式(パート・レベルより下)

<copy value="ConstantModel" target="$out.request/inp1:request/ProductReq/Model" xmlns:inp1="http://xmlns.oracle.com/psft"/>

XPath式

XPath式

<copy expression="$in.body" target="$out.request"/>

XPath式(パート・レベルより下)

XPath式(パート・レベルより下)

<copy expression="$in.body/imp1:request/ProductReq/Make" target="$out.request/imp1:request/ProductReq/Model" xmlns:imp1="http://xmlns.oracle.com/psft"/>


表20-3 ヘッダーの場合の考えられる割当て

ソース ターゲット

XPath式(パート・レベルより下)

プロパティ

<copy expression="$in.header.inp1_header/inp1:header/Name" target="$out.property.jca.file.FileName" xmlns:inp1="http://xmlns.oracle.com/psft"/>

プロパティ

XPath式(パート・レベルより下)

<copy value="$in.property.jca.file.FileName" target="$out.header.inp1_header/inp1:header/Name" xmlns:inp1="http://xmlns.oracle.com/psft"/>

定数

XPath式(パート・レベルより下)

<copy value="NewID.xml" target="$out.header.inp1_header/inp1:header/Id" xmlns:inp1="http://xmlns.oracle.com/psft"/>

定数

XPath式(パート・レベルより下)

<copy value="sampleusername" xmlns:wsse1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" target="$out.header.wsse1_Security/wsse1:Security/wsse1:UsernameToken/wsse1:Username"/>

XPath式

XPath式

<copy target="$out.header.inp1_header" expression="$in.header.inp1_header" xmlns:inp1="http://xmlns.oracle.com/psft"/>

XPath式(パート・レベルより下)

XPath式(パート・レベルより下)

<copy target="$out.header.inp1_header/inp1:header/Name" expression="$in.header.inp1_header/inp1:header/Id" xmlns:inp1="http://xmlns.oracle.com/psft"/>


20.2.2.10 assignアクティビティに関する注意事項

assignアクティビティについては、次の点に注意してください。

  • assignアクティビティは、Oracle Mediatorの<copy>要素に記述されている順序で実行されます。

  • ソースがターゲットのプロパティに割り当てられている場合でも、そのソースのXPath式は常にリーフ・ノードを参照する必要があります。リーフ・ノードを参照していない場合、ソースの子ノードの値はすべて連結されて、ターゲットのプロパティに割り当てられます。例20-4に詳細を示します。

    例20-4 リーフ・ノードを参照するXPath式

    <copy target="$out.property.jca.file.FileName"
     expression="$in.body/imp1:request/ProductReq/Make"
     xmlns:imp1="http://xmlns.oracle.com/psft"/>
    

    注意:

    リーフ・ノードとは、子ノードのないノードです。

  • 定数またはプロパティがターゲットのXPath式に割り当てられる場合でも、そのターゲットのXPath式は常にリーフ・ノードを指し示す必要があります。リーフ・ノードを指し示していない場合、リーフ以外のノードには文字列値のみが含まれ、.xsdファイルに従って無効なXMLが生成される可能性があります。例20-5に詳細を示します。

    例20-5 リーフ・ノードを指し示すターゲットのXPath式

    <copy target="$out.request/inp1:request/ProductReq/Make" value="NewMakeValue"
     xmlns:inp1="http://xmlns.oracle.com/psft"/>
    

    この例では、$out.request/inp1:request/ProductReq/Makeがリーフ・ノードを参照しています。

  • トランスフォーメーションが使用可能な場合は、ソース・パートをターゲット・パートに割り当てても、そのターゲットは上書きされます。これは、トランスフォーメーションの最初にassignアクティビティが発生するためです。トランスフォーメーションが使用不可の場合は、assignアクティビティによってターゲットが作成されます。例20-6に詳細を示します。

    例20-6 トランスフォーメーションの使用可能性とassignアクティビティ

    <copy target="$out.request" expression="$in.body"/>
    
    <copy target="$out.header.inp1_header" expression="$in.header.inp1_header"
      xmlns:inp1="http://xmlns.oracle.com/psft"/>
    
  • ターゲット・ペイロードのいずれかの子ノードを変更する必要がある場合は、次のような2つのユースケースがあります。

    • トランスフォーメーションが使用可能な場合は、ターゲットの子ノードを指し示しているターゲットのXPath式にソース式を直接割り当てます。例20-7に詳細を示します。

      例20-7 ターゲットのXPath式へのソース式の直接割当て

      <copy value="ConstantModel"
      target="$out.request/inp1:request/ProductReq/Model"
       xmlns:inp1="http://xmlns.oracle.com/psft"/>
      
    • トランスフォーメーションが使用不可の場合は、次の2つのステップを実行します。最初に、ソース・パートをターゲット・パートに割り当て、次にターゲットの子ノードを指し示しているターゲットのXPath式にソース式を直接割り当てます。例20-8に詳細を示します。

      例20-8 トランスフォーメーションが使用不可の場合の割当て

      <copy target="$out.request" expression="$in.body"/> and <copy
       value="ConstantModel" target="$out.request/inp1:request/ProductReq/Model"
       xmlns:inp1="http://xmlns.oracle.com/psft"/>
      
  • ソースの子ノードの1つのみをターゲットに伝播する必要がある場合は、最初にトランスフォーメーションが起動されていないことを確認します。次に、必要な子ノードを指し示すソースのXPath式を割り当てます。例20-9に詳細を示します。

    例20-9 ソースの1つの子ノードがターゲットに伝播される場合

    <copy target="$out.request/imp1:ProductReq"
     expression="$in.body/imp1:request/ProductReq"
     xmlns:imp1="http://xmlns.oracle.com/psft"/>
    

    このケースで、$in.body/imp1:request/ProductReqから評価されるソース要素には、子ノードのみが含まれ、ルート要素から始まる完全なツリー構造は含まれていません。例20-10に詳細を示します。

    例20-10 子ノードのみが含まれているルート要素から始まる構造

    <ProductReq>
            <Make>MAKE</Make>
            <Model>MODEL</Model>
    </ProductReq>
    
  • Oracle Mediatorに複数のassignアクティビティがあり、各ソースのXPath式が別々の子ノードを指し示している場合は、次のような2つのユースケースがあります。

    • トランスフォーメーションが使用可能な場合は、ターゲットの対応する子ノードが更新されます。

    • トランスフォーメーションが使用不可の場合、ターゲットは複数パートのターゲットであり、各パートがソースの子ノードを参照している必要があります。

  • ヘッダーの場合、passThroughHeaderプロパティが設定されている場合は、次のようになります。

    • トランスフォーメーションのヘッダー操作は、ターゲットのヘッダーで更新されます。

    • パート・レベルのassignアクティビティによって、ターゲットのヘッダー・パートが上書きされます。

    • パート・レベルより下のノードのassignアクティビティによって、ターゲットの対応するノードが更新されます。

  • (パート・レベルより下の)複数のソース・ノードが(パート・レベルより下の)同じターゲット・ノードに割り当てられている場合、そのターゲット・ノードには、assignアクティビティの最後のcopy要素の値が含まれます。例20-11に詳細を示します。

    例20-11 同じターゲット・ノードに複数のソース・ノードが割り当てられる場合

    <copy target="$out.request/imp1:request/ProductReq/Make"
     expression="$in.body/imp1:request/ProductReq/Model"
    xmlns:imp1="http://xmlns.oracle.com/psft"/>
    
    <copy target="$out.request/imp1:request/ProductReq/Make"
     expression="$in.body/imp1:request/Description"
    xmlns:imp1="http://xmlns.oracle.com/psft"/>
    

    例20-11で、最初のcopy要素は、2番目のcopy要素によって上書きされるため何も効果がありません。

  • XPath式の結果がリスト(複数発生)になる場合は、次の2つのユースケースがあります。

    • リストに単一の要素が含まれる場合は、XPath式が伝播されます。

    • リストに複数の要素が含まれる場合、XPath式はサポートされません。

  • ソースの子ノードをターゲットの子ノードに割り当てると、次のアクティビティが発生します。

    1. ソースの子ノードの名前とネームスペースが、ターゲットのノード名とネームスペースによってそれぞれ上書きされます。

    2. ターゲットの子ノードは、ターゲット・ノードの親ノードにあるソースの子ノードによって置換されます。

20.2.2.11 フィルタおよび割当てのためのヘッダー・アクセス方法

フィルタを定義するため、または割当てソースや割当てターゲットを定義するためにOracle Mediatorから式ビルダーを起動すると、WSDLファイルが解析されます。その際に、図20-24に示すように、現在のルーティング・ルール操作のSOAPヘッダーが自動的に検出され、このSOAPヘッダーが変数として、inフォルダまたはoutフォルダにheader./ns_elementName/のように表示されます。ここで、nsはネームスペース接頭辞、elementNameはヘッダー・スキーマのルート要素名です。

次の例で詳細を示します。

例1: ネームスペース接頭辞wsseおよびns1がすでに定義されている場合

ネームスペース接頭辞wsseおよびns1がWSDLファイルまたは.mplanファイルにすでに定義されているとします。この場合、XPath式は次のように記述できます。

$in.header.wsse_Security/wsse:Security/ns1:Foo/Priority

例2: WSDLファイルにネームスペースが事前定義されていないスキーマの場合

WSDLファイルにネームスペースが事前定義されていないスキーマを使用するとします。この場合、式ビルダーでは、接頭辞のかわりに{full_namespace}を入力できる機能が提供されます。さらに、式ビルダーによって一意の接頭辞が生成され、接頭辞の定義が.mplanファイルに追加されます。

たとえば、式ビルダーに例20-12に示す式を入力するとします。

例20-12 式

$in.header.{http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sec
ext-1.0.xsd}_Security/
{"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xs
d"}:
Security/{"http://www.globalcompany.com/ns/OrderBooking"}:Foo/Priority

.mplanファイルには、例20-13に示すコンテンツが含まれています。

例20-13 .mplanファイルのコンテンツ

xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
secext-1.0.xsd"
xmlns:ns2="http://www.globalcompany.com/ns/OrderBooking"
...
expression="$in.header.ns1_Security/ns1:Security/ns2:Foo/Priority"

図20-24 「式ビルダー」ダイアログ - 自動ヘッダー検出

図20-24の説明は次にあります。
「図20-24 「式ビルダー」ダイアログ - 自動ヘッダー検出」の説明

デフォルトでは、SOAPヘッダーはOracle Mediatorを介して渡されません。passThroughHeaderエンドポイント・プロパティを、対応するOracle Mediatorルーティング・サービスに追加する必要があります。

<property name="passThroughHeader">true</property>

たとえば、このプロパティを追加するには、composite.xmlファイルを例20-14に示すように変更できます。

例20-14 passThroughHeaderプロパティ

<component name="Mediator1"> 
     <implementation.mediator src="Mediator1.mplan"/>
     <property name="passThroughHeader">true</property>
</component>

ヘッダーを渡すには、ソースとターゲットのQName(名前とネームスペース)が同じである必要があります。ソースとターゲットのQNameが異なる場合は、トランスフォーメーションまたはパートレベルの割当てのいずれかを実行する必要があります。

(トランスフォーメーションまたはassignを使用しない)passthrough Oracle Mediatorの場合、ソースとターゲットのパートQNameが同じでない場合は、Oracle Mediatorがメッセージ・ペイロードをターゲット・サービスに渡す際にエラーが発生していない点に注意する必要があります。ただし、この処理はターゲット・サービスでエラーになる場合があります。これは、メッセージ・ペイロードはターゲット・サービスのメッセージ構造に従って再構築されていないためです。


注意:

  • このユーザー・インタフェースはSOAP 1.1およびSOAP 1.2の両方をサポートします。

  • 自動ヘッダー検出のためには、Oracle Mediatorサービス・コンポーネントの作成時に具体的なWSDLファイルを使用する必要があります。

  • 割当てはフィルタの後に実行されます。このため、カスタム・ヘッダーで値を割り当てている場合、特定の割当てはフィルタに対して表示されません。


20.2.2.11.1 フィルタおよび割当てのためのヘッダー・アクセスに使用する式の手動作成

ユースケースによっては、WSDLファイルからヘッダー・スキーマを識別できない場合があります。たとえば、メッセージに付加されたセキュリティ・ヘッダーや、抽象的なWSDLファイルを使用して作成されるOracle Mediatorのヘッダーなどです。そのようなヘッダーにアクセスするには、式ビルダーにXPath式を手動で入力する必要があります。

例20-15に、ヘッダー式の構文を示します。

例20-15 ヘッダー式の構文

$in.header.<header root element namespace prefix>_<header root element name>/<xpath>

例20-16に示すヘッダーがあるとします。

例20-16 ヘッダーの構文

<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-sec
ext-1.0.xsd">
<Priority>234</Priority>
</wsse:Security>

フィルタ式は次のようになります。

$in.header.wsse_Security/wsse:Security/Priority = '234'

割当て式は例20-17に示すようになります。

例20-17 割当て式

<copy target="$out.property.jca.jms.priority"
 expression="$in.header.wsse_Security/wsse:Security/Priority"/>

これらの式が機能するには、.mplanファイルのルート要素に例20-18に示す属性を追加する必要があります。

例20-18 .mplanファイルへの属性の追加

wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-
secext-1.0.xsd"
20.2.2.11.2 フィルタおよび割当てのためのプロパティ・アクセスに使用する式の手動作成

フィルタ式の例は、次のとおりです。

$in.property.tracking.ecid = '2'

割当て式の例は、次のとおりです。

<copy target="$out.property.tracking.ecid"  value="$in.property.tracking.ecid"/>

20.2.2.12 セマンティク検証の使用方法

インバウンド・メッセージとその様々なパートは、Schematronファイルを指定して検証できます。Schematronバージョン1.5がサポートされているバージョンです。

Schematronスキーマを指定して、インバウンド・メッセージとその様々なパートを検証する手順は、次のとおりです。

セマンティク検証を使用する手順は、次のとおりです。

  1. 「セマンティックの検証」フィールドの右側にある検証ファイルの選択アイコンをクリックします。

    「検証」ダイアログが表示されます。

  2. 「追加」をクリックします。

    「検証の追加」ダイアログが表示されます。

  3. 「パート」リストから、メッセージ・パートを選択します。

  4. 「ファイル」フィールドの右側にある「検索」をクリックします。

    「SOAリソース・ブラウザ」ダイアログが表示されます。

  5. Schematronファイルを選択し、「OK」をクリックします。


    注意:

    • 通常、Schematronファイルの拡張子は.schです。

    • 選択したSchematronファイルが空の場合、エラー・メッセージまたは警告は表示されません。


    図20-25に示すように、「検証の追加」ダイアログが更新されます。

    図20-25 「検証の追加」ダイアログ

    図20-25の説明は次にあります。
    「図20-25 「検証の追加」ダイアログ」の説明

  6. 「OK」をクリックします。

    図20-26に示すように、「検証」ダイアログが更新されます。

    図20-26 「検証」ダイアログ

    図20-26の説明は次にあります。
    「図20-26 「検証」ダイアログ」の説明

  7. 「追加」をクリックして別のメッセージ・パートのSchematronファイルを指定するか、「OK」をクリックします。

    Schematronスキーマの作成方法の詳細は、次の場所から入手できるリソースを参照してください。

    http://www.schematron.com


    注意:

    セマンティク検証では、各要素名の長さをチェックした場合、異なる入力セットに対して要素名が変わる場合があります。これは、パーサーが空白をテスト・ノードとして処理するため、ノード間に空白がある場合に発生します。

20.2.2.13 Javaコールアウトの使用方法

Javaコールアウトを使用すると、Oracle Mediatorを介してフローするメッセージの操作に外部のJavaクラスを使用できます。WSDL操作またはイベント・サブスクリプションごとに、Javaコールアウトは1つのみサポートされます。コールアウト・クラスは、oracle.tip.mediator.common.api.IjavaCalloutインタフェースを実装する必要があります。コールアウトは、静的ルーティングおよび動的ルーティングの両方に使用できます。図20-27に、2つの操作が指定されたOracle Mediatorのサンプルを示します。2つの操作には、それぞれルーティング・ルールが1つあり、最初の操作にはコールアウト・クラスが指定されています。

図20-27 JavaコールアウトをサポートするOracle Mediatorのサンプル

図20-27の説明は次にあります。
「図20-27 JavaコールアウトをサポートするOracle Mediatorのサンプル」の説明

サーバーでJavaコールアウト・クラスが使用できることが必要です。このためには、次のいずれかの方法を使用します。

  • JavaクラスをSCA-INF/classesフォルダにコピーします。

  • Javaクラスが含まれているJARをSCA-INF/libフォルダにコピーします。

  • Javaクラスが含まれているJARを$DOMAIN_HOME/libフォルダにコピーします。

Javaコールアウト・クラスを複数のメディエータで使用できるようにするには、Javaクラスが含まれているJARを$DOMAIN_HOME/libフォルダにコピーする必要があります。

図20-28に示すように、「コールアウト先」フィールドには、Javaコールアウト・クラスの名前を手動で入力できます。この場合は、Oracle JDeveloperのオートコンプリート機能によって、現在のプロジェクトのアドレスとクラスが挿入されます。

図20-28 「コールアウト先」フィールド

図20-28の説明は次にあります。
「図20-28 「コールアウト先」フィールド」の説明

「Javaコールアウト・クラスを選択します。」ボタンをクリックして、標準のOracle JDeveloperクラス・ブラウザを起動することもできます。

クラス・ブラウザは、oracle.tip.mediator.common.api.IjavaCalloutインタフェースを実装するクラスのみが表示されるようにフィルタリングされます。

Oracle MediatorにJavaコールアウトがあり、同じOracle Mediatorでフィルタ式を使用している場合は、ペイロードのルート要素を例20-19に示すように設定する必要があります。

例20-19 ペイロードのルート要素の設定

changexmldoc = XmlUtils.getXmlDocument(ChangedDoc);
String mykey = "request";
message.addPayload(mykey,changexmldoc.getDocumentElement());

表20-4で、oracle.tip.mediator.common.api.IjavaCalloutインタフェースのメソッドについて説明します。

表20-4 IjavaCalloutインタフェースのメソッドの説明

メソッド 説明

initialize

コールアウト実装クラスが初めてインスタンス化されるときに起動されます。

preRouting

Oracle Mediatorがケースの実行を開始する前にコールされます。このメソッドをカスタマイズすると、検証および拡張機能を組み込むことができます。

preRoutingRule

Oracle Mediatorが特定のケースの実行を開始する前にコールされます。このメソッドをカスタマイズすると、ケース固有の検証および拡張機能を組み込むことができます。

preCallbackRouting

Oracle Mediatorがコールバック処理の実行を終了する前にコールされます。このメソッドをカスタマイズすると、コールバックの監査およびカスタムのフォルト・トラッキングを実行できます。

postRouting

Oracle Mediatorがケースの実行を終了した後にコールされます。このメソッドをカスタマイズすると、レスポンスの監査およびカスタムのフォルト・トラッキングを実行できます。

postRoutingRule

Oracle Mediatorがケースの実行を開始した後にコールされます。このメソッドをカスタマイズすると、レスポンスの監査およびカスタムのフォルト・トラッキングを実行できます。

postCallbackRouting

Oracle Mediatorがコールバック処理の実行を終了した後にコールされます。このメソッドをカスタマイズすると、コールバックの監査およびカスタムのフォルト・トラッキングを実行できます。



注意:

preRoutingRuleメソッドまたはpreRoutingメソッドで、Javaコールアウトを使用してOracle Mediatorのメッセージ・プロパティを変更した場合は、Oracle Mediatorの割当て機能を使用して、変更したプロパティをアウトバウンド・メッセージに明示的にコピーする必要があります。たとえば、Javaコールアウトでjca.file.FileNameを変更している場合は、Oracle Mediatorの割当て文を次のように更新する必要があります。
<assign>
<copy target="$out.property.jca.file.FileName"
expression="$in.property.jca.file.FileName"/>
</assign>

表20-5で、CalloutMediatorMessageインタフェースのメソッドについて説明します。

表20-5 CalloutMediatorMessageインタフェースのメソッドの説明

メソッド 説明

addPayload

Oracle Mediatorメッセージのペイロードを設定します。

addProperty

Oracle Mediatorメッセージにプロパティを追加します。

addHeader

Oracle Mediatorメッセージにヘッダーを追加します。

getProperty

プロパティ名を指定してOracle Mediatorメッセージのプロパティを取得します。

getProperties

Oracle Mediatorメッセージのプロパティを取得します。

getId

Oracle MediatorメッセージのインスタンスIDを取得します。このインスタンスIDは、該当する特定のメッセージに対して作成されたOracle MediatorインスタンスIDです。

getPayload

Oracle Mediatorメッセージのペイロードを取得します。

getHeaders

Oracle Mediatorメッセージのヘッダーを取得します。

getComponentDN

Oracle Mediatorサービス・コンポーネントのcomponentDNを取得します。



注意:

  • oracle.tip.mediator.common.api.AbstractJavaCalloutImplクラスは、IJavaCalloutインタフェースのダミー実装脚注1です。このクラスによって、IJavaCalloutインタフェースに存在するすべてのメソッドが定義されます。このため、このクラスの拡張によって、IJavaCalloutインタフェースのいくつかの特定メソッドのみを上書きできます。

  • Javaコールアウト内で発生する処理の詳細は、Oracle Mediatorの「監査証跡」画面には表示されません。


脚注1インタフェースのダミー実装は、実装クラスによって、特定のインタフェースで宣言されているすべてのメソッドの定義が提供されることを意味しますが、空のメソッド本体を1つ以上の定義済メソッドに指定することはできます。ダミー実装クラスの拡張は、インタフェースを実装してすべてのメソッドを定義する場合と異なり、メソッドのサブセットのみを上書きできるためより簡単です。

Javaコールアウト・クラスのサンプル

例20-20は、Javaコールアウト・クラスのサンプルを示しています。

例20-20 Javaコールアウト・クラスのサンプル

package qa.as11tests.javacallout;
 
import com.collaxa.cube.persistence.dto.XmlDocument;
 
import com.oracle.bpel.client.NormalizedMessage;
 
import java.util.logging.Logger;
import java.util.Map;
import java.util.Iterator;
 
import oracle.tip.mediator.common.api.CalloutMediatorMessage;
import oracle.tip.mediator.common.api.ExternalMediatorMessage;
import oracle.tip.mediator.common.api.IJavaCallout;
import oracle.tip.mediator.common.api.MediatorCalloutException;
import oracle.tip.mediator.metadata.CaseType;
import oracle.tip.mediator.utils.XmlUtils;
 
import oracle.tip.pc.services.functions.ExtFunc;
 
import oracle.xml.parser.v2.XMLDocument;
 
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
 
public class JavaCalloutSanity implements IJavaCallout {
    Logger logger = Logger.getLogger("Callout");
    public JavaCalloutSanity() {    }    
    
    public void initialize(Logger logger) throws MediatorCalloutException {
        this.logger = logger;
        this.logger.info("Initializing...");
    }
    public boolean preRouting(CalloutMediatorMessage calloutMediatorMessage) {
        System.out.println("Pre routing...");
        String sPayload = "null";
        String sPayload_org = "null";        
        for (Iterator msgIt = calloutMediatorMessage.getPayload().entrySet().iterator();
             msgIt.hasNext(); ) {
            Map.Entry msgEntry = (Map.Entry)msgIt.next();
            Object msgKey = msgEntry.getKey();
            Object msgValue = msgEntry.getValue();
            if (msgKey.equals("request"))
                sPayload = XmlUtils.convertDomNodeToString((Node)msgValue);           
       }
        sPayload_org = sPayload;
        String tobeReplaced = "CHANGE_THIS";
        String replaceWith = "JAVA_CALLOUT_||_PRE_ROUTING";
        int start = sPayload.indexOf(tobeReplaced);
        StringBuffer sb = new StringBuffer();
        sb.append(sPayload.substring(0, start));
        sb.append(replaceWith);
        sb.append(sPayload.substring(start + tobeReplaced.length()));
        String changedPayload = sb.toString();        
        String uid;
        try {
            uid = ExtFunc.generateGuid();            
        } catch (Exception e) {
        }
              XMLDocument changedoc;        
        try {
            changedoc = XmlUtils.getXmlDocument(changedPayload);
            String mykey = "request";
            calloutMediatorMessage.addPayload(mykey,changedoc);
            //calloutMediatorMessage.getPayload().put(mykey, changedoc);
        } catch (Exception e) {
        }
        System.out.println("Changed from : \n"+sPayload_org+"\nTo\n"+changedPayload);
        System.out.println("End Pre routing...\n\n");
        return false;
    }
    public boolean postRouting(CalloutMediatorMessage calloutMediatorMessage,
                               CalloutMediatorMessage calloutMediatorMessage1,
                               Throwable throwable) throws MediatorCalloutException {
        System.out.println("Start Post routing...");
        String sPayload = "null";
        String sPayload_org = "null";        
        for (Iterator msgIt = calloutMediatorMessage1.getPayload().entrySet().iterator();
             msgIt.hasNext(); ) {
            Map.Entry msgEntry = (Map.Entry)msgIt.next();
            Object msgKey = msgEntry.getKey();
            Object msgValue = msgEntry.getValue();
            if(msgKey.equals("reply"))
                sPayload = XmlUtils.convertDomNodeToString((Node)msgValue);          
        }
        
        sPayload_org = sPayload;        
        String tobeReplaced = "POST_ROUTING_RULE_REQUEST_REPLY";
        String replaceWith = "POST_ROUTING_RULE_REQUEST_REPLY_||_POSTROUTING_||_JAVA_CALLOUT_WORKING";
        int start = sPayload.indexOf(tobeReplaced);
        StringBuffer sb = new StringBuffer();
        sb.append(sPayload.substring(0, start));
        sb.append(replaceWith);
        sb.append(sPayload.substring(start + tobeReplaced.length()));
        String changedPayload = sb.toString();
        XMLDocument changedoc;
        try {
            changedoc = XmlUtils.getXmlDocument(changedPayload);
            String mykey = "reply";
            calloutMediatorMessage1.addPayload(mykey,changedoc.getDocumentElement());
            // calloutMediatorMessage1.getPayload().put(mykey, changedoc.getDocumentElement());
        } catch (Exception f) {
        }
        System.out.println("Changed from : \n"+sPayload_org+"\nTo\n"+
                changedPayload);
        System.out.println("End Post routing...\n\n");
        return false;
    }
    public boolean preRoutingRule(CaseType caseType,
                                  CalloutMediatorMessage calloutMediatorMessage) {
        System.out.println("\nStart PreRoutingRule.\n");
        String sPayload = "null";
        String sPayload_org = "null";
        for (Iterator msgIt =
             calloutMediatorMessage.getPayload().entrySet().iterator();
             msgIt.hasNext(); ) {
 
            Map.Entry msgEntry = (Map.Entry)msgIt.next();
            Object msgKey = msgEntry.getKey();
            Object msgValue = msgEntry.getValue();
            if(msgKey.equals("request"))
                sPayload = XmlUtils.convertDomNodeToString((Node)msgValue);            
        }        
        sPayload_org = sPayload;
        String tobeReplaced = "PRE_ROUTING";
        String replaceWith = "PRE_ROUTING_||_PRE_ROUTING_RULE";
        int start = sPayload.indexOf(tobeReplaced);
        StringBuffer sb = new StringBuffer();
        sb.append(sPayload.substring(0, start));
        sb.append(replaceWith);
        sb.append(sPayload.substring(start + tobeReplaced.length()));
        String changedPayload = sb.toString();
        XMLDocument changedoc;
        try {
            changedoc = XmlUtils.getXmlDocument(changedPayload);
            String mykey = "request";
            calloutMediatorMessage.addPayload(mykey,changedoc);
            // calloutMediatorMessage.getPayload().put(mykey, changedoc);
        } catch (Exception e) {
        }
        System.out.println("Changed from : \n"+sPayload_org+"\nTo\n"+changedPayload);
        System.out.println("End PreRoutingRule.\n\n");
        return true;
    }
    public boolean postRoutingRule(CaseType caseType,
                                   CalloutMediatorMessage calloutMediatorMessage,
                                   CalloutMediatorMessage calloutMediatorMessage1,
                                   Throwable throwable) {
        System.out.println("Start PostRoutingRule.");
        String req_sPayload = "null";
        String req_sPayload_org = "null";
        String rep_sPayload = "null";
        String rep_sPayload_org = "null";
        for (Iterator msgIt =
             calloutMediatorMessage.getPayload().entrySet().iterator();
             msgIt.hasNext(); ) {
            Map.Entry msgEntry = (Map.Entry)msgIt.next();
            Object msgKey = msgEntry.getKey();
            Object msgValue = msgEntry.getValue();
            if(msgKey.equals("request"))
                req_sPayload = XmlUtils.convertDomNodeToString((Node)msgValue);            
        }
        req_sPayload_org = req_sPayload;
        String tobeReplaced = "PRE_ROUTING_RULE";
        String replaceWith = "PRE_ROUTING_RULE_||_POST_ROUTING_RULE_REQUEST";
        int start = req_sPayload.indexOf(tobeReplaced);
        StringBuffer sb = new StringBuffer();
        sb.append(req_sPayload.substring(0, start));
        sb.append(replaceWith);
        sb.append(req_sPayload.substring(start + tobeReplaced.length()));
        String changedPayload = sb.toString();
        XMLDocument changedoc;
        try {
            changedoc = XmlUtils.getXmlDocument(changedPayload);
            String mykey = "request";
            calloutMediatorMessage.addPayload(mykey,changedoc);
            // calloutMediatorMessage.getPayload().put(mykey, changedoc);
        } catch (Exception e) {
        }
        for (Iterator msgIt =
             calloutMediatorMessage1.getPayload().entrySet().iterator();
             msgIt.hasNext(); ) {
            Map.Entry msgEntry = (Map.Entry)msgIt.next();
            Object msgKey = msgEntry.getKey();
            Object msgValue = msgEntry.getValue();
            if(msgKey.equals("reply"))
                rep_sPayload = XmlUtils.convertDomNodeToString((Node)msgValue);            
        }
        rep_sPayload_org = rep_sPayload;        
        tobeReplaced = "PRE_ROUTING_RULE";
        replaceWith = "PRE_ROUTING_RULE_||_POST_ROUTING_RULE_REQUEST_REPLY";
        start = rep_sPayload.indexOf(tobeReplaced);
        sb = new StringBuffer();
        sb.append(rep_sPayload.substring(0, start));
        sb.append(replaceWith);
        sb.append(rep_sPayload.substring(start + tobeReplaced.length()));
        changedPayload = sb.toString();
        try {
            changedoc = XmlUtils.getXmlDocument(changedPayload);
            String mykey = "reply";
            calloutMediatorMessage1.addPayload(mykey,changedoc.getDocumentElement());
            // calloutMediatorMessage1.getPayload().put(mykey, changedoc.getDocumentElement());
        } catch (Exception e) {
        }
        System.out.println("Changed from : \n"+req_sPayload_org+"\nTo\n"+changedPayload);
        System.out.println("End postRoutingRule\n\n");
        return true;
    }
}

20.2.3 動的ルーティング・ルールの作成方法

動的ルーティングの基本的な考え方は、プロセスが経由するパスを決定する制御ロジックを、そのプロセスの実行から分離することです。動的ルーティングのシナリオでは、デシジョン・マトリックスによって各ルーティングに対して選択されるレベル2タイプのサービスが決定されます。レベル2タイプのサービスのデシジョンに影響を与える要因は、チャネル、顧客タイプなどです。このソリューションによって、ビジネス・アナリストはルーティングを変更せずに、このデシジョン・マトリックスを外部から変更できます。アウトバウンド・サービスを決定するためには、デシジョン・マトリックスを評価する必要があります。

動的ルーティング・ルールを作成する手順は、次のとおりです。

  1. 図20-29に示すように、メディエータ・エディタの動的ルーティング・ルールのオプションを使用します。

    図20-29 動的ルーティング・ルールのオプションが表示されたメディエータ・エディタ

    図20-29の説明は次にあります。
    「図20-29 動的ルーティング・ルールのオプションが表示されたメディエータ・エディタ」の説明

    このウィンドウで、新しいビジネス・ルール・サービス・コンポーネントが作成され、Oracle Mediatorサービス・コンポーネントのSOAコンポジット内のOracle Mediatorサービス・コンポーネントに接続されます。ビジネス・ルール・サービス・コンポーネントとOracle Mediatorサービス・コンポーネント間のワイヤ・リンクは、実装の詳細とみなされ、図20-30に示すように、SOAコンポジット・エディタでは点線で表示されます。

    図20-30 ビジネス・ルール・サービス・コンポーネントとOracle Mediatorサービス・コンポーネント間のワイヤ・リンクが表示されたSOAコンポジット・エディタ

    図20-30の説明は次にあります。
    「図20-30 ビジネス・ルール・サービス・コンポーネントとOracle Mediatorサービス・コンポーネント間のワイヤ・リンクが表示されたSOAコンポジット・エディタ」の説明

    ビジネス・ルール・サービス・コンポーネントには、ルール・ディクショナリが含まれています。ルール・ディクショナリは、ファクト・タイプ、ルールセット、ルール、デシジョン表など、ルール・エンジン・アーチファクトに対するメタデータ・コンテナです。ルール・ディクショナリは、ビジネス・ルール・サービス・コンポーネントの作成過程で、次のデータを使用して事前に初期化されます。

    • ファクト・タイプ・モデル

      ファクト・タイプ・モデルは、ルールのモデル化に使用できるデータ・モデルです。ルール・ディクショナリには、BPELプロセスのphaseアクティビティの入力に対応するファクト・タイプ・モデルと、Oracle Mediatorサービス・コンポーネントとビジネス・ルール・サービス・コンポーネント間の規定の一部として必要な固定データ・モデルの一部が移入されます。

    • ルールセット

      ルールセットは、ルールのグループ化メカニズムとして使用されるルールのコンテナです。ルールセットはサービスとして公開できます。ビジネス・ルール・サービス・コンポーネントの作成過程で、1つのルールセットがルール・ディクショナリ内に作成されます。

    • デシジョン表(またはマトリックス)

      ルール・エンジンから見ると、デシジョン表は、ルールの条件およびアクション部分のファクト・タイプ・モデルの要素が同じであるルールの集合です。デシジョン表を使用すると、ルールを表形式で表示できます。ビジネス・ルール・サービス・コンポーネントの作成過程で、ルールセット内に新規デシジョン表が作成されます。

    • デシジョン・サービス

      デシジョン・サービスは、ビジネス・ルール・サービス・コンポーネントの作成過程で作成され、ルールセットをビジネス・ルール・サービス・コンポーネントのサービスとして公開します。Oracle Mediatorサービス・コンポーネントでは、サービス・インタフェースを使用してデシジョン表を評価します。

    phaseアクティビティの必要なアーチファクトがすべて作成されると、ウィザードでは、フェーズ・デシジョン・マトリックス(PDM)のモデル化が開始されます。Oracle JDeveloperのビジネス・ルール・デザイナが起動され、フェーズ・デシジョン・マトリックスを編集できるようになります。図20-31に、ビジネス・ルール・デザイナ内のデシジョン表のサンプルを示します。

    図20-31 ルール・デザイナ内のデシジョン表のサンプル

    図20-31の説明は次にあります。
    「図20-31 ルール・デザイナ内のデシジョン表のサンプル」の説明

  2. 動的ルーティングを作成した後は、「動的ルールの編集」をクリックして、関連デシジョン・マトリックスを変更できます。ビジネス・ルール・デザイナが起動され、ビジネス・ルール・サービス・コンポーネントの関連デシジョン表の変更が可能になります。Oracle Mediatorサービス・コンポーネントに対して動的ルーティングを作成した後は、その動的ルーティングを削除しないかぎり、静的ルーティングに戻ることはできません。現在、これら2つのタイプのルーティングを組み合せて使用するオプションはありません。

    動的ルーティング・オプションを選択した後のメディエータ・エディタは、図20-32のようになります。

    図20-32 動的ルーティング・ルールが表示されたメディエータ・エディタ

    図20-32の説明は次にあります。
    「図20-32 動的ルーティング・ルールが表示されたメディエータ・エディタ」の説明

    ソース・ビューは次のように変更されます。

    <Mediator name="Shipment" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xmlns="http://xmlns.oracle.com/sca/1.0/mediator">
     <operation name="execute" deliveryPolicy="AllOrNothing" priority="0">
      <switch decisionServiceRef="Phase1DecisionService"
              decisionServiceOperation="executeFunction"></switch>
     </operation>
    </Mediator>
    

    switch要素には、デシジョン・サービス参照および操作の詳細が含まれています。これによって、Oracle Mediatorサービス・コンポーネントは、動的ルーティング・デシジョンを取得するためのデシジョン・サービスを実行時に起動できます。動的デシジョンは、実行時のビジネス・ルール・サービス・エンジン・ユーザー構成によって返されます。

    外部サービスの起動には、bindingInfoという特別な属性が含まれます。この属性には、起動を動的にするためのバインディング情報が含まれています。

20.2.4 動的ルーティング・ルールの使用に関する注意事項

Oracle Mediatorで動的ルーティング・ルールを使用する場合は、次の制限に注意してください。

  • 現在は、SOAPバインディングのみがサポートされています。composite.xmlファイルには、ダミーのSOAPバインディングが作成されます。このエンドポイントは、NMプロパティを介して実行時にOracle Mediatorによって上書きされます。このため、アウトバウンド・サービスはSOAPを介してのみコールできます。

  • 動的ルーティング・ルールによってペイロード操作が制限されます。割当て、トランスフォーメーションまたは検証は実行できません。

  • 参照WSDLファイル(レイヤー2またはコールした参照)には、自動的に作成されるフェーズ参照と同じ抽象的なWSDLファイルが必要です。

  • 動的ルーティングは、同期インタフェースまたは一方向インタフェースを使用するメディエータには使用できません。

20.2.5 デフォルト・ルーティング・ルールの定義方法

Oracle Mediatorでは、ルーティング・ルールで指定された条件に従ってメッセージが処理されます。ルーティング・ルールで指定されたいずれの条件も満たさないために、受信メッセージが処理されない場合もあります。このようなメッセージに使用するデフォルト・ルーティング・ルールを定義できます。デフォルト・ルーティング・ルールは、他のルーティング・ルールの条件がいずれも満たされない場合に実行されます。

デフォルト・ルーティング・ルールは、第20.2.2項「静的ルーティング・ルールの作成方法」で説明したルーティング・ルールと同じです。デフォルト・ルーティング・ルールが他のルーティング・ルールと異なる唯一の点は、デフォルト・ルーティング・ルールには関連する条件がないことです。それ以外は、ターゲット・サービス、レスポンス処理、フォルト処理などすべてにおいて、デフォルト・ルーティング・ルールは他のルーティング・ルールと同じです。


注意:

  • デフォルト・ルールは、静的ルーティング・ルールに対してのみ使用できます。

  • 動的ルーティング・ルールを使用するOracle Mediatorサービス・コンポーネントにデフォルト・ルーティング・ルールを指定することはできません。これは、同じOracle Mediatorサービス・コンポーネントに静的ルーティング・ルールと動的ルーティング・ルールの両方を定義することはできないためです。


20.2.5.1 デフォルト・ルールのシナリオ

デフォルト・ルーティング・ルールは、順次ルールまたはパラレル・ルールのいずれかに設定できます。順次またはパラレルに関係なく、デフォルト・ルーティング・ルールは、他のルーティング・ルールの条件が満たされない場合に実行されることが保証されています。デフォルト・ルールが実行された場合、Oracle Mediatorの監査証跡には、すべてのルーティング・ルールのフィルタ条件が満たされず、デフォルト・ルーティング・ルールのフィルタ条件が満たされて実行されたことが示されます。例20-21に詳細を示します。

例20-21 デフォルト・ルールのシナリオ

ActivityJan 7, 2010 4:35:15 PM 
Message onCase "fileout2.Write" 
Jan 7, 2010 4:35:15 PM 
Message Evaluation of xpath condition " No Filter (DEFAULT CASE) " resulted 
true

デフォルト・ルーティング・ルールも含めて、すべてのルーティング・ルールは順次またはパラレルのルーティング・ルールとして定義できるため、想定されるルーティング・ルールの動作は多数あります。次の各項では、各組合せと想定される動作について説明します。

順次のデフォルト・ルーティング・ルール

順次のデフォルト・ルーティング・ルールでは、次のシナリオが考えられます。

  • メディエータの他のルーティング・ルールがすべて順次の場合: これは、デフォルト・ルーティング・ルールも含めて、すべてのルーティング・ルールのタイプが順次である最も単純なケースです。すべてのルーティング・ルールのフィルタ条件が実行時に評価され、いずれのフィルタ条件も一致しない場合は、順次のデフォルト・ルーティング・ルールが実行されます。順次のデフォルト・ルーティング・ルールは、受信メッセージと同じトランザクションで実行されます。デフォルト・ルールの実行後に、事後Javaコールアウトが発生します。

  • メディエータのルーティング・ルールの少なくとも1つがパラレルである場合: これは、デフォルト・ルーティング・ルールが順次であり、他のルーティング・ルールの少なくとも1つがパラレルである複雑なケースです。実行時のデフォルトの動作では、最初に順次ルーティング・ルールがすべて実行された後で、パラレルのルーティング・ルールが実行されます。したがって、デフォルト・ルールは、他のすべてのルーティング・ルールがfalseであると評価された後でのみ実行する必要があるため注意が必要です。

    この場合、サーバーでは、最初にパラレル・ルールのフィルタ条件が評価された後でデフォルト・ルーティング・ルールのフィルタ条件が評価されます。他のいずれのフィルタ条件も一致しない場合は、順次のデフォルト・ルーティング・ルールが実行されます。

パラレルのデフォルト・ルーティング・ルール

パラレルのデフォルト・ルーティング・ルールでは、次のシナリオが考えられます。

  • メディエータの他のルーティング・ルールがすべてパラレルの場合: これは簡単なケースです。デフォルト・ルーティング・ルールは、他のルーティング・ルールで指定されたいずれかのフィルタ条件が一致する場合は実行されません。フィルタ条件がいずれも一致しない場合は、デフォルト・ルーティング・ルールが非同期で実行されます。

  • メディエータの他のルーティング・ルールが順次またはパラレルである場合: これは複雑ですが一般的なユースケースです。使用可能な他の順次またはパラレルのルーティング・ルールがあり、デフォルト・ルーティング・ルールがパラレルの場合です。デフォルト・ルーティング・ルールは、他の順次またはパラレルのルーティング・ルール基準のいずれかが一致した場合は実行されません。条件がいずれも一致しない場合は、デフォルト・ルーティング・ルールが非同期で実行されます。


注意:

デフォルト・ルーティング・ルールが自動的に実行されるということは、デフォルト・ルーティング・ルールが、特定のOracle Mediatorサービス・コンポーネントに対して実行された唯一のケースであることを意味します。同様に、Oracle Mediatorサービス・コンポーネントに、フィルタ条件が指定されていない1つのルーティング・ルールがあり、デフォルト・ルーティング・ルールもある場合、そのデフォルト・ルーティング・ルールが実行されることはありません。

20.2.5.2 デフォルト・ルールのターゲット

デフォルト・ルーティング・ルールのターゲットは、他の既存ルーティング・ルールのサポートされているターゲットと同じです。つまり、ターゲットにはサービス、イベントまたはエコーを設定できます。同様に、デフォルト・ルーティング・ルールのターゲット・サービスからのレスポンスは、コール元に転送するか、返すことができます。ターゲット・サービスからフォルトが返された場合は、他のルーティング・ルールで処理される場合と同様に処理されます。


注意:

他のルーティング・ルールの評価または実行時に例外が発生した場合、デフォルト・ルーティング・ルールは実行されません。

20.2.5.3 デフォルト・ルール: 検証、トランスフォーメーションおよび割当て機能

デフォルト・ルーティング・ルールのSchematron検証、トランスフォーメーションおよび割当機能は、他のルーティング・ルールと同様に動作します。

20.2.5.4 デフォルト・ルール: Javaコールアウト

事前Javaコールアウトまたは事後Javaコールアウトの現在の動作は、他のルーティング・ルールの場合と同様です。Javaコールアウトの目的では、デフォルト・ルーティング・ルールは別のルーティング・ルールとみなされます。したがって、デフォルト・ルーティング・ルールが実行されるシナリオの場合、postRouting()コールバック・メソッドは、デフォルト・ルーティング・ルールが実行された後でのみ発生します。


注意:

事後Javaコールアウトは、順次ルールの実行後に発生し、パラレル・ルールの実行の完了は待機しません。したがって、デフォルト・ルーティング・ルールが順次の場合、postRouting()コールバック・メソッドは、デフォルト・ルーティング・ルールの実行後に発生します。デフォルト・ルーティング・ルールがパラレルの場合、postRouting()コールバックは、すべての順次ルールが実行された後に発生し、パラレルのデフォルト・ルーティング・ルールの実行は待機しません。

20.2.5.5 デフォルト・ルール: メディエータ.mplanファイル

ルーティング・ルールをデフォルト・ルーティング・ルールとして設定するには、図20-2に示すデフォルト・ルーティング・ルールとして設定アイコンをクリックします。.mplanファイルは、図20-33に示すように変わります。

図20-33 デフォルト・ルーティング・ルールが設定されたOracle Mediatorの.mplanファイル

Description of Figure 20-33 follows
「図20-33 デフォルト・ルーティング・ルールが設定されたOracle Mediatorの.mplanファイル」の説明

20.3 メッセージ・ルーティング用Oracle Mediatorの作成

CustomerRouterユースケースは、SOAコンポジット・サンプル・アプリケーションのOracle Mediatorを使用してメッセージをルーティングする方法の概要を説明します。この項で説明するサンプル・ファイルをダウンロードするには、次のURLを参照してください。

http://www.oracle.com/technology/sample_code/products/soa

CustomerRouterユースケースは次の手順で構成されます。

  1. ReadCustという名前のアダプタ・サービスにより、レガシーのcustomerファイルがディレクトリから取得されます。

  2. ReadCustアダプタ・サービスがファイル・データをCustomerRouter Oracle Mediatorに送信します。

  3. CustomerRouter Oracle MediatorはXMLメッセージ・ペイロードにフィルタを適用し、メッセージをUSCustomer参照とCanadaCustomer参照のどちらにルーティングするか決定します。

  4. 次にCustomerRouter Oracle Mediatorはメッセージをアダプタ参照で必要となる構造に変換します。

  5. 外部参照はメッセージを関連する外部アプリケーションに配信します。

図20-34は、CustomerRouterユースケースの概要を示しています。

図20-34 CustomerRouterユースケースの概要

図20-34の説明は次にあります。
「図20-34 CustomerRouterユースケースの概要」の説明

20.3.1 CustomerRouterユースケースの作成方法

この項では、ユースケースの作成、構築およびデプロイの設計時タスクを説明します。

20.3.1.1 タスク1: Oracle Jdeveloperのアプリケーションおよびプロジェクトの作成方法

Oracle JDeveloperのアプリケーションおよびプロジェクトを作成する手順は、次のとおりです。

  1. Oracle JDeveloperで「ファイル」をクリックし、「新規」を選択します。

    「新規ギャラリ」ダイアログが表示されます。

  2. 「新規ギャラリ」で「一般」ノードを開き、「アプリケーション」カテゴリを選択します。

  3. 「項目」リストで「SOAアプリケーション」を選択し、「OK」をクリックします。

    SOAアプリケーションの作成ウィザードが表示されます。

  4. 「アプリケーション名」フィールドにCustomerRouterと入力し、「次へ」をクリックします。

    「プロジェクトの名前付け」ページが表示されます。

  5. 「プロジェクト名」フィールドにCustomerRouterProjectと入力し、「次へ」をクリックします。

    SOA設定の構成ページが表示されます。

  6. 「コンポジット・テンプレート」リストから「空のコンポジット」を選択し、「終了」をクリックします。

    Oracle JDeveloperの「アプリケーション・ナビゲータ」には新規のアプリケーションやプロジェクトが移入され、SOAコンポジット・エディタには空白のパレットがあります。

  7. 「ファイル」メニューから「すべて保存」を選択します。

20.3.1.2 タスク2: CustomerRouter Oracle Mediatorサービス・コンポーネントの作成方法

CustomerRouter Oracle Mediatorサービス・コンポーネントを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から「SOA」を選択します。

  2. 「メディエータ」アイコンを「コンポーネント」セクションにドラッグ・アンド・ドロップします。

    「メディエータの作成」ダイアログが表示されます。

  3. 「名前」フィールドに、CustomerRouterと入力します。

  4. 「テンプレート」リストから、「インタフェースを後で定義」を選択します。

  5. 「OK」をクリックします。

    CustomerRouterという名前のOracle Mediatorが作成されます。

20.3.1.3 タスク3: ファイル・アダプタ・サービスの作成方法

ディレクトリからXMLファイルを読み取るには、ReadCustという名前のファイル・アダプタ・サービスを作成する必要があります。


注意:

Oracle Mediatorは、Oracle Real Application Clusters(RAC)の計画的停止に対して実行する際、同じファイルを2回処理する可能性があります。これは、ファイル・アダプタがXAに準拠していないアダプタであるためです。したがって、グローバル・トランザクションに組み入れると、各ファイルを1回のみ処理するXAインタフェース仕様に逸脱する可能性があります。

ファイル・アダプタ・サービスを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から「SOA」を選択します。

  2. 「ファイル・アダプタ」を選択し、「公開されたサービス」スイムレーンにドラッグします。

    アダプタ構成ウィザードの「ようこそ」ページが表示されます。

  3. 「次へ」をクリックします。

    「サービス名」ページが表示されます。

  4. 「サービス名」フィールドに、ReadCustと入力します。

  5. 「次へ」をクリックします。

    「アダプタ・インタフェース」ページが表示されます。

  6. 「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。

    「操作」ページが表示されます。

  7. 「操作タイプ」フィールドで、「Read File」を選択します。

  8. 「操作名」フィールドで、ReadReadFileに置換します。

  9. 「次へ」をクリックします。

    「ファイル・ディレクトリ」ページが表示されます。

  10. 「着信ファイル用のディレクトリ(物理パス)」フィールドに、ファイルの読取り先のディレクトリを入力します。たとえば、C:\Customer\Inと入力します。

  11. 「次へ」をクリックします。

    「ファイルのフィルタ処理」ページが表示されます。

  12. 「インクルード・ファイルの名前パターン」フィールドに*.xmlと入力し、「次へ」をクリックします。

    「ファイル・ポーリング」ページが表示されます。

  13. 「ポーリング頻度」フィールドの値を10に変更し、「次へ」をクリックします。

    「メッセージ」ページが表示されます。

  14. 「URL」フィールドの右側にある「検索」をクリックします。

    「タイプ・チューザ」ダイアログが表示されます。

  15. 「スキーマ・ファイルのインポート」をクリックします。

    「スキーマ・ファイルのインポート」ダイアログが表示されます。

  16. 「URL」フィールドの右側にある「検索」をクリックし、Samplesフォルダに存在するLegacyCustomer.xsdファイルを選択します。

  17. 「OK」をクリックします。

  18. 図20-35に示すように、「タイプ・エクスプローラ」→「インポートしたスキーマ」→「LegacyCustomer.xsd」の順にナビゲーション・ツリーを開き、「CustomerData」を選択します。

    図20-35 「タイプ・チューザ」 - CustomerData

    図20-35の説明は次にあります。
    「図20-35 「タイプ・チューザ」 - CustomerData」の説明

  19. 「OK」をクリックします。

    図20-36に示すように、アダプタ構成ウィザードが表示されます。

    図20-36 アダプタ構成ウィザード – 「メッセージ」ページ

    図20-36の説明は次にあります。
    「図20-36 アダプタ構成ウィザード – 「メッセージ」ページ」の説明

  20. 「次へ」をクリックします。

    「終了」ページが表示されます。

  21. 「終了」をクリックします。

  22. 「ファイル」メニューから「すべて保存」を選択します。

20.3.1.4 タスク4: ファイル・アダプタ参照の作成方法

USCustomerファイル・アダプタ参照を作成します。

ファイル・アダプタ参照を作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から「SOA」を選択します。

  2. 「ファイル・アダプタ」を選択し、「外部参照」スイムレーンにドラッグします。

    アダプタ構成ウィザードの「ようこそ」ページが表示されます。

  3. 「次へ」をクリックします。

    「サービス名」ページが表示されます。

  4. 「サービス名」フィールドに、USCustomerと入力します。

  5. 「次へ」をクリックします。

    「アダプタ・インタフェース」ページが表示されます。

  6. 「操作およびスキーマから定義(後で指定)」を選択し、「次へ」をクリックします。

    「操作」ページが表示されます。

  7. 「次へ」をクリックします。

    「操作」ページが表示されます。

  8. 「操作タイプ」フィールドで、「Write File」を選択します。

  9. 「操作名」フィールドにWriteFileと入力します。

  10. 「次へ」をクリックします。

    「ファイル構成」ページが表示されます。

  11. 「発信ファイルのディレクトリ(物理パス)」フィールドに、ファイルを書き込むディレクトリの名前を入力します。

    たとえば、C:\Customer\outと入力します。

  12. ファイル・ネーミング規則フィールドにcustomer_%SEQ%.xmlと入力して、「次へ」をクリックします。

    「メッセージ」ページが表示されます。

  13. 「URL」フィールドの右側にある「検索」をクリックします。

    「タイプ・チューザ」ダイアログが表示されます。

  14. 「スキーマ・ファイルのインポート」をクリックします。

    「スキーマ・ファイルのインポート」ダイアログが表示されます。

  15. 「URL」フィールドの右側にある「検索」をクリックし、Samplesフォルダに存在するUSCustomer.xsdファイルを選択します。

  16. 「OK」をクリックします。

  17. 「タイプ・エクスプローラ」→「インポートしたスキーマ」→「USCustomer.xsd」の順にナビゲーション・ツリーを開き、「Customer」を選択します。

  18. 「OK」をクリックします。

  19. 「次へ」をクリックします。

    「終了」ページが表示されます。

  20. 「終了」をクリックします。

  21. 「ファイル」メニューから「すべて保存」をクリックします。

CanCustomer.xsdファイルを使用して、同様にCanadaCustomerという別のファイル・アダプタ参照を作成します。

図20-37は、このタスク終了後に、SOAコンポジット・エディタがどのように表示されるかを示しています。

図20-37 アダプタ・サービスと参照があるOracle Mediatorサービス・コンポーネント

図20-37の説明は次にあります。
「図20-37 アダプタ・サービスと参照があるOracle Mediatorサービス・コンポーネント」の説明

20.3.1.5 タスク5: ルーティング・ルールの指定方法

メッセージが経由するReadCustアダプタ・サービスから外部参照へのパスを指定する必要があります。

ルーティング・ルールを指定する手順は、次のとおりです。

  1. 図20-38に示すように、ReadCustサービスをCustomerRouter Oracle Mediatorに接続します。

    この操作により、ファイルを入力ディレクトリから読み込む間に、CustomerRouter Oracle Mediatorを起動するファイル・アダプタ・サービスが指定されます。

    図20-38 ReadCustサービスからCustomerRouter Oracle Mediatorへの接続

    図20-38の説明は次にあります。
    「図20-38 ReadCustサービスからCustomerRouter Oracle Mediatorへの接続」の説明

  2. メディエータ・エディタで、CustomerRouter Oracle Mediatorをダブルクリックします。

  3. 「ルーティング・ルール」セクションで、ReadFileの最も右側にある「追加」をクリックし、次に「静的ルーティング・ルール」をクリックします。

    「ターゲット・タイプ」ダイアログが表示されます。

  4. 「サービス」をクリックします。

    「ターゲット・サービス」ダイアログが表示されます。

  5. 図20-39に示すように、「CustomerRouterProject」「参照」「USCustomer」の順に移動し、「WriteFile」を選択します。

    図20-39 「ターゲット・サービス」ダイアログ

    図20-39の説明は次にあります。
    「図20-39 「ターゲット・サービス」ダイアログ」の説明

  6. 「OK」をクリックします。

    「ルーティング・ルール」セクションが表示されます。

  7. 「<<フィルタ式>>」フィールドの横にある「フィルタ」アイコンをクリックして、このルーティング・ルールのフィルタ式を作成します。

    「式ビルダー」ダイアログが表示されます。

  8. 「変数」フィールドで、「変数」「in」「body」「imp1:CustomerData」の順に移動し、「Country」を選択します。

  9. 「Country」をダブルクリックします。

    図20-40に示すように、「Country」ノードが「式」フィールドに追加されます。

    図20-40 「式ビルダー」ダイアログ

    図20-40の説明は次にあります。
    「図20-40 「式ビルダー」ダイアログ」の説明

  10. 式を次のように変更します。

    $in.CustomerData/imp1:CustomerData/Country='US'
    
  11. 「OK」をクリックします。

    「ルーティング・ルール」セクションの「<<フィルタ式>>」フィールドに式が移入されます。

  12. 「次を使用して変換」フィールドの右側にあるアイコンをクリックします。

    図20-41に示すように、「リクエスト・トランスフォーメーション・マップ」ダイアログが表示されます。

    図20-41 リクエスト・トランスフォーメーション・マップ

    図20-41の説明は次にあります。
    「図20-41 リクエスト・トランスフォーメーション・マップ」の説明

  13. 「新規マッパー・ファイルの作成」を選択し、「OK」をクリックします。

    図20-42に示すように、「CustomerData_To_Customer.xsl」ファイルが追加されます。

    図20-42 「CustomerData_To_Customer.xsl」ファイル – 初期状態

    図20-42の説明は次にあります。
    「図20-42 「CustomerData_To_Customer.xsl」ファイル – 初期状態」の説明

  14. 「imp1:CustomerData」ソース要素を「imp1:Customer」ターゲット要素にドラッグ・アンド・ドロップします。

    「自動マップ・プリファレンス」ダイアログが表示されます。

  15. 「自動マップ中」オプションから、「祖先名を考慮した要素の一致」の選択を解除します。

    図20-43に、「自動マップ・プリファレンス」ダイアログを示します。

    図20-43 「自動マップ・プリファレンス」ダイアログ

    図20-43の説明は次にあります。
    「図20-43 「自動マップ・プリファレンス」ダイアログ」の説明

  16. 「OK」をクリックします。

    図20-44に示すように、「CustomerData_To_Customer.xsl」ファイルが表示されます。

    図20-44 「CustomerData_To_Customer.xsl」タブ – 自動マップ接続

    図20-44の説明は次にあります。
    「図20-44 「CustomerData_To_Customer.xsl」タブ – 自動マップ接続」の説明

  17. 「ファイル」メニューから「すべて保存」を選択します。

  18. 手順317を繰り返し、ターゲット・サービスにCanadaCustomer参照を作成します。「式ビルダー」ダイアログで、次の式を指定します。


    注意:

    手順を繰り返すときは、メディエータ・エディタを閉じるか、またはエディタの上にあるCustomerRouter.mplanタブをクリックして、メディエータ・エディタを再度開く必要があります。

    $in.CustomerData/imp1:CustomerData/Country='CA'
    

    この項で説明した手順をすべて実行すると、図20-34に示すように、SOAコンポジット・エディタが表示されます。

20.3.1.6 タスク6: アプリケーション・サーバー接続の作成方法

SOAコンポジット・アプリケーションをデプロイするには、アプリケーション・サーバー接続が必要です。アプリケーション・サーバー接続の作成方法の詳細は、第41.7.1.1.1項「アプリケーション・サーバー接続の作成」を参照してください。

20.3.1.7 タスク7: CustomerRouterProjectのデプロイ方法

次の手順で、CustomerRouterProjectコンポジット・アプリケーションをアプリケーション・サーバーにデプロイします。

  • アプリケーション・デプロイメント・プロファイルの作成

  • アプリケーション・サーバーへのアプリケーション・デプロイメント・プロファイルのデプロイ

これらの手順の詳細は、第41.7.1項「Oracle JDeveloperでの単一のSOAコンポジットのデプロイ」を参照してください。

20.3.2 CustomerRouterProjectアプリケーションの実行と監視

デプロイしたCustomerRouterProjectアプリケーションは、入力XMLファイルを入力フォルダにコピーすることで実行できます。ペイロード・ファイルは、指定した出力ディレクトリに書き込まれます。

実行中のインスタンスの監視には、次のURLにあるOracle Enterprise Manager Fusion Middleware Controlコンソールを使用できます。

http://hostname:port_number/em

ここで、hostnameは、Oracle SOA Suiteインフラストラクチャをインストールしたホストです。port_numberは、Oracle Enterprise Manager Fusion Middleware Controlコンソールがインストールされているサーバーのポートです。

これらの手順の詳細は、第41.7.1項「Oracle JDeveloperでの単一のSOAコンポジットのデプロイ」を参照してください。

20.4 Oracle Mediatorを使用した非同期リクエストとレスポンスの作成

このサンプルでは、Oracle Mediatorを使用した非同期リクエスト・レスポンスのシナリオを示します。サンプルのコンポジットにはOracle Mediatorを起動するクライアントBPELプロセスがあり、Oracle MediatorはサーバーBPELプロセスを起動します。起動はすべて非同期リクエスト・レスポンスとして行われます。

図20-45は、AsyncMediatorユースケースの概要を示しています。

図20-45 AsyncMediatorユースケースの概要

図20-45の説明は次にあります。
「図20-45 AsyncMediatorユースケースの概要」の説明

この項で説明するサンプル・ファイルをダウンロードするには、次のURLを参照してください。

http://www.oracle.com/technology/sample_code/products/soa

20.4.1 AsyncMediatorユースケースの作成方法

この項では、ユースケースの作成、構築およびデプロイの設計時タスクを説明します。これらのタスクは、表示されている順番で実行する必要があります。

20.4.1.1 タスク1: Oracle Jdeveloperのアプリケーションおよびプロジェクトの作成方法

Oracle JDeveloperのアプリケーションおよびプロジェクトを作成する手順は、次のとおりです。

  1. Oracle JDeveloperで「ファイル」をクリックし、「新規」を選択します。

    「新規ギャラリ」ダイアログが表示されます。

  2. 「新規ギャラリ」で「一般」ノードを開き、「アプリケーション」カテゴリを選択します。

  3. 「項目」リストで「SOAアプリケーション」を選択し、「OK」をクリックします。

    SOAアプリケーションの作成ウィザードが表示されます。

  4. 「アプリケーション名」フィールドにAsyncMediatorと入力し、「次へ」をクリックします。

    「プロジェクトの名前付け」ページが表示されます。

  5. 「プロジェクト名」フィールドにAsyncMediatorSampleと入力し、「次へ」をクリックします。

    SOA設定の構成ページが表示されます。

  6. 「コンポジット・テンプレート」リストで「空のコンポジット」を選択し、「終了」をクリックします。

    Oracle JDeveloperの「アプリケーション・ナビゲータ」には新規のアプリケーションやプロジェクトが移入され、SOAコンポジット・エディタには空白のパレットがあります。

  7. 「ファイル」メニューから「すべて保存」をクリックします。

20.4.1.2 タスク2: サーバーBPELプロセスの作成方法

サーバーBPELプロセスを作成する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、「composite.xml」をダブルクリックします。SOAコンポジット・エディタが表示されます。

  2. 「コンポーネント・パレット」から「SOA」を選択します。

  3. 「BPELプロセス」「コンポーネント」セクションにドラッグ・アンド・ドロップします。

    「BPELプロセスの作成」ダイアログが表示されます。

  4. 「名前」フィールドに、ServerBPELProcessと入力します。

  5. 「テンプレート」リストから、「非同期BPELプロセス」を選択します。

  6. 「SOAPサービスとして公開」の選択を解除して、「OK」をクリックします。SOAコンポジット・エディタにServerBPELProcessが作成されます。

20.4.1.3 タスク3: Oracle Mediatorサービス・コンポーネントの作成方法

Mediatorという名前のOracle Mediatorサービス・コンポーネントを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から「SOA」を選択します。

  2. 「メディエータ」「コンポーネント」セクションにドラッグ・アンド・ドロップします。

    「メディエータの作成」ダイアログが表示されます。

  3. 「名前」フィールドに、Mediatorと入力します。

  4. 「テンプレート」リストから、「非同期インタフェース」を選択します。

  5. 「SOAPバインディングを持つコンポジット・サービスの作成」の選択を解除します。

  6. 「OK」をクリックします。

    図20-46に示すように、Mediatorという名前のOracle Mediatorが作成されます。

    図20-46 コンポジット・ウィンドウ内のOracle MediatorとServerBPELProcess

    図20-46の説明は次にあります。
    「図20-46 コンポジット・ウィンドウ内のOracle MediatorとServerBPELProcess」の説明

  7. 「Mediator」Oracle Mediatorをダブルクリックします。

    メディエータ・エディタが表示されます。

  8. 「ルーティング・ルール」セクションで、executeの最も右側にある「追加」をクリックし、次に「静的ルーティング・ルール」を選択します。

    「ターゲット・タイプ」ダイアログが表示されます。

  9. 「サービス」を選択します。

    「ターゲット・サービス」ダイアログが表示されます。

  10. 図20-47に示すように、「AsyncMediatorSample」「BPELプロセス」「ServerBPELProcess」「サービス」「serverbpelprocess_client」「process」の順に移動します。

    図20-47 「ターゲット・サービス」ダイアログ

    図20-47の説明は次にあります。
    「図20-47 「ターゲット・サービス」ダイアログ」の説明

  11. 「OK」をクリックします。

  12. 「<<フィルタ式>>」フィールドの下の「次を使用して変換」フィールドの右側にあるアイコンをクリックします。

    「リクエスト・トランスフォーメーション・マップ」ダイアログが表示されます。

  13. 「新規マッパー・ファイルの作成」を選択し、「OK」をクリックします。

    XSLTマッパーが表示され、singleString_To_process.xslというターゲット・ファイルが追加されます。

  14. 「cb1:input」ソース要素を「client:input」ターゲット要素にドラッグ・アンド・ドロップします。

    「自動マップ・プリファレンス」ダイアログが表示されます。

  15. 「自動マップ中」オプションから、「祖先名を考慮した要素の一致」の選択を解除し、「OK」をクリックします。

    図20-48に示すように、XSLTマッパーが表示されます。

    図20-48 「singleString_To_process.xsl」ウィンドウ

    図20-48の説明は次にあります。
    「図20-48 「singleString_To_process.xsl」ウィンドウ」の説明

  16. 「ルーティング・ルール」セクションで、「コールバック」にある「次を使用して変換」フィールドの右側にあるアイコンをクリックします。

    「リクエスト・トランスフォーメーション・マップ」ダイアログが表示されます。

  17. 「新規マッパー・ファイルの作成」を選択し、「OK」をクリックします。

    XSLTマッパーが表示され、processResponse_To_singleString.xslというターゲット・ファイルが追加されます。

  18. 「client:processResponse」ソース要素を「cb1:singleString」ターゲット要素にドラッグ・アンド・ドロップします。

    「自動マップ・プリファレンス」ダイアログが表示されます。

  19. 「自動マップ中」オプションから、「祖先名を考慮した要素の一致」の選択を解除し、「OK」をクリックします。

20.4.1.4 タスク4: クライアントBPELプロセスの作成方法

クライアントBPELプロセスを作成する手順は、次のとおりです。

  1. 「アプリケーション・ナビゲータ」で、「composite.xml」をダブルクリックします。SOAコンポジット・エディタが表示されます。

  2. 「コンポーネント・パレット」から「SOA」を選択します。

  3. 「BPELプロセス」「コンポーネント」セクションにドラッグ・アンド・ドロップします。

    「BPELプロセスの作成」ダイアログが表示されます。

  4. 「名前」フィールドに、ClientBPELProcessと入力します。

  5. 「テンプレート」リストから、「非同期BPELプロセス」を選択します。

  6. 「OK」をクリックします。

    SOAコンポジット・エディタにClientBPELProcessが作成されます。

  7. 「ClientBPELProcess」BPELプロセスを「Mediator」Oracle Mediatorにドラッグ・アンド・ドロップします。SOAコンポジット・エディタは、図20-45に示すように表示されます。

20.4.1.5 タスク5: invoke、receiveおよびassignアクティビティの作成方法

invokeアクティビティを作成する手順は、次のとおりです。

  1. 「ClientBPELProcess」をダブルクリックします。Oracle BPELデザイナが表示されます。

  2. 「コンポーネント・パレット」から設計領域にinvokeアクティビティをドラッグ・アンド・ドロップします。

  3. invokeアクティビティをダブルクリックします。「Invoke」ダイアログが表示されます。

  4. 「名前」フィールドに、InvokeMediatorと入力します。

  5. 「パートナ・リンク」フィールドの横の「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。

  6. 「操作 - execute」を選択して、「OK」をクリックします。

  7. 「Invoke」ダイアログで、「変数」フィールドの右側にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

  8. 「変数」フィールドにInvokeMediator_execute_InputVariable_1と入力し、「OK」をクリックします。「Invoke」ダイアログが表示されます。

  9. 「OK」をクリックします。Oracle BPELデザイナが表示されます。

receiveアクティビティを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」から設計領域にreceiveアクティビティをドラッグ・アンド・ドロップします。

  2. receiveアクティビティをダブルクリックします。「Receive」ダイアログが表示されます。

  3. 「名前」フィールドに、ReceiveFromMediatorと入力します。

  4. 「パートナ・リンク」フィールドの横の「パートナ・リンクの参照」をクリックします。「パートナ・リンク・チューザ」ダイアログが表示されます。

  5. 「操作 - callback」を選択して、「OK」をクリックします。

  6. 「Receive」ダイアログで、「変数」フィールドの右側にある「変数の自動作成」アイコンをクリックします。「変数の作成」ダイアログが表示されます。

  7. デフォルトの変数名を選択し、「OK」をクリックします。デフォルトの変数名が「変数」フィールドに移入されます。

  8. 「インスタンスの作成」を選択して、「OK」をクリックします。Oracle BPELデザイナが表示されます。

assignアクティビティを作成する手順は、次のとおりです。

  1. 「コンポーネント・パレット」からassignアクティビティをドラッグし、設計領域のReceiveFromMediatorアクティビティとInvokeMediatorアクティビティの間にドロップします。

  2. assignアクティビティをダブルクリックします。「Assign」ダイアログが表示されます。

  3. 「名前」フィールドに、AssignRequestと入力します。

  4. 「コピー操作」タブをクリックします。「Assign」ダイアログが表示されます。

  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。

  6. 図20-49に示すように、トリガー・ファイル名とファイル変数の間にコピー操作を作成します。

    図20-49 「コピー操作の作成」ダイアログ

    図
    「図20-49 「コピー操作の作成」ダイアログ」の説明

  7. 「コピー操作の作成」ダイアログで「OK」をクリックします。

  8. 図20-50に示すように、「OK」をクリックしてOracle BPELデザイナに戻ります。

    図20-50 Oracle JDeveloper - ClientBPELProcess.bpel

    図
    「図20-50 Oracle JDeveloper - ClientBPELProcess.bpel」の説明

  9. 「ファイル」メニューから「すべて保存」を選択します。

assignアクティビティをServerBPELProcessで作成する手順は、次のとおりです。

  1. 「ServerBPELProcess」BPELプロセスをダブルクリックします。Oracle BPELデザイナが表示されます。

  2. 「コンポーネント・パレット」からassignアクティビティをドラッグし、設計領域のreceiveInputアクティビティとcallbackClientアクティビティの間にドロップします。

  3. assignアクティビティをダブルクリックします。「Assign」ダイアログが表示されます。

  4. 「コピー操作」タブをクリックします。

  5. 「コピー操作」を選択します。「コピー操作の作成」ダイアログが表示されます。

  6. 図20-51に示すように、トリガー・ファイル名とファイル変数の間にコピー操作を作成します。

    図20-51 「コピー操作の作成」ダイアログ

    図
    「図20-51 「コピー操作の作成」ダイアログ」の説明

  7. 「コピー操作の作成」ダイアログで「OK」をクリックします。

  8. 図20-52に示すように、「OK」をクリックしてOracle BPELデザイナに戻ります。

    図20-52 Oracle JDeveloper - ServerBPELProcess.bpel

    図
    「図20-52 Oracle JDeveloper - ServerBPELProcess.bpel」の説明

  9. 「ファイル」メニューから「すべて保存」を選択します。

20.4.1.6 タスク6: アプリケーション・サーバー接続の構成方法

SOAコンポジット・アプリケーションをデプロイするには、アプリケーション・サーバー接続が必要です。アプリケーション・サーバー接続の作成方法の詳細は、第41.7.1.1.1項「アプリケーション・サーバー接続の作成」を参照してください。

20.4.1.7 タスク7: SOAコンポジット・アプリケーションのデプロイ方法

次の手順で、EventMediatorAppコンポジット・アプリケーションをOracle WebLogic Serverにデプロイします。

  • アプリケーション・デプロイメント・プロファイルの作成

  • アプリケーション・サーバーへのアプリケーションのデプロイ

これらの手順の詳細は、第41.7.1項「Oracle JDeveloperでの単一のSOAコンポジットのデプロイ」を参照してください。