排解 Java 呼叫政策執行階段錯誤

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

ResourceDoesNotExist

錯誤訊息

透過 Edge UI 或 Edge Management API 部署 API Proxy 會失敗,並顯示以下錯誤訊息:

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.

錯誤螢幕截圖

原因

如果 Java 摘要政策<ResourceURL> 元素中指定的資源不在 API Proxy、環境或機構層級,API Proxy 部署作業就會失敗。

診斷

  1. 識別環境和資源名稱。你可以在錯誤訊息中找到這項資訊。舉例來說,在下列錯誤訊息中,環境為 test,<ResourceURL> 元素中使用的資源名稱為 myresource.jar

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. 決定使用步驟 1 指定資源的 Java 呼叫政策

    舉例來說,下列政策會將 <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 Proxy 的一部分。或者,該資源是在環境或機構層級上傳。如果不是,則是因為發生錯誤。

    • 前往 API Proxy 編輯器「Navigator」窗格中的「Resources」分頁,即可查看所有在 API Proxy 層級上傳的資源。在這個範例中,API Proxy 未上傳任何資源。

    • 資源可在環境或機構層級使用。詳情請參閱「資源檔案」一文。

      • 如要判斷資源是否存在於環境層級,請使用 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 Proxy、機構和環境層級取得該項資源,系統會傳回部署錯誤:

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

解析度

確認 <ResourceURL> 元素中指定的資源存在於 API Proxy、環境或機構層級。詳情請參閱「資源檔案」一文。

如要修正上方所示的 Java 呼叫政策範例,請在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案

NoResourceForURL

錯誤訊息

透過 Edge UI 或 Edge Management API 部署 API Proxy 會失敗,並顯示以下錯誤訊息:

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 Proxy、環境或機構層級),就有可能發生這個錯誤。

診斷

  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 Proxy、環境或機構層級上傳資源。在以下範例中,您可以看到資源 myresource.jar 是在 API Proxy 層級上傳。

    資源可在環境或機構層級使用。詳情請參閱「資源檔案」一文。

    如要判斷資源是否存在於環境層級,請使用 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 Proxy、機構或環境層級,請刪除資源並重新上傳,如步驟 2 所述。否則,請跳到步驟 3。
  2. 如要刪除 API Proxy 層級的資源,請前往 API Proxy 編輯器的「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 Proxy、機構或環境層級) 上傳 JAR 檔案

  4. 如果重新上傳資源無法解決問題,您必須重新啟動受影響的訊息處理器。如果您在 Cloud 中使用 Apigee Edge,請與 Apigee 支援聯絡。 如果您是 Private Cloud 使用者,請參閱「啟動、停止、重新啟動及檢查 Apigee Edge 狀態」一文。

JavaCalloutInstantiationFailed

錯誤訊息

透過 Edge UI 或 Edge Management API 部署 API Proxy 會失敗,並顯示以下錯誤訊息:

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 檔案 該 JAR 檔案包含錯誤中所識別的 Java 類別。
毀損的 JAR 檔案 包含錯誤中所需 Java 類別的 JAR 檔案已損毀/部分上傳。
缺少類別檔案 錯誤中識別的 Java 類別檔案不屬於 >ResourceURL<或相依的 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 Proxy、機構或環境層級上傳。如果 JAR 檔案未上傳到任何層級,請前往「Resolution」。
  3. 如果 JAR 檔案已上傳,請前往「Cause: Corrupted JAR File」

解析度

  1. 如果 JAR 檔案損毀或未完整上傳,請重新建構 JAR,並在適當層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案
  2. 重新部署 API Proxy。

原因:毀損的 JAR 檔案

診斷

  1. 找出應包含無法例項化的類別 (如上述步驟 1 中所識別) 的 JAR 檔案。
  2. 檢查特定 JAR 檔案是否損毀。舉例來說,您無法因檔案損毀或未完整上傳而無法取消刪除。如果毀損,請前往「解析度」。
  3. 如果 JAR 檔案未損毀,請前往「Cause: Missing Class File」

解析度

  1. 重新建構損毀的 JAR 檔案,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案
  2. 重新部署 API Proxy。

原因:缺少類別檔案

診斷

  1. 檢查特定 Java 類別檔案 (如上述步驟 1 識別) 是否為 >ResourceURL<或任何相依 JAR 檔案
  2. 如果所有 JAR 檔案中沒有類別檔案,您已判斷造成錯誤的原因。前往「解析度」。
  3. 如果類別檔案位於 Java 呼叫政策中指定的其中一個 JAR 檔案,表示 Java 程式碼或相依類別發生問題,導致這個錯誤。 a.如果您是公用雲端的使用者,請與 Apigee 支援聯絡。 b.如果您是 Private Cloud 使用者,請移至「原因:Java Code 問題」。

解析度

  1. 使用缺少的類別檔案重新建構 JAR,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案
  2. 重新部署 API Proxy。

原因:Java 程式碼問題

僅適用於 Private Cloud 使用者的診斷步驟

診斷

  1. 查看訊息處理器記錄 (/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 Proxy、機構或環境層級) 上傳 JAR 檔案
  3. 重新部署 API Proxy。
,瞭解如何調查及移除這項存取權。

上傳 JAR 檔案

確保具備所有必要類別的資源元素存在於 API Proxy、環境或機構層級。詳情請參閱「資源檔案」一文。

  1. 如要在 API Proxy 層級上傳資源,請按一下「Resources」分頁中的「+」 (加號),然後選取「Import file」,從本機電腦上傳檔案。檔案名稱應與 >ResourceURL<但不含 java:// 前置字元。

  2. 如要讓相同環境中的多個 API Proxy 使用某項資源,請將資源上傳至環境。您必須按照資源檔案中所述的方式使用 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 Proxy,您可以省略 basepath 中的環境詳細資料。例如:

    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"