排解 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.

錯誤螢幕截圖示例

原因

如果在 API Proxy、環境或機構層級不存在 Java callout 政策 <ResourceURL> 元素中指定的資源,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. 確定 Java 呼叫政策使用的是上述步驟 1 中識別的資源。

    舉例來說,下列政策將 <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"

      如果您收到 404 狀態碼做為這些 API 的回應,表示機構和環境層級都缺少該資源。

    如果在 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"

    如果您收到 404 狀態碼做為這些 API 的回應,表示機構和環境層級都缺少該資源。

解析度

  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 檔案中指定的 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. 判斷 JAR 檔案包含無法例項化的類別 (在上述步驟 #1 中找到)。
  2. 檢查特定的 JAR 檔案是否損毀。舉例來說,假設您因檔案損毀或未完整上傳而無法解壓縮檔案,如果毀損,請前往「解決」部分。
  3. 如果 JAR 檔案未損毀,請前往 Cause: Missing Class File (原因:缺少類別檔案)。

解析度

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

原因:缺少類別檔案

診斷

  1. 確認特定的 Java 類別檔案 (於上述步驟 #1 識別) 屬於 >ResourceURL< 或任何相依 JAR 檔案中指定的 JAR 檔案。
  2. 如果任何 JAR 檔案中沒有類別檔案,您已決定發生錯誤的原因。前往「解析度」。
  3. 如果類別檔案存在於 Java 呼叫政策指定的其中一個 JAR 檔案中,則表示 Java 程式碼或相依類別有問題,導致這個錯誤。如果您是公開雲端使用者,請與 Apigee 支援團隊聯絡。 b.如果您是 Private Cloud 使用者,請前往「原因:Java 程式碼問題」

解析度

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

原因:Java 程式碼問題

僅適用於私有雲使用者的診斷步驟

診斷

  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 層級上傳資源,請按一下「資源」分頁中的「+」+ (加號),然後選取「匯入檔案」+,然後從本機電腦上傳檔案。檔案名稱應與 >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,您可以省略基本路徑中的環境詳細資料。例如:

    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"