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

    • ไปที่แท็บทรัพยากรในแผงการนำทางของเครื่องมือแก้ไขพร็อกซี 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" ถัดจากทรัพยากรที่แสดงด้านล่าง

    หากต้องการลบทรัพยากรที่ระดับสภาพแวดล้อมหรือองค์กร ให้ใช้คำกริยา "DELETE" ในการเรียก 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 มีข้อผิดพลาดในโค้ด เช่น ตัวสร้างหายไป ปัญหาเกี่ยวกับการพึ่งพาโค้ด หรือปัญหาอื่นๆ

ขั้นตอนการวิเคราะห์ทั่วไป

  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 แล้ว ให้ไปที่ Cause: ไฟล์ JAR ที่เสียหาย

ความละเอียด

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

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

การวินิจฉัย

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

ความละเอียด

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

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

การวินิจฉัย

  1. ตรวจสอบว่าไฟล์คลาส Java ที่ระบุ (ระบุในขั้นตอนที่ 1 ด้านบน) เป็นส่วนหนึ่งของไฟล์ JAR ที่ระบุใน >ResourceURL< หรือไฟล์ JAR ใดๆ ที่เกี่ยวข้องหรือไม่
  2. หากไม่มีไฟล์คลาสอยู่ในไฟล์ JAR ใดๆ หมายความว่าคุณได้หาสาเหตุของข้อผิดพลาดนี้แล้ว ไปที่ "ความละเอียด"
  3. หากไฟล์คลาสอยู่ในไฟล์ JAR ไฟล์ใดไฟล์หนึ่งที่ระบุในนโยบาย JavaCaption แสดงว่าเกิดปัญหากับโค้ด Java หรือคลาสที่เกี่ยวข้องซึ่งทําให้เกิดข้อผิดพลาดนี้ ก. หากคุณเป็นผู้ใช้ระบบคลาวด์สาธารณะ โปรดติดต่อทีมสนับสนุนของ 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 ทั้งหมดภายในสภาพแวดล้อมทั้งหมดในองค์กร คุณสามารถละเว้นรายละเอียดสภาพแวดล้อมในเส้นทางพื้นฐานได้ เช่น

    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"