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

<ph type="x-smartling-placeholder"></ph> 現在、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 を再起動する必要があります。クラウドで 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"