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

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

ResourceDoesNotExist

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

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

    • ไปที่แท็บทรัพยากรในแผง Navigator ของเครื่องมือแก้ไขพร็อกซี 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, สภาพแวดล้อม หรือองค์กร ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ทรัพยากร

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

NoResourceForURL

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

การติดตั้งใช้งานพร็อกซี API ผ่าน UI ของ Edge หรือ 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 ให้ไปที่แท็บทรัพยากรในแผง Navigator ของเครื่องมือแก้ไขพร็อกซี 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. หากการอัปโหลดทรัพยากรอีกครั้งไม่ได้ผล คุณจะต้องรีสตาร์ท Message Processor ที่ได้รับผลกระทบ หากใช้ Apigee Edge ในระบบคลาวด์ โปรดติดต่อทีมสนับสนุนของ Apigee หากคุณเป็นผู้ใช้ Private Cloud โปรดดูการเริ่มต้น หยุด รีสตาร์ท และตรวจสอบสถานะของ Apigee Edge

JavaCalloutInstantiationFailed

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

การติดตั้งใช้งานพร็อกซี API ผ่าน UI ของ Edge หรือ 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 ให้ไปที่สาเหตุ: ไฟล์ JAR เสียหาย

ความละเอียด

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

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

การวินิจฉัย

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

ความละเอียด

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

สาเหตุ: ไม่มีไฟล์คลาส

การวินิจฉัย

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

ความละเอียด

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

สาเหตุ: ปัญหาเกี่ยวกับโค้ด Java

ขั้นตอนการวินิจฉัยสำหรับผู้ใช้ Private Cloud เท่านั้น

การวินิจฉัย

  1. ตรวจสอบบันทึกของ Message Processor (/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 Proxy, สภาพแวดล้อม หรือองค์กร ดูข้อมูลเพิ่มเติมได้ที่ไฟล์ทรัพยากร

  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"