JavaCallout ポリシー ランタイム エラーのトラブルシューティング

現在、Apigee Edge のドキュメントを表示しています。
Apigee X のドキュメントをご確認ください
情報

ResourceDoesNotExist

エラー メッセージ

Edge UI または Edge 管理 API を使用した API プロキシのデプロイに失敗し、次のエラー メッセージが表示されます。

Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.

エラー メッセージの例

Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.

エラーのスクリーンショットの例

原因

JavaCallout ポリシー<ResourceURL> 要素で指定されたリソースが API プロキシ、環境、または組織レベルで存在しない場合、API プロキシのデプロイが失敗します。

診断

  1. 環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境は test で、<ResourceURL> 要素で使用されているリソース名は myresource.jar です。

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. 上記のステップ 1 で特定したリソースを使用している JavaCallout ポリシーを確認します。

    たとえば、次のポリシーでは、<ResourceURL> の値が myresource.jar に指定されており、これはエラー メッセージの値と一致します。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JavaCallout name="hello-java">
        <ClassName>com.apigeesample.HelloJava</ClassName>
        <ResourceURL>java://myresource.jar</ResourceURL>
    </JavaCallout>
    
  3. そのリソースが、エラーが発生している API プロキシの一部であるか、または環境レベルまたは組織レベルでアップロードされている API プロキシの一部であるかを判断します。そうではない場合は、それがエラーの原因です。

    • API プロキシ エディタの [Navigator] ペインで [Resources] タブに移動すると、API プロキシレベルでアップロードされたすべてのリソースが表示されます。この例では、API プロキシにはアップロードされたリソースがありません。

    • リソースは環境レベルまたは組織レベルで使用できます。詳しくは、リソース ファイルをご覧ください。

      • リソースが環境レベルに存在するかどうかを確認するには、curl を使用して次の API 呼び出しを発行します。curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • リソースが組織レベルに存在するかどうかを確認するには、curl を使用して次の API 呼び出しを発行します。環境の詳細を省略します。curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      これらの API に対するレスポンスとして 404 ステータス コードが返される場合は、組織レベルと環境レベルの両方でリソースがありません。

    リソースが API プロキシ、組織、環境レベルで使用できない場合は、デプロイエラーが返されます。

    Resource with name myresource.jar and type java does not exist.
     ```
    

解像度

<ResourceURL> 要素で指定されたリソースが API プロキシ、環境、または組織レベルで存在していることを確認します。詳細については、リソース ファイルをご覧ください。

上記の JavaCallout ポリシーの例を修正するには、適切なレベル(API プロキシ、組織、または環境レベル)で JAR ファイルをアップロードします。

NoResourceForURL

エラー メッセージ

Edge UI または Edge 管理 API を使用した API プロキシのデプロイに失敗し、次のエラー メッセージが表示されます。

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL <var>ResourceURL</var>

エラー メッセージの例

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar

エラーのスクリーンショットの例

原因

このエラーは、リソース ファイルが API プロキシ、環境、または組織レベルに存在するように見えても、リソース ファイルが破損しているか、部分的にアップロードされた場合に発生することがあります。

診断

  1. 環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境名は test で、<ResourceURL> 要素で使用されているリソース名は myresource.jar です。

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
    
  2. リソースが API プロキシ、環境、または組織レベルでアップロードされていることを確認します。以下の例では、リソース myresource.jar が API プロキシレベルでアップロードされています。

    リソースは環境レベルまたは組織レベルで使用できます。詳しくは、リソース ファイルをご覧ください。

    リソースが環境レベルに存在するかどうかを確認するには、curl を使用して次の API 呼び出しを発行します。curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    リソースが組織レベルに存在するかどうかを確認するには、curl を使用して次の API 呼び出しを発行します。環境の詳細を省略します。curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    これらの API に対するレスポンスとして 404 ステータス コードが返される場合は、組織レベルと環境レベルの両方でリソースがありません。

解像度

  1. リソースが API プロキシ、組織、または環境レベルに存在することがわかった場合は、リソースを削除し、手順 2 の説明に沿って再アップロードします。それ以外の場合は、手順 3 に進みます。
  2. API プロキシレベルでリソースを削除するには、API プロキシ エディタの [Navigator] ペインで [Resources] タブに移動し、以下のようにリソースの横にある [X] ボタンをクリックします。

    環境レベルまたは組織レベルでリソースを削除するには、以前に診断手順で使用した API 呼び出しに DELETE 動詞を使用します。たとえば、環境レベルでリソースを削除するには、次のコマンドを入力します。 curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. JAR ファイルをアップロードします。

  4. リソースを再アップロードしても問題が解決しない場合は、該当する Message Processor を再起動する必要があります。Cloud で Apigee Edge を使用している場合は、Apigee サポートにお問い合わせください。Private Cloud ユーザーの場合は、Apigee Edge の起動、停止、再起動、ステータスの確認をご覧ください。

JavaCalloutInstantiationFailed

エラー メッセージ

Edge UI または Edge 管理 API を使用した API プロキシのデプロイに失敗し、次のエラー メッセージが表示されます。

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class <var>class_name</var>

または

Error in deployment for environment <var>environment</var>.
The revision is deployed and traffic can flow, but flow may be impaired. Failed to instantiate the JavaCallout Class <var>class_name</var>

エラー メッセージの例

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class

エラーのスクリーンショットの例

原因

このエラーの一般的な原因は次のとおりです。

原因 説明
JAR ファイルがない エラーで特定された Java クラスを含む JAR ファイルがアップロードされていません。
破損した JAR ファイル エラーで特定された Java クラスを含む JAR ファイルが破損しているか、部分的にアップロードされています。
クラスファイルがない エラーで特定された Java クラスファイルが、>ResourceURL< または依存 JAR ファイルで指定された JAR ファイルに含まれていません。
Java コードの問題 コンストラクタがない、コードの依存関係の問題など、コードに関するエラーがあります。

一般的な診断手順

  1. 環境名とインポートに失敗したクラスを特定します。たとえば、次のエラー メッセージでは、環境名は test で、クラス名は my.class です。

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
    
    

    原因: JAR ファイルがない

診断

  1. クラス(上記のステップ 1 で特定)が含まれることになっているが、インスタンス化できなかった JAR ファイルを判別します。
  2. 特定の JAR ファイルが API プロキシ、組織、または環境レベルでアップロードされているかどうかを確認します。JAR ファイルがどのレベルにもアップロードされていない場合は、解決策に進みます。
  3. JAR ファイルがアップロードされている場合は、原因: JAR ファイルが破損をご覧ください。

解像度

  1. JAR ファイルが破損しているか部分的にアップロードされている場合は、JAR を再ビルドし、適切なレベル(API プロキシ、組織、環境レベル)で JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。

原因: JAR ファイルが破損

診断

  1. インスタンス化できなかったクラス(上記のステップ 1 で特定)が含まれることになっている JAR ファイルを判別します。
  2. 特定の JAR ファイルが破損しているかどうかを確認します。たとえば、ファイルが解凍できない場合は、ファイルが破損していることや、部分的にアップロードされていることが原因です。ファイルが破損している場合は、解決策に進みます。
  3. JAR ファイルが破損していない場合は、原因: クラスファイルがないをご覧ください。

解像度

  1. 破損した JAR ファイルを再構築し、適切なレベル(API プロキシ、組織、環境レベル)で JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。

原因: クラスファイルがない

診断

  1. 特定の Java クラスファイル(上記のステップ 1 で特定)が、>ResourceURL< または依存 JAR ファイルのいずれかで指定された JAR ファイルに含まれているかどうかを確認します。
  2. クラスファイルがどの JAR ファイルにも存在しない場合、これがエラーの原因であると判断します。解決策に進みます。
  3. クラスファイルが JavaCallout ポリシーで指定された JAR ファイルのいずれかに存在する場合は、このエラーを引き起こしている Java コードまたは依存クラスに問題がある必要があります。 a.Public Cloud をご利用の場合は、Apigee サポートにご連絡ください。b.Private Cloud をご利用の場合は、「原因: Java コードの問題」に進みます。

解像度

  1. 欠落しているクラスファイルを含む JAR を再ビルドし、適切なレベル(API プロキシ、組織、環境レベル)で JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。

原因: Java コードの問題

Private Cloud ユーザー専用の診断手順

診断

  1. Message Processor のログ(/opt/apigee/var/log/edge-message-processor/system.log/opt/apigee/var/log/edge-message-processor/configurations.log)を確認します。
  2. 次の例のような例外が表示されることがあります。

    2019-07-05 05:40:13,240 org:myorg env:staging target:/organizations/myorg/apiproxies/MyAPI/revisions/5 action:add context-id: mode: Apigee-Main-53 ERROR CONFIG-CHANGE - AbstractConfigurator.add() : Add null to Step failed, reason: {}
    com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class <class name>
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:116)
    at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:218)
    …<snipped>
    Caused by: java.lang.reflect.InvocationTargetException: null
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition.access$100(JavaCalloutStepDefinition.java:41)
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition$CallOutWrapper.initialize(JavaCalloutStepDefinition.java:131)
    at com.apigee.steps.javacallout.JavaCalloutStepDefinition$CallOutWrapper.<init>(JavaCalloutStepDefinition.java:126)
    ... 42 common frames omitted
    Caused by: <Reason>
    
    ...<snipped>
    
    
  3. 例外をよく読み、失敗の理由を把握してください。通常、これは Java コードに問題があることを示しています。

解像度

  1. エラーの原因によっては、Java コードの問題を修正する必要があります。
  2. 欠落しているクラスファイルを含む JAR を再ビルドし、適切なレベル(API プロキシ、組織、環境レベル)で JAR ファイルをアップロードします。
  3. API プロキシを再デプロイします。

JAR ファイルをアップロードする

必要なすべてのクラスを含むリソース要素が、API プロキシ、環境、または組織レベルに存在することを確認します。詳しくは、リソース ファイルをご覧ください。

  1. API プロキシレベルでリソースをアップロードするには、[Resources] タブで +(プラス記号)をクリックして、[Import file] を選択し、ローカルマシンからファイルをアップロードします。ファイル名は >ResourceURL< 要素と一致する必要がありますが、java:// 接頭辞は付けません。

  2. 同じ環境の複数の API プロキシでリソースを使用できるようにするには、その環境にリソースをアップロードします。リソース ファイルで説明されているように、Edge API を使用する必要があります。

    たとえば、ローカルマシンから次の API 呼び出しを入力して、指定したファイルを環境レベルでアップロードします。

    curl -v -u email -H "Content-Type: application/octet-stream" \
    -X POST --data-binary @{classes.jar} \
    "http://{mgmt_server}:{port}/v1/organizations/myorg/environments/myenv/resourcefiles?name=myresouce.jar&type=java"
    

    そのファイルと同じディレクトリから API 呼び出しを発行します。

  3. 組織内のすべての環境内のすべての API プロキシでファイルを利用できるようにするには、ベースパスの環境の詳細を省略します。例:

    curl -v -u email -H "Content-Type: application/octet-stream" \
    -X POST --data-binary @{classes.jar} \
    "http://{mgmt_server}:{port}/v1/organizations/myorg/resourcefiles?name=myresouce.jar&type=java"