Skip navigation
ソース

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の文法は以下の通りです:

bapi://<rfc_function>/<rfc_config_file>?\[引数\]

エンドポイントの例

<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 は、ファンション・モジュールの全てのパラメータを使っています:

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;
    }

    // ... setter / getter
}

トランスフォーマの設定

<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>
Adaptavist Theme Builder Powered by Atlassian Confluence