SAPコネクタの基本的な考え方
SAPプロバイダのSAP ConnectorCore Engineの中核はSAP RFCプロセッサです。SAP RFCプロセッサはSAP Javaコネクタ(JCO)を介してバックエンド・アプリケーションにXMLファンション・コールを実行します。RFCコールの結果はXMLペイロードに変換されます。
バックエンド・アプリケーションに接続するために必要な情報(サーバ・アドレス、ユーザ・データ等)はデータソース(Datasource)で定義されます。データs-素はSAPコネクタのプロパティで定義すりことができます。これらの情報はインターフェースを介してESB Muleに組み込まれます。
実装ノート
SAPプロバイダの中核モジュールであるJavaクラス BAPIConnector は、 AbstractServiceEnabledConnector クラスを継承しています。SAPデータソース(DataSource)をカプセル化しています。RFCコールはESB Muleの標準クラス PollingMessageReceiver を継承したクラス BAPIMessageReceiver で実装されます。メソッド poll() はSAXを使って定期的にXMLスクリプトを解析してクラス RFCContentHandler の必要なJCO構成を設定します。最後に、そのクラスのメソッド endDocument() でJCOに基づいてRFCが実行されます。
結果の処理は RFCResultAsXMLImpl を使って行われます(まだ基本的な例外処理しか実装されていません)。構成はSE37表記と同じです。
Javaコードを書かなくてもSAPテーブルにアクセスできるようにするために、BAPI RFC_READ_TABLE にクラスを追加しています。
クラス TableTransformer は、 RFC_READ_TABLE のXMLストリームをリフレクションでバリュー・オブジェクト又は各項目がSAPテーブルの1行を表すHashMapのコレクションに変換します。
現リリースには、例外処理が含まれていません。
SAPコネクタ
com.comino.mule.providers.sapr3.BAPIConnector クラスには以下のプロパティが定義されています:
| プロパティ |
説明 |
必須 |
| Polling |
ポーリング頻度(ミリ秒) |
○ |
| プロパティ・マップ |
|
|
| Name |
Login |
バックエンド・システムへ接続するためのデータ |
| プロパティ |
説明 |
必須 |
| Client |
SAPクライアント番号 |
○ |
| User |
RFCユーザ |
○ |
| Password |
RFCユーザ・パスワード |
○ |
| Language |
バックエンド・システムへログオンするための言語 |
○ |
| System |
SAPシステム番号 |
○ |
| Route |
SAPサーバとルータ文字列 |
○ |
設定の例:
<connector name="COMINO_SAP" className="com.comino.mule.providers.sapr3.BAPIConnector">
<properties>
<property name="polling" value="5000"/>
<map name="login">
<property name="client" value="800"/>
<property name="user" value="MULE"/>
<property name="password" value="******"/>
<property name="language" value="EN"/>
<property name="system" value="01"/>
<property name="route" value="192.x.x.x"/>
</map>
</properties>
</connector>
SAPエンドポイント
SAPエンドポイントURIの文法は以下の通りです:
エンドポイントの例
<inbound-router>
<endpoint address="bapi://bapi_gl_getglaccbalance/account.xml?account=1000"
transformers="Xslt" connector="COMINO_SAP"/>
</inbound-router>
<frc_function> はSAPのRFCファンクション・モジュールです。SE37に従ってファイル <rfc_config-file> はファンション・モジュールの全ての必須パラメータを提供します。
例題 account.xml は、ファンション・モジュールの全てのパラメータを使っています:
<?xml version="1.0"?>
<rfc id="BAPI_GL_GETGLACCBALANCE">
<import>
<field name="COMPANYCODE">1000</field>
<field name="GLACCT">${account}</field>
<field name="FISCALYEAR">${CURRENTYEAR}</field>
<field name="CURRENCYTYPE">00</field>
</import>
</rfc>
XMLの文法(SE37と類似)
| 要素 |
説明 |
属性 |
| rfc |
指定されたRFCモジュールの説明 |
@id: SAPファンション・モジュール名 (必須) |
| import |
インポート要素用のコンテナ |
- |
| export |
エキスポート要素用のコンテナ(戻り値のみに利用) |
- |
| tables |
テーブル用のコンテナ |
- |
| structure |
フィールド用のコンテナ |
@name: 構成の名前(任意) |
| table |
行用のコンテナ |
@name: テーブルの名前(必須) |
| Row |
構成及びフィールド用のコンテナ |
@id: テーブル行の行番号 (任意) |
| Field |
データ・フィールド |
@name: フィールドのSAP名称(必須) |
静的パラメータをシステム変数に置き換えることができます。例えば、期間/年。また、パラメータはエンドポイントを介してRFCに渡すことができます。
実装されているシステム変数:
| 変数 |
説明 |
| CURRENTYEAR |
システム日付の年 |
| CURRENTMONTH |
システム日付の月 |
| CURRENTDAY |
システム日付の日 |
| TODAY |
今日の日付(YYYYMMDD) |
SAPテーブル・トランスフォーマ(TableTransformer)
com.comino.mule.transformers.sapr3.TableTransformer
トランスフォーマのプロパティ
| プロパティ |
説明 |
必須 |
| 普通のJavaバリュー・クラス。このクラスのsetter/getterはSAPテーブルのdata-element名と一致させます。一致した列のもが変換されます。 |
× |
プロパティが設定されていない場合は、トランスフォーマはSAPテーブルの1つの項目表すHashMapのコレクションを返します。列の値は、SAPテーブルのデータ要素名(data-element name)から取得することができます。
Javaクラスがバリュー・オブジェクトの場合は、トランスフォーマは値を設定したバリュー・オブジェクトのコレクションを返します。
package com.comino.tests;
public class Plant {
private String Werks = null;
private String Name1 = null;
...
public String getName1() {
return Name1;
}
}
トランスフォーマの設定
<transformers>
<transformer name="T001W" className="com.comino.mule.transformers.sapr3.TableTransformer">
<properties>
<property name="pojo" value="com.comino.test.Plant"/>
</properties>
</transformer>
</transformers>
RFCコールの設定
<rfc id="RFC_TABLE_READ">
<import>
<field name="QUERY_TABLE">T001W</field>
<field name="ROWCOUNT">10</field>
<tables>
<table name="DATA">
<row>
<field name="WA"/>
</row>
</table>
</tables>
</import>
</rfc>
CollectionBridgeコンポーネント
com.comino.mule.components.CollectionBridgeComponent コンポーネントはその他の処理を行えるようにするために、コレクションを1つのESB Muleイベント単位に分割します。
完全な例
<model name="SAP">
<mule-descriptor name="SAP_tests" implementation="com.comino.mule.components.CollectionBridgeComponent">
<inbound-router>
<endpoint address="bapi://rfc_read_table?t001w.xml""transformers="T001W" connector="COMINO_SAP"/>
</inbound-router>
<outbound-router>
<router className="org.mule.routing.outbound.OutboundPassThroughRouter">
<endpoint address="jdbc://write">
<properties>
<map name="queries">
<property name="write" value="INSERT INTO plants(werks,name1)
VALUES (${werks}, ${name1})ON DUPLICATE KEY UPDATE name1=${name1}, name2=${name2}"/>
</map>
</properties>
</endpoint>
</router>
</outbound-router>
</mule-descriptor>
</model>