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 プロキシ エディタの [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. 適切なレベル(API プロキシ、組織、または環境レベル)で 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 コードの問題

プライベート クラウド ユーザーのみの診断手順

診断

  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"