SAP Connector 5.9 のトラブルシューティング - Mule 4

SAP 用 Anypoint Connector (SAP Connector) をトラブルシューティングするには、全般的なトラブルシューティングの実行、一般的な特定エラーへの対応、そして一般的にスローされる例外メッセージの解釈について理解しておく必要があります。

冗長例外ログの有効化

冗長例外ログを有効化して、デフォルトの切り捨てられた出力ではなくエラーの完全なスタック追跡を表示します。

  1. Studio で、プロジェクトを右クリックし、​[Run (実行)] > [Run Configurations (実行設定)]​ を選択します。

  2. [Arguments (引数)]​ タブに移動して、​[VM arguments (VM 引数)]​ セクションで引数を付加して ​mule.verbose.exceptions​ プロパティを追加します。次に例を示します。

    -XX:PermSize=128M -XX:MaxPermSize=256M -Dmule.verbose.exceptions=true

冗長ログの有効化

アプリケーションと SAP Connector のやりとりが失敗する理由の理解を深めるには、コネクタの冗長ログを一時的に有効にします。

Mule アプリケーションのパフォーマンスに影響する可能性があるため、トラブルシューティングが完了したら、必ず拡張された冗長性を無効にしてください。

設定ファイルで冗長ログを有効にする手順は、次のとおりです。

  1. Anypoint Studio にアクセスし、​[Package Explorer]​ ビューに移動します。

  2. アプリケーションのプロジェクト名を開きます。

  3. src/main/resources​ フォルダーを開きます。

  4. フォルダー内の ​log4j2.xml​ ファイルを開きます。

  5. <Loggers>​ タグ内に ​<AsyncLogger>​ タグを追加します。

    			<Loggers>
    				...
    				<AsyncLogger name="com.mulesoft.connectors.sap" level="DEBUG"/>
    				...
    			</Loggers>
    xml
  6. アプリケーションの変更を保存します。

  7. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)]​ > ​[Run As (別のユーザーとして実行)]​ > ​[Mule Application (Mule アプリケーション)]​ をクリックします。

全般的なトラブルシューティングの実行

SAP Connector の全般的なトラブルシューティングガイドラインは次のとおりです。

ログファイルを確認する

Mule では (アプリケーションごとに) ログファイルが ​$MULE_HOME\logs​ ディレクトリに保存されます。

  • mule.log
    デフォルトの Mule ログファイル

  • mule-app-YOUR_APP_NAME.log
    アプリケーションごとのログファイル

JCo トレースを有効にする

JCo トレースは Mule の外部から有効にできます。JCo トレースは次の Java 起動環境プロパティを受け入れます。

  • -Djco.trace_level=N
    N​ は ​0​ ~ ​10​ で、​10​ は最も詳細なトレース

  • -Djco.trace_path=<PATH>
    省略可能

JCo は ​0​ (デフォルト) ~ ​10​ のトレースレベルをサポートします。 トレースレベルが高いほど、トレースデータの量が増加します。各トレースレベルには、下位のトレースレベルのすべてのトレースデータも含まれます。多くの JCo コールと転送されるコンテンツで高い JCo トレースレベルを使用する場合は、十分なディスク容量が使用可能であることを確認してください。

コネクタレベルでトレースを有効にする手順は、次のとおりです。

  1. 属性 ​jcoTrace​ を ​true​ に設定するか、値 ​1​ の拡張 JCo プロパティ ​jco.client.trace​ または ​jco.server.trace​ を指定します。

  2. Mule の起動時に ​-Djco.trace_level=N​ の値を指定します。

    トレースレベル AS Java セキュリティレベル JCo 3 トレースコンテンツ

    0

    NONE

    トレースなし

    1

    ERROR

    JCo バージョンとランタイム環境情報、およびアプリケーションエラーを含まない JCo 内部エラーと例外

    2

    WARNING

    JCo 警告メッセージ (ABAP 以外のシステム例外など)

    3

    INFO

    JCo 情報メッセージ (ABAP 例外など)

    4

    PATH

    RFC コールおよび重要な公開 API コール

    5

    DEBUG

    重要な内部ミドルウェアコール
    コードページ情報

    6

    DEBUG

    接続属性
    ASCII コンテンツデータ (構造の最初の 1000 文字またはテーブルの最初の 5 行)

    7

    DEBUG

    RFC メタデータ (名前、型、オフセット、長さ、インポートおよびエクスポートオプション、およびコンテンツデータのその他の 16 進数値を含む)

    8

    DEBUG

    完全なコンテンツデータダンプ (文字または行の制限なし)
    コール元のスタックトレース情報 (たとえば、​getClient()​ はアプリケーションを識別します)

    9

    DEBUG

    追加情報なし (将来の使用のために予約済み)

    10

    DEBUG

    追加情報なし (将来の使用のために予約済み)

  3. 必要に応じて、​-Djco.trace_path=<PATH>​ の値を指定します。通常、これは、トレースファイルが保存されている既存のディレクトリへの完全パスですが、他の特別な値を適用できます。

    • stdout
      JCo トレース情報は標準​出力​ストリームに送信されます。

    • stderr
      JCo トレース情報は標準​エラー​ストリームに送信されます。

-Djco.trace_path​ を設定しない場合、トレースファイルは作業ディレクトリに保存されます。Mule スタンドアロンインスタンスの場合、通常は ​$MULE_HOME/bin​ フォルダーになります。

一般的なエラーのトラブルシューティング

SAP Connector の一般的なエラーとその解決方法のリストを次に示します。

JCo ライブラリの欠落

通常、1 つ以上の必須の SAP JCo 連動関係を読み込まずに接続のテストや Mule アプリケーションのデプロイを実行した場合にこのエラーが発生します。

  • JCo ネイティブライブラリの欠落

    java.lang.ExceptionInInitializerError: JCo initialization failed with java.lang.UnsatisfiedLinkError: no sapjco3 in java.library.path
    text
  • JCo JAR の欠落

    java.lang.NoClassDefFoundError: com/sap/conn/jco/JCoTraceListener
  • IDoc JAR の欠落

    java.lang.NoClassDefFoundError: com/sap/conn/idoc/IDocMetaDataUnavailableException
欠落しているライブラリが表示されている [Global Element Properties (グローバル要素プロパティ)] ウィンドウ

このエラーを解決する手順は、次のとおりです。

  1. [Required Libraries (必須ライブラリ)]​ セクションで、赤い感嘆符アイコンが付いている連動関係の横にある ​[Configure (設定)]​ をクリックします。

  2. 連動関係を参照し、適切なファイルを選択します。
    欠落している連動関係がプロジェクトのクラスパスに自動的に追加されます。

Package Explorer​ で、プロジェクトを右クリックし、​[Build Path (ビルドパス)] > [Configure Build Path (ビルドパスを設定)]​ に移動すると、プロジェクトのビルドパス内のライブラリが表示されます。

JCo クラスローダーの競合

ネイティブライブラリをグローバル設定から読み込むと、ファイルのコピーが ​$YOUR_APP/src/main/app/lib​ 内に配置されますが、ソースファイルは削除されません。そのため、接続のテストやアプリケーションのデプロイを実行するときに、ネイティブライブラリが JCo JAR ファイルと同じディレクトリを共有していると、次のエラーが発生します。

java.lang.ExceptionInInitializerError: JCo initialization failed with java.lang.UnsatisfiedLinkError: Native Library /home/mule/sap-errors/lib/jco/libsapjco3.so already loaded in another classloader
text
SAP エラー、JCo クラスローダーのフォルダー構造

このエラーを解決する手順は、次のとおりです。

次のいずれかの解決策を選択します。最初の解決策は最も簡単ですが、2 番目の解決策をベストプラクティスとしてお勧めします。

  • JCo JAR ファイルが存在するディレクトリから​重複する​ネイティブライブラリファイルを削除します。

    SAP エラー、JCo クラスローダーの修正済みフォルダー構造
  • ダイナミックリンクライブラリを保持するように環境変数 ​LD_LIBRARY_PATH​ を設定し、同じ Mule Runtime サーバー内にデプロイされている複数のアプリケーションでその環境変数を共有します。

JCo バージョンの競合

次のエラーの最も多い原因は、異なるバージョンのネイティブライブラリと JCo JAR ファイルが使用されていることです。

java.lang.ExceptionInInitializerError: Native library sapjco3 is too old. Found library System-defined path to libsapjco3.so has version "720.612", but required is at least version "720.713".
text

このエラーを解決するには、次の要件が満たされていることを確認します。

  • 64 ビットモードで動作する JVM では 64 ビット JCo が必要で、32 ビットモードで動作する JVM では 32 ビット JCo が必要です。

  • Microsoft Windows では、JCo には Microsoft Visual Studio 2005 C/C++ ランタイムライブラリが必要です。

  • sapjco.jar​ と、​sapjco3.dll​、​sapjco3.so​、および ​sapjco3.jnilib​ のいずれかの両方が​同じ JCo パッケージ​から取得されている必要があります。

使用している JCo ライブラリのバージョンを確認するには、次のいずれかを実行します。

  • Windows (UI):

    1. sapjco3.jar​ ファイルが配置されているディレクトリに移動します。

    2. sapjco3.jar​ ファイルを右クリックします。

    3. コンテキストメニューから ​[プログラムから開く]​ を選択します。

    4. [Java 2 Platform Standard Edition]​ バイナリをクリックします。

    5. 表示された JCo ダイアログに表示されている情報を確認します。

  • Mac:

    1. ターミナルウィンドウを開きます。

    2. sapjco3.jar​ ファイルが配置されているディレクトリに移動します。

    3. コマンド ​java -jar sapjco3.jar -version​ を実行します。

    4. 表示された JCo ダイアログに表示されている情報を確認します。

JCo 名前変更の競合

JCo 3.0.11 以降では、SAP JCo ライブラリファイルは JCo により認識されないため、名前変更できず、次のエラーが表示されます。

java.lang.ExceptionInInitializerError: Illegal JCo archive "sapjco3-3.0.11.jar". It is not allowed to rename or repackage the original archive "sapjco3.jar"
text

このエラーを解決する手順は、次のとおりです。

Apache Maven を使用している場合は、属性 ​<stripVersion>true</stripVersion>​ を持つ ​maven-dependency-plugin​ を設定します。これを設定し、JCo アーティファクトを削除すると、すべての連動関係ライブラリのバージョン番号が削除されます。

メッセージが SAP オブジェクトではない

エンドポイントは、BAPI または IDoc を実行するために必要な入力パラメーターを含む SAP オブジェクトを想定します。

以下のメッセージが表示された場合、次のいずれかが考えられます。

  • 必要な入力パラメーターが指定されていない。

  • 入力パラメーターは指定されているが、SAP オブジェクトが無効である。

org.mule.api.transport.DispatchException: Message is not a SAP object, it is of type "byte[]". Check the transformer for this Connector "SapConnector". Failed to route event via endpoint: SapOutboundEndpoint{endpointUri=sap://function, connector=SapConnector
{
 name=SapConnector
 lifecycle=start
 this=4571cebe
 numberOfConcurrentTransactedReceivers=4
 createMultipleTransactedReceivers=true
 connected=true
 supportedProtocols=[sap]
 serviceOverrides=<none>
}
,  name='endpoint.sap.function', mep=ONE_WAY, properties={evaluateFunctionResponse=false, bapiTransaction=false, functionName=BAPI_MATERIAL_AVAILABILITY, rfcType=srfc, outputXml=true}, transactionConfig=Transaction{factory=null, action=INDIFFERENT, timeout=0}, deleteUnacceptedMessages=false, initialState=started, responseTimeout=10000, endpointEncoding=UTF-8, disableTransportTransformer=false}. Message payload is of type: byte[]
text

このエラーを解決する手順は、次のとおりです。

次の 2 つのいずれかの操作を実行して、BAPI または IDoc へのコールを表す SAP オブジェクトを作成します。

  • BAPI コールを含む SAP オブジェクトが含まれる XML を作成します。

  • 実際の SAP コールを作成するための入力が含まれる XML 定義を指定します。

IDoc メタデータを使用できない

次のエラーが発生した場合、RFC 宛先が Unicode をサポートしていないことを意味します。

RfcException: [mc-vmware|a_rfc] message: (3) IDOC_ERROR_METADATA_UNAVAILABLE: The meta data for the IDoc type "??????????????????????????å å" with extension "  ORDSAPB6L B60CL          ???" is unavailable.
    Return code: RFC_FAILURE(1)
    error group: 104
    key: RFC_ERROR_SYSTEM_FAILURE
text

このエラーを解決する手順は、次のとおりです。

トランザクション ​SM59​ を使用して、SAP インスタンスでの Unicode サポートを設定します。

TID ハンドラーの欠落

TID ハンドラーが定義されていないため、次のエラーが表示されます。

RfcException: [mule.local|MULESOFT_IDOC_SEND_TEST]
    message: check TID fault: No transaction handler is installed. Unable to process tRFC/qRFC requests.
    Return code: RFC_FAILURE(1)
    error group: 104
    key: RFC_ERROR_SYSTEM_FAILURE
Exception raised by myhost.com.ar|MULESOFT_IDOC_SEND_TEST
    at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcServer.playbackTRfc(MiddlewareJavaRfc.java:2625)
    at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcServer.handletRfcRequest(MiddlewareJavaRfc.java:2546)
    at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcServer.listen(MiddlewareJavaRfc.java:2367)
    at com.sap.conn.jco.rt.DefaultServerWorker.dispatch(DefaultServerWorker.java:284)
    at com.sap.conn.jco.rt.DefaultServerWorker.loop(DefaultServerWorker.java:369)
    at com.sap.conn.jco.rt.DefaultServerWorker.run(DefaultServerWorker.java:245)
    at java.lang.Thread.run(Thread.java:680)
text

このエラーを解決する手順は、次のとおりです。

<sap:inbound-endpoint />​で ​rfcType​ を ​trfc​ または ​qrfc​ に設定します。

パラメーターがサポートされていない

SAP 拡張プロパティには有効な名前が必要です。このため、無効なプロパティ名を指定すると、次のようなエラーメッセージが表示されます。

Root Exception stack trace:
RfcException: [null]
message: Parameter 'type' not supported: 'f'
Return code: RFC_INVALID_PARAMETER(19)
error group: 101
key: RFC_ERROR_PROGRAM

at com.sap.conn.rfc.api.RfcOptions.checkParameters(RfcOptions.java:182)
at com.sap.conn.jco.rt.MiddlewareJavaRfc$JavaRfcClient.connect(MiddlewareJavaRfc.java:1328)
at com.sap.conn.jco.rt.ClientConnection.connect(ClientConnection.java:731)
+ 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)
text

この例では、​type​ という名前のパラメーターが無効であることが JCo ライブラリにより報告されています。

このエラーを解決する手順は、次のとおりです。

JCo 拡張プロパティの有効なプロパティ名を指定します。

複数の JCo サーバーが実行されている

2 つ以上の JCo サーバーには、設定名が異なっていても同じ設定パラメーターセットを含めることはできないため、次のエラーが表示されます。

ERROR 2012-07-05 10:11:30,525 [WrapperListener_start_runner] com.mulesoft.mule.transport.sap.SapMessageReceiver: Error connecting to server
com.sap.conn.jco.JCoException: (101) JCO_ERROR_CONFIGURATION: Server configuration for sapavalara-1.0-SNAPSHOT-gettax is already used for a running server
at com.sap.conn.jco.rt.StandaloneServerFactory.update(StandaloneServerFactory.java:358)
at com.sap.conn.jco.rt.StandaloneServerFactory.getServerInstance(StandaloneServerFactory.java:176)
at com.sap.conn.jco.server.JCoServerFactory.getServer(JCoServerFactory.java:74)
at com.mulesoft.mule.transport.sap.jco3.SapJcoRfcServer.initialise(SapJcoRfcServer.java:46)
at com.mulesoft.mule.transport.sap.jco3.SapJcoServerFactory.create(SapJcoServerFactory.java:60)
at com.mulesoft.mule.transport.sap.SapMessageReceiver.doConnect(SapMessageReceiver.java:56)
at org.mule.transport.AbstractTransportMessageHandler.connect(AbstractTransportMessageHandler.java:218)
at org.mule.transport.AbstractConnector.registerListener(AbstractConnector.java:1254)
text
これは、同じ Mule サーバーで実行されている Mule アプリケーションにのみ適用されます。Mule サーバーグループのノードにこの制限はありません。

このエラーを解決する手順は、次のとおりです。

次の属性を使用して、サーバーグループキーを作成します (サーバーグループキーは JCo サーバー接続のユニーク性を決定します)。

  • jco.server.gwhost

  • jco.server.gwserv

  • jco.server.progid

2 つのサーバーで ​gwhost​、​gwserv​、および ​progid​ の値が異なる場合のみ、2 つのサーバーを同じ Mule インスタンスで開始できます (JCo はこの情報をシングルトンクラスで保持します)。

スローされる一般的な例外メッセージの理解

スローされる一般的な例外メッセージとその解釈方法のリストを次に示します。

  • SAP:CONNECTIVITY

    A connection cannot be established. (接続を確立できません。)
  • SAP:INVALID_CACHE

    The cache used internally by the JCo library is corrupted or can’t be read. (JCo ライブラリで内部的に使用されているキャッシュが破損しているか、読み取ることができません。)
  • SAP:INVALID_INPUT

    User input cannot be parsed or is incorrect. (ユーザー入力を解析できないか、ユーザー入力が正しくありません。)
  • SAP:METADATA_UNAVAILABLE

    The metadata for an IDoc segment is unavailable. (IDoc セグメントのメタデータを利用できません。)
  • SAP:NOT_FOUND

    A function or IDoc template cannot be found or retrieved. (関数または IDoc テンプレートが見つからないか、取得できません。)
  • SAP:NOT_SUPPORTED

    An action occurs that is not supported by any JCo handler. (JCo ハンドラーでサポートされていないアクションが実行されました。)
  • SAP:PARSING

    The JCo library has a parsing issue or the connector cannot convert XML to a BAPI function or an IDoc. (JCo ライブラリに解析の問題があるか、コネクタが XML を BAPI 関数または IDoc に変換できません。)
  • SAP:RETRY_EXHAUSTED

    Execution block retries are exhausted. (実行ブロックの再試行が終了しました。)
  • SAP:SYSTEM_BUSY

    The remote ABAP system is too busy to handle a request. (リモートの ABAP システムが混雑しているため要求を処理できません。)
  • SAP:TIMEOUT

    A timeout exception happens inside the JCo library. (JCo ライブラリ内でタイムアウト例外が発生しました。)