ABAP Extension Module の動作方法

ABAP Extension Module が提供するほとんどの機能は、SAP アプリケーションの内部で実行されます。 SAP アプリケーションには、すべてのコネクターが実装する必要のある仮想関数のほとんどについて、それに対応する ABAP 機能モジュールがあります。ただし、init()doVerbFor()、および pollForEvents() の各メソッドに固有な要件に対応する ABAP 機能モジュールは SAP から提供されていないため、これらの機能モジュールはコネクター・モジュールの一部として開発され、提供されています。Java コンポーネントもいくつかの機能を提供しますが、これらのメソッドに関する処理の大部分は、SAP アプリケーション内で ABAP コンポーネントによって行われます。

表 7 に、コネクター・モジュールが実装している仮想 Java メソッドと、それに対応する ABAP コンポーネントを示します。これは、コネクターで使用される ABAP コンポーネントの完全なリストでないことに注意してください。

表 7. Java コンポーネントとそれに対応する ABAP コンポーネント
Java コンポーネント ABAP コンポーネント
doVerbFor() /CWLD/RFC_DO_VERB_NEXTGEN
getVersion() 実装不要
getBOHandlerForBO 実装不要
init() /CWLD/RFC_LOGON
pollForEvents() /CWLD/RFC_EVENT_REQUEST /CWLD/RFC_EVENT_RETURN
terminate() 実装不要

これらの ABAP 機能モジュールは、ABAP Extension Module のコアを構成しています。以下のセクションでは、コネクターの初期化、ビジネス・オブジェクトの処理、およびコネクターでのイベント通知の処理方法について説明します。

実装されている機能については、この章の残りの部分で説明します。

初期化

init() メソッドは、宛先の SAP アプリケーションが実行されているかどうか、および ABAP 機能モジュールを実行するために RFC ライブラリーを使用できるかどうかを確認するために、ABAP 機能モジュールの /CWLD/RFC_LOGON を呼び出します。また、/CWLD/RFC_LOGON 機能モジュールは、進行中のすべてのイベントを処理するときにも呼び出されます。イベント検索済みの状況 (イベント表に R とマークされる状況) がマークされたイベント表にあるイベントはすべて、InDoubtEvents コネクター・プロパティーに基づいて処理されます。デフォルトのプロパティー値は、Ignore です。イベント分配が使用されているときは、その特定のコネクターおよびサーバーに属する、状況が 'R' のイベントだけ、そのコネクター・プロパティーに従って処理されます。イベント分配が使用されていないときは、状況が 'R' のすべてのイベントが、そのコネクター・プロパティーに従って処理されます。コネクター・プロパティーが reprocess であるときは、これらのイベントは、キュー (イベント表で Q とマークされる) の状況に変更されます。コネクターでイベントのポーリングを行うときは、'Q' 状況のすべてのイベントが、/CWLD/RFC_E VENT_REQUEST機能モジュールを使用して処理されます。コネクター・プロパティーが FailOnStartUp に設定されている場合は、SAP ログおよびローカル・ログ・ファイル内に致命的エラーが記録され、コネクターがシャットダウンされます。また、致命的エラーが発生したことを通知する E メールもユーザーに送信されます。コネクター・プロパティーが LogError に設定されている場合は、SAP ログおよびローカル・ログ・ファイルの両方にエラーが記録されます。進行中のイベントは処理されず、またコネクターはシャットダウンされません。コネクター・プロパティーが Ignore に設定されている場合、イベント表に進行中のイベントがないかのように、進行中イベントは無視され、コネクターはポーリングします。

それが正常に実行されない場合には、コネクターは終了します。

ビジネス・オブジェクトの処理

SAP 用のすべてのサービス呼び出し要求は、コネクター・モジュールの Java コンポーネントに属する doVerbFor() メソッドにより開始されます。コネクターの ABAP 機能モジュール /CWLD/RFC_DO_VERB_NEXTGEN およびコネクター・モジュールの ABAP コンポーネントに属する ABAP Handler が要求を処理します。

図 5 に、ビジネス・オブジェクト処理を示します。

図 5. doVerbFor() のビジネス・オブジェクト処理


doVerbFor()

コネクター・モジュールの Java コンポーネントの中で、実装された単一のビジネス・オブジェクト・ハンドラーの doVerbFor() メソッドが、統合ブローカーからのすべてのビジネス・オブジェクト要求および pollForEvents() メソッドからのすべてのビジネス・オブジェクト・イベントを処理します。いずれの場合も、doVerbFor() は次のように実行されます。

  1. SAP 用の WebSphere ビジネス・オブジェクトのインスタンスを、このビジネス・オブジェクトのデータを格納している単一の事前定義フラット構造に変換します。
  2. ABAP 機能モジュールの /CWLD/RFC_DO_VERB_NEXTGEN を呼び出し、ビジネス・オブジェクト・データを渡してから、ビジネス・オブジェクト・データが戻されるまで待機します。
  3. 返されたビジネス・オブジェクト・データを、WebSphere ビジネス・オブジェクトに変換します。

doVerbFor() メソッドは、ビジネス・オブジェクト・データを機能モジュール /CWLD/RFC_DO_VERB_NEXTGEN に渡した後、戻されたビジネス・オブジェクト・データから新たなビジネス・オブジェクト構造を作成します。

/CWLD/RFC_DO_VERB_NEXTGEN

コネクター・モジュールの ABAP コンポーネントでは、コネクターの ABAP 機能モジュール /CWLD/RFC_DO_VERB_NEXTGEN が、SAP アプリケーションでのすべての WebSphere ビジネス・オブジェクト処理を実行します。具体的には、ビジネス・オブジェクト・データを適切な ABAP Handler に発送します。この意味で、機能モジュール /CWLD/RFC_DO_VERB_NEXTGEN は、ビジネス・オブジェクト・ルーターと考えることができます。これは次のように実行されます。

  1. ビジネス・オブジェクトを受け取ります。
  2. ビジネス・オブジェクト・データを処理する ABAP Handler を動的に呼び出し、ビジネス・オブジェクト・データをパラメーターとして渡します。
  3. ビジネス・オブジェクト・データを ABAP Handler から受け取り、要求呼び出しに戻します。

/CWLD/RFC_DO_VERB_NEXTGEN は ABAP Handler を使用して、各オブジェクト・タイプおよび動詞固有の要求を実行します。/CWLD/RFC_DO_VERB_NEXTGEN は、ビジネス・オブジェクトの動詞のアプリケーション固有情報の値を使用して、どの ABAP Handler を呼び出すかを決定します。また、アーカイブ状況についても検査します。/CWLD/RFC_DO_VERB_NEXTGEN は、doVerbFor() メソッドから ABAP Handler へのルーターと見なすことができます。

ABAP Handler

ABAP Handler は、コネクター・モジュールの Java コンポーネントに含まれているビジネス・オブジェクト・ハンドラーの機能を拡張するため、コネクター・モジュールに固有です。ABAP Handler は、SAP アプリケーション内に ABAP 機能モジュールとして存在し、/CWLD/RFC_DO_VERB_NEXTGEN と直接通信します。ABAP Handler は、ビジネス・オブジェクト・データを SAP アプリケーション・データベースとの間で出し入れするために必要です。

図 6 に、ABAP Extension Module のビジネス・オブジェクト処理コンポーネントと、それらの相互関係を示します。この図から分かるように、1 つのビジネス・オブジェクト・ハンドラー (doVerbFor()) および ビジネス・オブジェクト・ルーター (/CWLD/RFC_DO_VERB_NEXTGEN ) に対して、複数の ABAP Handler が存在します。

図 6. Adapter 提供のビジネス・オブジェクト処理コンポーネント


ABAP Handler は、ビジネス・オブジェクト・データを SAP アプリケーション・データベースに追加 (Create、Update、Delete) したり、SAP アプリケーション・データベースからデータを検索するためのキーとしてビジネス・オブジェクト・データを使用 (Retrieve) する処理を行います。

アダプターは、汎用の ABAP Handler を提供します。例えば、機能モジュールの /CWLD/DYNAMIC_TRANSACTION は、Create、Update、Delete、および Retrieve 処理について、フラットなビジネス・オブジェクトをサポートします。

WebSphere Business Integration システムはメタデータ・リポジトリーを提供し、アダプターは、フラット・ビジネス・オブジェクトをサポートするため、汎用 ABAP Handler を提供します。さらにアダプターは、階層型ビジネス・オブジェクトをサポートするため、ABAP Handler (/CWLD/IDOC_HANDLER) も提供します。ただし、サポートが必要な各階層型ビジネス・オブジェクトについて、ビジネス・オブジェクト固有の ABAP Handler を追加開発することが必要です。

WebSphere Business Integration システムは、この開発プロセスを容易にするツールを提供しています。ビジネス・オブジェクトおよび ABAP Handler の開発の詳細については、ABAP Extension Module のビジネス・オブジェクトの開発および付録 C, SAPODA を使用したビジネス・オブジェクト定義の生成を参照してください。

イベント通知

イベント通知とは、コネクターに SAP アプリケーション・オブジェクト・イベントを通知する処理の集合のことです。通知には、イベントのタイプ (オブジェクトおよび動詞)、および外部システムが関連データを検索するために必要とするデータ・キーが含まれますが、それだけに限定されません。

図 7 に、pollForEvents() メソッドを使用したイベント通知プロセスを示します。

図 7. イベント通知プロセス


コネクターに対するイベント通知は、次の 2 つの機能から構成されています。

イベント・ポーリング

イベント・ポーリングは、pollForEvents() メソッドにより実行される次の 3 つの機能から構成されます。

注:
これらの機能の役割は、Java コンポーネントおよび ABAP コンポーネントでは分散されています。ただし、イベント・ポーリングでは常に Java コンポーネントが開始します。

イベント要求

イベント要求とは、SAP アプリケーションのイベント表に対してイベントをポーリングおよび検索する処理です。Java コンポーネントのイベント要求機構に対して、SAP アプリケーション側には、それに対応する機能モジュール /CWLD/RFC_EVENT_REQUEST があります。この機能は、コネクターの ABAP イベント表 /CWLD/EVT_CUR からイベントを検索します。

起動されたすべてのイベントは、初期状況がプレキュー (イベント表で P としてマークされた状況)、イベント優先順位がデフォルトの 0 という状態でイベント表に入れられます。イベントを処理する前に、イベントの状況をキュー (イベント表では Q) に変更する必要があります。イベントの優先順位は、イベントが表す完全なオブジェクトをコネクターが検索する前には 0 である必要があります。イベントの優先順位の詳細については、***『イベント優先順位』を参照してください。

イベントを作成したユーザーとイベントのキーとの組み合わせについてデータベース・ロックが存在しなければ、イベントの状況がプレキューからキューに変わります。イベント表からのイベントの検索後、イベントの状況はイベント検索済み (イベント表では R) に更新されます。ロックが存在している場合には、イベントの状況はロック (イベント表では L) に設定され、そのイベントは再びキューに入れられます。ABAP 定数 C_MAXIMUM_REQUEUE は、1 つのイベントを再びキューに入れられる回数を定義します。最大数 (デフォルトでは 100) に達すると、イベントはイベント・アーカイブ表にアーカイブされます。

注:
状況がプレキューまたはロックのイベントは、ポーリングのたびに更新されます。複数のイベントが同時に起動されると、パフォーマンス上の問題が発生する可能性があります。PollFrequency 構成プロパティーを使用してポーリングの頻度を構成できます。

ABAP 機能モジュール /CWLD/RFC_EVENT_REQUEST は、すべてのプレキュー・イベントをプリプロセスした後、コネクター・モジュールの Java コンポーネント内のイベント要求メソッドに戻すイベントを選択します (状況がキューのイベントだけが選択されます)。コネクター固有の構成プロパティー PollQuantity (デフォルトは 20) によって、単一のポーリングで戻されるイベントの最大数が決定されます。

イベント要求機構は、イベント選択プロセスは 2 つのステップとして実行します。

  1. コネクターおよび統合ブローカー専用のイベントを選択します。

    イベント分配表 (/CWLD/EVT_DIS) の中で、イベントは特定の統合ブローカーに専属しています。この表に指定された統合ブローカーの名前は、コネクターを始動するショートカットに指定された名前と一致していることが必要です。例えば、Windows 上で稼働する SAP コネクター用の標準のショートカットは次のフォーマットです。

    ...\start_SAP.bat SAPconnectorName integrationBrokerName
     -cConfigFileName
     

  2. 選択されたイベント数が最大イベント数より小さい場合には、配布用としては構成されていないイベントから、残りのイベントが補てんされます。

    例えば、コネクター固有の構成プロパティー PollQuantity が 20 に保持され、特定のコネクターおよび統合ブローカーに専属するイベントが 8 つある場合には、イベント要求機構は 12 の追加イベントを選択します。

    必要に応じて、キューの名前に、ブローカーの名前を組み込むこと (始動コマンドの integrationBrokerName パラメーターの指定にしたがって)、あるいはコネクターの名前を組み込むことができます。

イベント処理

イベント要求機能は、処理されるイベントの配列を /CWLD/EVT_CUR イベント表から作成します。イベント要求機能は、これらのイベントをイベント処理機能に渡します。イベント処理機能は、これらのイベントを次の方法で一度に 1 つずつ処理します。

  1. object.verb 値を使用して、そのイベントがコネクター・サブスクリプション・リストにあるかどうかを評価します。

    イベントがサブスクリプション・リストにない場合は、イベントの状況を not subscribed に設定します。

  2. イベントがサブスクリプション・リストにあれば、parentObjectOnly.Retrieve ビジネス・オブジェクトを作成します。イベント処理機能は、次のいずれかの方法でキー値を設定します。

    イベントの複合キーを指定する方法の詳細については、名前と値のペアとしての複合キーのコーディングを参照してください。

  3. doVerbFor() を起動し、ビジネス・オブジェクト・データをこの関数に渡します。ビジネス・オブジェクトを渡すと、イベント処理はビジネス・オブジェクト・データが戻されるまで待機します。
  4. doVerbFor() の処理に基づいて、イベント配列の状況を更新します。
  5. ビジネス・オブジェクト・データが正常に検索された場合は、ビジネス・オブジェクト・データを統合ブローカーに送信します。

イベント戻り

各イベントは、イベント要求により処理された後、機能モジュール /CWLD/RFC_EVENT_RETURN を使用して、SAP アプリケーションに戻ります。この機能モジュールは、処理されたイベントのコピーを作成し、イベント・アーカイブ表 (/CWLD/EVT_ARC) に追加した後、イベント表から元のエントリーを削除します。

注:
状況が新しくなったイベントは、個々のイベントが処理された後、すべて更新されます。

アーカイブされたイベントには、正常に処理されたイベント、処理されたがエラーで終了したイベント、およびアンサブスクライブされたイベントが含まれます。各イベントの状況は、次のいずれかの状態を示すことができます。

イベント・アーカイブ表を管理するには、SAP アプリケーション内で IBM CrossWorlds Station ツールを使用します。IBM CrossWorlds Station を使用すると、管理者はアーカイブ表を表示して切り捨てたり、処理するためにイベントを再サブミットすることができます。アーカイブ表の保守およびログ切り捨てのセットアップの詳細については、ABAP Extension Module の管理を参照してください。

イベント・トリガー

コネクターはイベント・ドリブンです。SAP アプリケーションからイベントを取り出すには、IBM WebSphere でサポートされる各オブジェクトについて、イベント・トリガー機構を実装する必要があります。コネクターのイベント・トリガーは、次の 3 つの機能から構成されています。

イベント検出

イベント検出とは、あるイベントが SAP アプリケーション内で生成されたことを識別する処理です。通常、コネクターではイベントを検出するためにデータベース・トリガーを使用します。ただし、SAP アプリケーションは SAP データベースと緊密に連携しているため、SAP ではそのデータベースの直接変更を目的としたアクセスは非常に制限されます。そのため、イベント検出機構は、データベースの上のアプリケーション・トランザクション層に実装されています。

Connector for mySAP.com では、SAP アプリケーション内でのイベントを検出するために、一般に次の 4 つの機構が使用されています。

これらのイベント検出機構は、すべてオブジェクトのリアルタイム・トリガーおよび検索をサポートしています。さらに、コード拡張およびバッチ・プログラムは、イベントの検索を遅らせる機能を提供します。検索が遅延されるイベントは、将来のイベントと呼ばれます。将来のイベントのトリガーの詳細については、イベント・トリガーを参照してください。

注:
それぞれのイベント検出機構には、ビジネス・オブジェクト・トリガーを設計および開発する際に考慮する必要のある利点と欠点があります。イベント検出機構の実装の詳細については、ABAP Extension Module のイベント検出の開発を参照してください。

これらはイベント検出機構のごく一部の例に過ぎません。イベントを検出するには、多くの方法があります。

イベント・トリガー

イベントは、イベント検出機構の 1 つによって識別されると、アダプターから送出されるイベント・トリガーの 1 つを使用して起動されます。

注:
どちらの機能も、リアルタイム・トリガー用です。/CWLD/ADD_TO_QUEUE はイベントを即時に処理し、/CWLD/ADD_TO_QUEUE はイベントを後で処理します。

イベントがリアルタイムに起動される場合、/CWLD/ADD_TO_QUEUE はイベントを現在のイベント表 (/CWLD/EVT_CUR) にコミットします。具体的には、オブジェクト名、動詞、およびそのイベントを示すキーを含んだデータ行を追加します。

図 8 に、/CWLD/ADD_TO_QUEUE により起動されるイベントを示します。

図 8. /CWLD/ADD_TO_QUEUE


イベントが将来の時点で処理される必要がある場合、 /CWLD/ADD_TO_QUEUE_IN_FUTURE はイベントを将来のイベント表 (/CWLD/EVT_FUT) にコミットします。具体的には、オブジェクト名、動詞、およびそのイベントを示すキーを含んだデータ行を追加します。さらに、アダプターから提供されるバッチ・プログラム /CWLD/SUBMIT_FUTURE_EVENTS により読み取られるデータ行を追加します。このバッチ・プログラムは、将来のイベント表からイベントを検索するようにスケジュールできます。イベントを検索すると、 /CWLD/ADD_TO_QUEUE を呼び出して、イベントを現在のイベント表に起動します。

注:
/CWLD/ADD_TO_QUEUE_IN_FUTURE は、将来のイベント表の日付行に日付を取り込む際に、現在日付としてシステム日付を使用します。

図 9 に、/CWLD/ADD_TO_QUEUE_IN_FUTURE により起動されるイベントを示します。

図 9. /CWLD/ADD_TO_QUEUE_IN_FUTURE


将来のイベント表のイベントのトリガーの詳細については、ABAP Extension Module のイベント検出の開発を参照してください。

すべてのイベントは、/CWLD/ADD_TO_QUEUE を使用して現在のイベント表に追加されます。/CWLD/ADD_TO_QUEUE は、現在のイベント表にデータ行を追加するほかに、次に示す目的のためにセットアップすることもできます。

イベントのフィルター操作、イベント分配、およびイベント優先順位は、イベント・トリガーの一部として実行され、他のプログラムから実行されることはありません。これらを実行した結果は、イベントの制限 (フィルター操作)、または変更 (イベント分配またはイベント優先順位付け) になります。

イベントのフィルター操作
イベント・トリガーを使用すると、イベントをフィルターに掛けて特定のイベントをイベント表に追加しないようにすることができます。アダプターは、この目的のために特定のイベントを制限することのできる ABAP 組み込みプログラム (/CWLD/TRIGGERING_RESTRICTIONS) が提供されます。

イベント分配
ロード・バランシングを使用することで、イベント処理を複数のコネクターに分配できます。これにより、複数のイベントを同時に処理できます。イベント・トリガーは、この機能をイベント分配表 (/CWLD/EVT_DIS) を通じて提供します。ビジネス・オブジェクトは、特定のコネクターによってのみ検索されるようにすることができます。また、イベント分配は 1 つのイベントを取得して、コネクターと統合ブローカーのサブスクライブされた組み合わせごとに 1 回以上複製することができます。

重要: 複数のコネクターを使用してポーリングしている場合は、サブスクライブされた各イベントを特定のコネクター専用にする必要があります。そのようにしない場合、イベントが重複してデリバリーされる可能性があります。異なるコネクター専用となっている複数のオブジェクトが相互に依存関係を持たないようにする必要があります。これは、依存関係があると、イベントが順序どおりにデリバリーされない可能性があるためです。

例えば、CrossWorlds1 という名前の統合ブローカーが 1 つあり、これが 2 つの異なるビジネス・オブジェクト BO_A および BO_B にサブスクライブされていると仮定します。BO_A ビジネス・オブジェクトは小さくて、素早く取り込むことができますが、BO_B は大きく、取り込むのに時間がかかるとします。SAP1connector と SAP2connector という 2 つのコネクターがポーリングしている場合、SAP1connector が BO_A を検索し、SAP2connector が BO_B を検索するようにイベント分配表をセットアップすることができます。SAP1connector はタイプ A の小さなオブジェクトを継続してポーリングすることができ、SAP2connector はタイプ B の大きなオブジェクトにフォーカスします。

重要:
イベント分配表が特定のオブジェクト用に構成されていない場合には、そのオブジェクトに対して起動された各イベントは、コネクターと統合ブローカーのどの組み合わせでも処理できます。

イベント優先順位
イベント優先順位は、イベントのリトリーブを遅らせることにより、ビジネス・オブジェクト、コネクター、および統合ブローカーの組み合わせそれぞれについて設定することができます。イベントの優先順位は、そのイベントがデリバリーに選出されるまでに必要なポーリングの回数を示します。例えば、あるイベントの優先順位を 10 に設定すると、コネクターはそのイベントが検索されるまでに、イベント表を 10 回ポーリングします。コネクターがポーリングするたびに、優先順位の値は 0 になるまで 1 ずつ削減されます。

デフォルトでは、すべてのイベントの優先順位は 0 に設定されます。オブジェクトの優先順位は、イベント分配と同じ ABAP 表で構成します。

図 10 に、SAP アプリケーション内部でのイベント・トリガー機能を示します。イベント E1、E2、および E3 は、イベント・トリガー /CWLD/ADD_TO_QUEUE が受け取ります。E1 は Customer イベントを表し、E3 は Order イベントを表します。イベント分配は、すべての Customer オブジェクトが SAP1connector によって処理され、すべての Order オブジェクトが SAP2connector によって処理されるようにセットアップされています。この環境では、両方のコネクターが同じ統合ブローカーを使用します。E1 は Customer オブジェクトなので SAP1connector によってポーリングされ、E3 は Order オブジェクトなので SAP2connector によってポーリングされます。 E2 は Inventory オブジェクトで、特定の倉庫への在庫オブジェクトを制限する制限プログラム /CWLD/TRIGGERING_RESTRICTIONS 内のコードによってフィルターに掛けられて除外されます。

図 10. 機能モジュール /CWLD/ADD_TO_QUEUE によるイベント優先順位の設定


イベント永続性

イベント・トリガーがイベントをイベント表に挿入すると、そのイベントはイベント分配とイベント優先順位の値を設定された状態でデータベースにコミットされます。この時点で、イベントを変更できるのはポーリングだけです。イベントのポーリング・プロセスが完了した時点、つまりイベントが SAP アプリケーションから検索され、コネクターの Java コンポーネントによって処理された時点で、処理されたイベントのコピーがイベント・アーカイブ表 (/CWLD/EVT_ARC) に追加されます。その後、元のイベントはイベント表から削除されます。

注:
イベントは、アーカイブ表から再サブミットすることができます。イベントはイベント表に移動されるだけで、再び起動されるのではないことに注意する必要があります。具体的に言えば、イベントのフィルター操作、イベント分配、およびイベント優先順位を通じて戻されるのではありません。

Copyright IBM Corp. 2004