Khắc phục lỗi thời gian chạy của chính sách JavaAnnotate

Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X.
thông tin

ResourceDoesNotExist

Thông báo Lỗi

Việc triển khai proxy API thông qua giao diện người dùng Edge hoặc API quản lý Edge không thành công và xuất hiện thông báo lỗi sau:

Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.

Thông báo lỗi mẫu

Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.

Ảnh chụp màn hình ví dụ về lỗi

Nguyên nhân

Nếu tài nguyên được chỉ định trong phần tử <ResourceURL> trong chính sách JavaCallout không tồn tại ở cấp độ tổ chức, môi trường hoặc proxy API, thì việc triển khai proxy API sẽ không thành công.

Chẩn đoán

  1. Xác định tên môi trường và tài nguyên. Bạn có thể tìm thấy thông tin này trong thông báo lỗi. Ví dụ: trong lỗi sau đây, môi trường là test và tên tài nguyên được dùng trong phần tử <ResourceURL> là myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Xác định chính sách JavaCallout đang sử dụng tài nguyên được xác định ở bước 1 nêu trên.

    Ví dụ: chính sách sau đây chỉ định giá trị của <ResourceURL> là myresource.jar, khớp với giá trị trong thông báo lỗi:

    <?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. Xác định xem tài nguyên có thuộc về một phần của API proxy đang gặp lỗi hay được tải lên ở cấp độ môi trường hoặc tổ chức. Nếu không, thì đây là nguyên nhân gây ra lỗi.

    • Chuyển đến thẻ Resources (Tài nguyên) trong ngăn Navigator (Trình điều hướng) của trình chỉnh sửa proxy API để xem tất cả tài nguyên được tải lên ở cấp proxy API. Trong ví dụ này, API proxy không có tài nguyên nào được tải lên.

    • Tài nguyên có thể có ở cấp môi trường hoặc tổ chức. Để biết thêm thông tin, hãy xem phần Tệp tài nguyên.

      • Để xác định xem tài nguyên có tồn tại ở cấp môi trường hay không, hãy đưa ra lệnh gọi API sau bằng cách sử dụng curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Để xác định xem tài nguyên có tồn tại ở cấp tổ chức hay không, hãy đưa ra lệnh gọi API sau bằng cách sử dụng curl, bỏ qua thông tin chi tiết về môi trường: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Nếu bạn nhận được mã trạng thái 404 làm phản hồi cho các API này, thì tức là tài nguyên bị thiếu ở cả cấp tổ chức và cấp môi trường.

    Nếu tài nguyên không có sẵn ở cấp độ proxy API, tổ chức và môi trường, thì lỗi triển khai sẽ được trả về:

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

Độ phân giải

Đảm bảo rằng tài nguyên được chỉ định trong phần tử <ResourceURL> tồn tại ở cấp độ tổ chức, môi trường hoặc proxy API. Để biết thêm thông tin, hãy xem phần Tệp tài nguyên.

Để sửa chính sách JavaCallout trong ví dụ nêu trên, hãy tải tệp JAR lên ở cấp độ thích hợp (cấp độ proxy API, tổ chức hoặc môi trường).

NoResourceForURL

Thông báo Lỗi

Việc triển khai proxy API thông qua giao diện người dùng Edge hoặc API quản lý Edge không thành công và xuất hiện thông báo lỗi sau:

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>

Thông báo lỗi mẫu

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar

Ảnh chụp màn hình ví dụ về lỗi

Nguyên nhân

Lỗi này có thể xảy ra nếu tệp tài nguyên bị hỏng hoặc được tải lên một phần, mặc dù tệp đó xuất hiện ở cấp proxy API, môi trường hoặc tổ chức.

Chẩn đoán

  1. Xác định môi trường và tên tài nguyên. Bạn có thể tìm thấy thông tin này trong thông báo lỗi. Ví dụ: trong lỗi sau đây, tên môi trường là test và Tên tài nguyên được dùng trong phần tử <ResourceURL> là 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. Đảm bảo rằng tài nguyên được tải lên ở cấp API proxy, môi trường hoặc tổ chức. Trong ví dụ bên dưới, bạn có thể thấy rằng tài nguyên myresource.jar được tải lên ở cấp proxy API.

    Tài nguyên có thể có ở cấp môi trường hoặc tổ chức. Để biết thêm thông tin, hãy xem phần Tệp tài nguyên.

    Để xác định xem tài nguyên có tồn tại ở cấp môi trường hay không, hãy đưa ra lệnh gọi API sau bằng cách sử dụng curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Để xác định xem tài nguyên có tồn tại ở cấp tổ chức hay không, hãy đưa ra lệnh gọi API sau bằng cách sử dụng curl, bỏ qua thông tin chi tiết về môi trường: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Nếu bạn nhận được mã trạng thái 404 làm phản hồi cho các API này, thì tức là tài nguyên bị thiếu ở cả cấp tổ chức và cấp môi trường.

Độ phân giải

  1. Nếu bạn xác định rằng tài nguyên tồn tại ở cấp độ API proxy, tổ chức hoặc môi trường, hãy xoá tài nguyên đó rồi tải lại lên, như mô tả trong bước 2. Nếu không, hãy chuyển sang bước 3.
  2. Để xoá tài nguyên ở cấp proxy API, hãy chuyển đến thẻ Tài nguyên trong ngăn Trình điều hướng của trình chỉnh sửa proxy API rồi nhấp vào nút "X" bên cạnh tài nguyên như minh hoạ bên dưới.

    Để xoá tài nguyên ở cấp môi trường hoặc tổ chức, hãy sử dụng động từ Xoá trong các lệnh gọi API đã được dùng trước đó trong các bước chẩn đoán. Ví dụ: để xoá tài nguyên ở cấp môi trường, hãy nhập lệnh sau: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Tải tệp JAR lên ở cấp độ thích hợp (cấp độ proxy API, tổ chức hoặc môi trường.

  4. Nếu việc tải lại tài nguyên không giúp ích, thì bạn cần khởi động lại các Trình xử lý thông báo bị ảnh hưởng. Nếu bạn đang sử dụng Apigee Edge trên đám mây, hãy liên hệ với Nhóm hỗ trợ Apigee. Nếu bạn là người dùng Đám mây riêng, hãy xem phần Bắt đầu, dừng, khởi động lại và kiểm tra trạng thái của Apigee Edge.

JavaCalloutInstantiationFailed

Thông báo Lỗi

Việc triển khai proxy API thông qua giao diện người dùng Edge hoặc API quản lý Edge không thành công và xuất hiện thông báo lỗi sau:

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>

Hoặc

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>

Thông báo lỗi mẫu

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class

Ảnh chụp màn hình ví dụ về lỗi

Nguyên nhân

Sau đây là những nguyên nhân thường gặp gây ra lỗi này

Nguyên nhân Nội dung mô tả
Thiếu tệp JAR Tệp JAR chứa lớp Java được xác định trong lỗi chưa được tải lên.
Tệp JAR bị hỏng Tệp JAR chứa lớp Java được xác định trong lỗi bị hỏng/được tải lên một phần.
Thiếu tệp Lớp Tệp lớp Java được xác định trong lỗi không thuộc tệp JAR được chỉ định trong >ResourceURL< hoặc các tệp JAR phụ thuộc.
Vấn đề về mã Java Mã bị lỗi, chẳng hạn như thiếu hàm khởi tạo, vấn đề về phần phụ thuộc của mã hoặc vấn đề khác.

Bước chẩn đoán thường gặp

  1. Xác định tên của môi trường và Lớp không nhập được. Ví dụ: trong thông báo lỗi sau đây, tên môi trường là test và tên lớp là my.class:

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
    
    

    Nguyên nhân: Thiếu tệp JAR

Chẩn đoán

  1. Xác định tệp JAR được cho là chứa lớp (được xác định ở bước 1 ở trên) và không thể khởi tạo.
  2. Kiểm tra xem tệp JAR cụ thể có được tải lên ở cấp proxy API, tổ chức hay môi trường hay không. Nếu tệp JAR không được tải lên bất kỳ cấp độ nào, hãy chuyển đến phần Giải pháp.
  3. Nếu tệp JAR được tải lên, hãy chuyển đến phần Nguyên nhân: Tệp JAR bị hỏng.

Độ phân giải

  1. Nếu tệp JAR bị hỏng hoặc được tải lên một phần, hãy tạo lại JAR và tải tệp JAR lên ở cấp độ thích hợp (cấp độ API proxy, tổ chức hoặc môi trường).
  2. Triển khai lại proxy API.

Nguyên nhân: Tệp JAR bị hỏng

Chẩn đoán

  1. Xác định tệp JAR được cho là chứa lớp (được xác định ở bước 1 ở trên) không thể được tạo thực thể.
  2. Kiểm tra xem tệp JAR cụ thể có bị hỏng hay không. Ví dụ: nếu bạn không thể giải nén tệp vì tệp đó bị hỏng hoặc chỉ được tải lên một phần. Nếu tệp bị hỏng, hãy chuyển đến phần Giải pháp.
  3. Nếu tệp JAR không bị hỏng, hãy chuyển đến phần Nguyên nhân: Thiếu tệp lớp.

Độ phân giải

  1. Tạo lại(các) tệp JAR bị hỏng và tải tệp JAR lên ở cấp độ thích hợp (cấp độ API proxy, tổ chức hoặc môi trường.
  2. Triển khai lại proxy API.

Nguyên nhân: Thiếu tệp lớp

Chẩn đoán

  1. Kiểm tra xem tệp lớp Java cụ thể (được xác định ở bước 1 ở trên) có nằm trong tệp JAR được chỉ định trong >ResourceURL< hay bất kỳ tệp JAR nào phụ thuộc hay không.
  2. Nếu tệp lớp không tồn tại trong bất kỳ tệp JAR nào, thì bạn đã xác định được nguyên nhân gây ra lỗi. Chuyển đến phần Độ phân giải.
  3. Nếu tệp lớp tồn tại trong một trong các tệp JAR được chỉ định trong chính sách JavaCallout, thì phải có vấn đề với mã Java hoặc lớp phụ thuộc dẫn đến lỗi này.<0x0Aa> Nếu bạn là người dùng Đám mây công khai, hãy liên hệ với Nhóm hỗ trợ Apigee. b. Nếu bạn là người dùng Đám mây riêng, hãy chuyển đến phần Nguyên nhân: Vấn đề về mã Java.

Độ phân giải

  1. Tạo lại JAR bằng(các) tệp lớp bị thiếu và tải tệp JAR lên ở cấp thích hợp (cấp API proxy, tổ chức hoặc môi trường).
  2. Triển khai lại API Proxy.

Nguyên nhân: Vấn đề về mã Java

Các bước chẩn đoán chỉ dành cho người dùng Đám mây riêng

Chẩn đoán

  1. Kiểm tra nhật ký của Trình xử lý thông báo (/opt/apigee/var/log/edge-message-processor/system.log và /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Bạn có thể thấy một ngoại lệ tương tự như ví dụ bên dưới:

    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. Đọc kỹ trường hợp ngoại lệ để hiểu lý do khiến việc xác minh không thành công. Thông thường, điều này có thể chỉ ra một số vấn đề trong mã Java của bạn.

Độ phân giải

  1. Tuỳ thuộc vào nguyên nhân gây ra lỗi, bạn có thể phải khắc phục vấn đề trong mã Java.
  2. Tạo lại JAR bằng(các) tệp lớp bị thiếu và tải tệp JAR lên ở cấp thích hợp (cấp API proxy, tổ chức hoặc môi trường).
  3. Triển khai lại API Proxy.

Tải tệp JAR lên

Đảm bảo rằng phần tử tài nguyên có tất cả các lớp cần thiết tồn tại ở cấp độ API Proxy, môi trường hoặc tổ chức. Để biết thêm thông tin, hãy xem phần Tệp tài nguyên.

  1. Để tải một tài nguyên lên ở cấp proxy API, hãy nhấp vào + (dấu cộng) trên thẻ Tài nguyên, sau đó chọn Nhập tệp rồi tải tệp lên từ máy tính cục bộ. Tên tệp phải khớp với phần tử >ResourceURL<, nhưng không có tiền tố java://.

  2. Nếu bạn muốn một tài nguyên có sẵn cho nhiều proxy API trong cùng một môi trường, hãy tải tài nguyên đó lên môi trường. Bạn cần sử dụng Edge API, như mô tả trong phần Tệp tài nguyên.

    Ví dụ: nhập lệnh gọi API sau đây từ máy cục bộ để tải tệp đã chỉ định lên ở cấp độ môi trường:

    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"
    

    Đưa ra lệnh gọi API từ cùng một thư mục với tệp.

  3. Để cung cấp tệp cho tất cả các proxy API trong mọi môi trường của tổ chức, bạn có thể bỏ qua thông tin chi tiết về môi trường trong đường dẫn cơ sở. Ví dụ:

    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"