<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 プロキシのデプロイは失敗します。
診断
環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境は
test
で、<ResourceURL>
要素で使用されているリソース名はmyresource.jar
です。Error Deploying Revision 1 to test Resource with name myresource.jar and type java does not exist.
上記のステップ 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>
そのリソースが、エラーが発生している 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 プロキシ、環境、または組織レベルで存在しているように見えても、破損しているか、部分的にアップロードされた場合に発生することがあります。
診断
環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境名は
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
リソースが 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 ステータス コードを受信した場合、組織レベルと環境レベルの両方でリソースが欠落しています。
解決策
- リソースが API プロキシ、組織、または環境レベルで存在すると判断した場合は、リソースを削除し、ステップ 2 の説明に従ってリソースを再アップロードします。それ以外の場合は、手順 3 に進みます。
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"
適切なレベル(API プロキシ、組織、または環境レベル)で JAR ファイルをアップロードします。
リソースを再アップロードしても解決しない場合は、該当する 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 コードの問題 | コンストラクタがない、コードの依存関係の問題など、コードに関するエラーがあります。 |
一般的な診断手順
環境名とインポートに失敗したクラス名を特定します。たとえば、次のエラー メッセージでは、環境名は
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 で特定)が含まれることになっているが、インスタンス化できなかった JAR ファイルを判別します。
- 特定の JAR ファイルが API プロキシ、組織、または環境レベルでアップロードされたかどうかを確認します。JAR ファイルがどのレベルにもアップロードされていない場合は、解決策に進みます。
- JAR ファイルがアップロードされている場合は、原因: JAR ファイルが破損をご覧ください。
解決策
- JAR ファイルが破損しているか部分的にアップロードされた場合は、JAR を再作成して、適切なレベル(API プロキシレベル、組織レベル、または環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
原因: JAR ファイルが破損
診断
- インスタンス化できなかったクラス(上記のステップ 1 で特定)が含まれることになっている JAR ファイルを判別します。
- 特定の JAR ファイルが破損しているかどうかを確認します。たとえば、ファイルが解凍できない場合は、ファイルが破損していることや、部分的にアップロードされていることが原因です。ファイルが破損している場合は、解決策に進みます。
- JAR ファイルが破損していない場合は、原因: クラスファイルがないをご覧ください。
解決策
- 破損した JAR ファイルを再構築し、適切なレベル(API プロキシレベル、組織レベル、または環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
原因: クラスファイルがない
診断
- 特定の Java クラスファイル(上記のステップ 1 で特定)が、>ResourceURL< または依存 JAR ファイルのいずれかで指定された JAR ファイルに含まれているかどうかを確認します。
- クラスファイルがどの JAR ファイルにも存在しない場合、これがエラーの原因であると判断します。解決策に進みます。
- JavaCallout ポリシーで指定された JAR ファイルにクラスファイルが存在する場合は、このエラーを引き起こす原因となる Java コードまたは依存クラスに問題があるはずです。 a.Public Cloud ユーザーの場合は、Apigee サポートにお問い合わせください。 b.Private Cloud をご利用の場合は、原因: Java コードの問題に進みます。
解決策
- 欠落しているクラスファイルを含む JAR を再作成し、適切なレベル(API プロキシレベル、組織レベル、または環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
原因: Java コードの問題
Private Cloud ユーザーのみを対象とする診断手順
診断
- Message Processor のログ(
/opt/apigee/var/log/edge-message-processor/system.log
と/opt/apigee/var/log/edge-message-processor/configurations.log
)を確認します。 以下の例のような例外が表示される場合があります。
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>
例外をよく読み、失敗の理由を把握してください。通常、これは Java コードに問題がある可能性があります。
解決策
- 失敗の原因によっては、Java コード内の問題を修正する必要があります。
- 欠落しているクラスファイルを含む JAR を再作成し、適切なレベル(API プロキシレベル、組織レベル、または環境レベル)で JAR ファイルをアップロードします。
- API プロキシを再デプロイします。
JAR ファイルをアップロードする
必要なすべてのクラスを含むリソース要素が API プロキシ、環境、または組織レベルで存在することを確認します。詳しくは、リソース ファイルをご覧ください。
API プロキシレベルでリソースをアップロードするには、[Resources] タブで +(プラス記号)をクリックして、[Import file] を選択し、ローカルマシンからファイルをアップロードします。ファイル名は >ResourceURL< 要素と一致する必要がありますが、
java://
接頭辞は付けません。同じ環境の複数の 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 呼び出しを発行します。
組織のすべての環境内で、すべての 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"