การแก้ปัญหาข้อผิดพลาดเกี่ยวกับรันไทม์ของนโยบาย JavaScript

คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่ เอกสารประกอบเกี่ยวกับ Apigee X.
ข้อมูล

ResourceDoesNotExist

ข้อความแสดงข้อผิดพลาด

การทำให้พร็อกซี API ใช้งานได้ผ่าน Edge UI หรือ Edge Management 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.

ตัวอย่างภาพหน้าจอแสดงข้อผิดพลาด

สาเหตุ

หากไม่มีทรัพยากรที่ระบุในองค์ประกอบ <ResourceURL> ในนโยบาย Javacallout ที่ระดับพร็อกซี สภาพแวดล้อม หรือองค์กร 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. กำหนดนโยบาย JavaCall ที่ใช้ทรัพยากรที่ระบุในขั้นตอนที่ 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 ที่ล้มเหลวหรืออัปโหลดที่ระดับสภาพแวดล้อมหรือองค์กรหรือไม่ หากไม่ตรง นี่เป็นสาเหตุของข้อผิดพลาด

    • ไปที่แท็บทรัพยากรในแผงการนำทางของตัวแก้ไขพร็อกซี API เพื่อดูทรัพยากรทั้งหมดที่อัปโหลดในระดับพร็อกซี API ในตัวอย่างนี้ พร็อกซี API ไม่มีการอัปโหลดทรัพยากร

    • ทรัพยากรพร้อมใช้งานในระดับสภาพแวดล้อมหรือองค์กร ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ทรัพยากร

      • หากต้องการดูว่าทรัพยากรมีอยู่ที่ระดับสภาพแวดล้อมหรือไม่ ให้เรียก API ต่อไปนี้โดยใช้ curl curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • หากต้องการตรวจสอบว่าทรัพยากรอยู่ในระดับองค์กรหรือไม่ ให้เรียก API ต่อไปนี้โดยใช้ curl โดยละเว้นรายละเอียดสภาพแวดล้อม curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      หากคุณได้รับรหัสสถานะ 404 เป็นการตอบกลับสำหรับ API เหล่านี้ แสดงว่าทรัพยากรนั้นหายไปทั้งในระดับองค์กรและสภาพแวดล้อม

    หากทรัพยากรไม่พร้อมใช้งานในพร็อกซี องค์กร และสภาพแวดล้อม API ระบบจะแสดงข้อผิดพลาดในการทำให้ใช้งานได้ ดังนี้

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

ความละเอียด

ตรวจสอบว่าทรัพยากรที่ระบุในองค์ประกอบ <ResourceURL> ไม่มีอยู่ที่ระดับพร็อกซี สภาพแวดล้อม หรือองค์กร API ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ทรัพยากร

หากต้องการแก้ไขตัวอย่างนโยบาย JavaScript ที่แสดงด้านบน ให้อัปโหลดไฟล์ JAR ในระดับที่เหมาะสม (ระดับพร็อกซี API, องค์กร หรือสภาพแวดล้อม)

NoResourceForURL

ข้อความแสดงข้อผิดพลาด

การทำให้พร็อกซี API ใช้งานได้ผ่าน Edge UI หรือ Edge Management 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

    ทรัพยากรพร้อมใช้งานในระดับสภาพแวดล้อมหรือองค์กร ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ทรัพยากร

    หากต้องการดูว่าทรัพยากรมีอยู่ที่ระดับสภาพแวดล้อมหรือไม่ ให้เรียก API ต่อไปนี้โดยใช้ curl curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    หากต้องการตรวจสอบว่าทรัพยากรอยู่ในระดับองค์กรหรือไม่ ให้เรียก API ต่อไปนี้โดยใช้ curl โดยละเว้นรายละเอียดสภาพแวดล้อม curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    หากคุณได้รับรหัสสถานะ 404 เป็นการตอบกลับสำหรับ API เหล่านี้ แสดงว่าทรัพยากรนั้นหายไปทั้งในระดับองค์กรและสภาพแวดล้อม

ความละเอียด

  1. หากคุณพิจารณาว่าทรัพยากรอยู่ในพร็อกซี องค์กร หรือสภาพแวดล้อม API ให้ลบทรัพยากรนั้นแล้วอัปโหลดอีกครั้งตามที่อธิบายไว้ในขั้นตอนที่ 2 ไม่เช่นนั้น ให้ข้ามไปยังขั้นตอนที่ 3
  2. หากต้องการลบทรัพยากรในระดับพร็อกซี API ให้ไปที่แท็บทรัพยากรในแผงการนำทางของตัวแก้ไขพร็อกซี API และคลิกปุ่ม "X" ข้างทรัพยากรดังที่แสดงด้านล่าง

    หากต้องการลบทรัพยากรที่ระดับสภาพแวดล้อมหรือองค์กร ให้ใช้กริยา "ลบ" ในการเรียก API ที่ใช้ก่อนหน้านี้ในขั้นตอนการวิเคราะห์ เช่น หากต้องการลบทรัพยากรในระดับสภาพแวดล้อม ให้ป้อนคำสั่งต่อไปนี้ curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. อัปโหลดไฟล์ JAR) ในระดับที่เหมาะสม (ระดับพร็อกซี API, องค์กร หรือสภาพแวดล้อม

  4. หากการอัปโหลดทรัพยากรอีกครั้งไม่ได้ผล คุณต้องรีสตาร์ทโปรแกรมประมวลผลข้อความที่ได้รับผลกระทบ หากคุณใช้ Apigee Edge ใน Cloud โปรดติดต่อทีมสนับสนุนของ Apigee หากคุณเป็นผู้ใช้ Private Cloud โปรดดูการเริ่มต้น การหยุด การรีสตาร์ท และสถานะของ Apigee Edge

JavaCalloutInstantiationFailed

ข้อความแสดงข้อผิดพลาด

การทำให้พร็อกซี API ใช้งานได้ผ่าน Edge UI หรือ Edge Management 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 ระบบจะไม่อัปโหลดไฟล์ JAR ที่มีคลาส Java ที่ระบุในข้อผิดพลาด
ไฟล์ JAR เสียหาย ไฟล์ JAR ที่มีคลาส Java ที่ระบุในข้อผิดพลาดเสียหาย/อัปโหลดบางส่วน
ไม่มีไฟล์ของชั้นเรียน ไฟล์คลาส Java ที่ระบุในข้อผิดพลาดไม่ได้เป็นส่วนหนึ่งของไฟล์ JAR ที่ระบุใน >ResourceURL< หรือไฟล์ JAR ที่เกี่ยวข้อง
ปัญหาเกี่ยวกับโค้ด Java มีข้อผิดพลาดในโค้ด เช่น ตัวสร้างขาดหายไป ปัญหาทรัพยากร Dependency ของโค้ด หรือปัญหาอื่นๆ

ขั้นตอนการวินิจฉัยทั่วไป

  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. ระบุไฟล์ JAR ที่ควรจะมีคลาส (ระบุในขั้นตอนที่ 1 ด้านบน) และไม่สามารถสร้างอินสแตนซ์ได้
  2. ตรวจสอบว่าได้อัปโหลดไฟล์ JAR ที่เฉพาะเจาะจงที่ระดับพร็อกซี องค์กร หรือสภาพแวดล้อมของ API หรือไม่ หากยังไม่ได้อัปโหลดไฟล์ JAR ไปยังระดับใดระดับหนึ่ง ให้ไปที่ "ความละเอียด"
  3. หากอัปโหลดไฟล์ JAR แล้ว ให้ไปที่สาเหตุ: ไฟล์ JAR ที่เสียหาย

ความละเอียด

  1. หากไฟล์ JAR เสียหายหรืออัปโหลดเป็นบางส่วน ให้สร้าง JAR อีกครั้งและอัปโหลดไฟล์ JAR ในระดับที่เหมาะสม (ระดับพร็อกซี API, องค์กร หรือสภาพแวดล้อม)
  2. ทำให้พร็อกซี API ใช้งานได้อีกครั้ง

สาเหตุ: ไฟล์ JAR เสียหาย

การวินิจฉัย

  1. ระบุไฟล์ JAR ที่ควรจะมีคลาส (ระบุในขั้นตอนที่ 1 ด้านบน) ที่ไม่สามารถสร้างอินสแตนซ์ได้
  2. ตรวจสอบว่าไฟล์ JAR บางไฟล์เสียหายหรือไม่ เช่น หากเปิดไฟล์ไม่ได้เนื่องจากไฟล์เสียหายหรือมีการอัปโหลดเป็นบางส่วน หากเสียหาย ให้ไปที่ "การแก้ปัญหา"
  3. หากไฟล์ JAR ไม่เสียหาย ให้ไปที่สาเหตุ: ไฟล์ของชั้นเรียนขาดหายไป

ความละเอียด

  1. สร้างไฟล์ JAR ที่เสียหายอีกครั้งและอัปโหลดไฟล์ JAR) ในระดับที่เหมาะสม (ระดับพร็อกซี API, องค์กร หรือสภาพแวดล้อม
  2. ทำให้พร็อกซี API ใช้งานได้อีกครั้ง

สาเหตุ: ไม่มีไฟล์ของชั้นเรียน

การวินิจฉัย

  1. ตรวจสอบว่าไฟล์คลาสของ Java เฉพาะ (ระบุในขั้นตอนที่ 1 ด้านบน) เป็นส่วนหนึ่งของไฟล์ JAR ที่ระบุใน >ResourceURL< หรือไม่ หรือไฟล์ JAR ใดๆ ที่เกี่ยวข้อง
  2. หากไม่มีไฟล์คลาสอยู่ในไฟล์ JAR แสดงว่าคุณสามารถหาสาเหตุของข้อผิดพลาดได้ ไปที่ "ความละเอียด"
  3. หากไฟล์คลาสอยู่ในไฟล์ JAR ไฟล์ใดไฟล์หนึ่งที่ระบุในนโยบาย Javacallout จะทำให้เกิดปัญหากับโค้ด Java หรือคลาสอ้างอิงที่ทำให้เกิดข้อผิดพลาดนี้ ก. หากคุณเป็นผู้ใช้ Public Cloud โปรดติดต่อทีมสนับสนุนของ Apigee ข. หากคุณเป็นผู้ใช้ Private Cloud ให้ไปยังหัวข้อสาเหตุ: ปัญหาโค้ด Java

ความละเอียด

  1. สร้าง JAR อีกครั้งด้วยไฟล์คลาสที่หายไป แล้วอัปโหลดไฟล์ JAR ในระดับที่เหมาะสม (ระดับพร็อกซี API, องค์กร หรือสภาพแวดล้อม)
  2. ทำให้พร็อกซี API ใช้งานได้อีกครั้ง

สาเหตุ: ปัญหาเกี่ยวกับโค้ด 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 อีกครั้งด้วยไฟล์คลาสที่หายไป แล้วอัปโหลดไฟล์ JAR ในระดับที่เหมาะสม (ระดับพร็อกซี API, องค์กร หรือสภาพแวดล้อม)
  3. ทำให้พร็อกซี API ใช้งานได้อีกครั้ง

อัปโหลดไฟล์ JAR

ตรวจสอบว่าองค์ประกอบทรัพยากรที่มีคลาสที่จำเป็นทั้งหมดอยู่ที่พร็อกซี API, สภาพแวดล้อม หรือองค์กร ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ทรัพยากร

  1. หากต้องการอัปโหลดทรัพยากรในระดับพร็อกซี API ให้คลิก + (เครื่องหมายบวก) ในแท็บทรัพยากร จากนั้นเลือกนำเข้าไฟล์ แล้วอัปโหลดไฟล์จากเครื่องของคุณ ชื่อไฟล์ควรตรงกับ >ResourceURL< แต่ไม่มีคำนำหน้า java://

  2. หากต้องการให้ทรัพยากรพร้อมใช้งานสำหรับพร็อกซี API มากกว่า 1 รายการในสภาพแวดล้อมเดียวกัน ให้อัปโหลดทรัพยากรไปยังสภาพแวดล้อม คุณจะต้องใช้ 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 ทั้งหมดภายในสภาพแวดล้อมทั้งหมดในองค์กร คุณสามารถละเว้นรายละเอียดสภาพแวดล้อมใน 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"