[SOA] SOA 11g & SAP – Single Channel/Program ID for Multiple IDOCs

原文はこちら。
https://blogs.oracle.com/ateamsoab2b/entry/soa_11g_sap_single_channel

SAP R/3とSOA Suiteを統合しようとした場合に推奨される方法は、Oracle Application Adapter for SAP R/3 (SAP JCo 3.0) です。

Oracle® Fusion Middleware Application Adapter for SAP R/3 (SAP JCo 3.0) User's Guide for Oracle WebLogic Server 11g Release 1 (11.1.1.4.0)
http://docs.oracle.com/cd/E17904_01/doc.1111/e17656/toc.htm

このアダプタは数多くのお客様の環境で使われSAPアウトバウンド(アダプタからSAPを呼ぶ)およびインバウンド(SAPからのイベントをアダプタに伝える)の統合がうまくいっています。しかし、製品の種類によっては、こうした機能がただし、製品の機能が及ばなかったり、エッジケースに対しては工夫が必要な場合があります。 SAPアダプタにおけるエッジケースの一つとして、複数のIDOCが同じプログラムIDを共有できるというSAPの機能を利用するものです。標準的な場合、Application Explorer(Oracle Application Adaptersに付属のユーティリティ)で構成したChannelを介して、SAPはIDOCをSAP Adapterに送信します。、SAPアダプタにIDOCを送信するための標準的な場合は、アプリケーション·エクスプローラ(のOracleアプリケーションアダプタに付属のユーティリティ)で行わチャネル構成を使用することです。Application Explorerを使ってOracle JDeveloperのアーティファクトを生成しているときに、ウインドウに赤字で「 You must create a separate channel for each inbound service(インバウンドサービスの各々で異なるチャネルを作成する必要があります)」と明記されていることにお気付きの方もいらっしゃるかもしれません。



Application Explorerでのチャネル定義の理由は、アダプタとSAPシステムで定義されているプログラムID間の相関関係を作成するためです。基本的には、IDOCがリリースされた際にプログラムIDと関連づけられており、これはIDOCを送信するホスト名とポート(つまりチャネル)を見つけるために使われます。アダプタがIDOCを受信すると、最終的に生成されているSOAコンポーネントインスタンスに送信するために、どのパートナーリンクに送信すべきかを決定します。
アダプタの制限の一つに、異なるIDOCなのに同じチャネルを選択している場合、Application Explorerからアーティファクトをエクスポートした際に、生成されたアーティファクトから作成される全てのパートナーリンクが、同じチャンネル/プログラムIDで流れる全てのIDOCのコピーを受け取ってしまう、という問題があります。例えば、あるDEBMAS06とMATMAS05用のアーティファクトが同じチャネルを使って生成されており、DEBMAS06とMATMAS05用の2個のパートナーリンクが作成されるとしましょう。2つのBPELプロセスが作成され、1つはDEBMAS06パートナに、他方はMATMAS05パートナにワイヤリングされている場合、共通チャネル/プログラムIDに対してSAPから発行されたIDOCにかかわらず、両方のBPELプロセスがインスタンス化されてしまいます。

アダプタのこのファンアウトの振る舞いは、多くのIDOCが流れ、チャネル/プログラムIDを各IDOCタイプに定義する管理の手間を省きたいと考えている企業にとって悩みの種ですが、幸いなことに、このシナリオに対する希望があります。ただし、メディエータ・コンポーネントまたはOracle Service Bus(OSB)のいずれかを導入する必要があります。このエントリでは、メディエータを使ったソリューションを取り上げることにします。OSBのソリューションの詳細は以下にあります(OSBを使った、複数のIDOCでシングル·チャンネル/プログラムIDを使うソリューションはまもなくご案内できます)。

アダプタからIDOCのファンアウトを制御する基本的なことは、かなり単純です。
  1. 共通チャネルを流れるIDOCの一つだけを基にして、アプリケーションエクスプローラで作成したアーティファクトを使ってパートナーリンクを作成します(詳細は以下のリンクを参照下さい)。

    Oracle® Fusion Middleware Application Adapter for SAP R/3 (SAP JCo 3.0) User's Guide for Oracle WebLogic Server 11g Release 1 (11.1.1.4.0)
    Configuring a Mediator Inbound Process
    http://docs.oracle.com/cd/E17904_01/doc.1111/e17656/example_esb.htm#CIHIEHCJ

  1. パートナーリンクで指定されているWSDLを使って、メディエータコンポーネントを作成します。

  1. アダプタのパートナーリンクをメディエータをワイヤリングし、メディエータから 共通チャネルを流れる種々のIDOCを取り扱うことができるコンポーネントへワイヤリングします。

重要なことは、このチャネルの全てのIDOC型は、関連するWSDL、XMLスキーマ、JCAファイルに関係なく、構成されたIDOCパートナーリンクに流れていくことを認識しておく必要があります。コンポジット中のBPELプロセスは、一方向インターフェースで作成されており、特定のIDOCタイプを受け入れるようなっています(つまり、アプリケーションエクスプローラで各々のIDOCに対するXMLスキーマが作成されています)。
  1. XMLドキュメントルート要素名に基づいて、メディエータの静的ルーティングの各々に対して、フィルタを追加します。
    [例]
    name($in.event_DEBMAS06/*) = 'DEBMAS06'

  1. 保存し、コンポジットアプリケーションをデプロイします。
パートナリンクを作成するために使われたIDOCのペイロードを評価しているように見えるため、メディエータ内の各静的ルーティングのためのフィルタ式は少し奇妙に思えるかもしれません(例えば、name($in.event_DEBMAS06/*) = 'MATMAS05')。フィルタ式はペイロードのルート要素を評価し、name()関数はIDOCの名前を含む文字列と比較し、ルート要素名を取得します。アダプタからのIDOCの各々には、IDOCタイプの名前を持つルート要素を含んでいますので、それに従ってドキュメントをルーティングすることができます。新しいIDOCをチャンネル/プログラムIDに追加すると、IDOC名に基づいたメディエータの新しい静的ルーティングを設定する必要があります。

0 件のコメント:

コメントを投稿