פתרון בעיות בזמן ריצה של מדיניות JavaCallout

כרגע מוצג התיעוד של Apigee Edge.
כניסה למסמכי התיעוד של Apigee X.
מידע

ResourceDoesNotExist

הודעת שגיאה

כשפורסים את ה-API של ה-API דרך ממשק המשתמש של 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 לא קיים ברמת שרת ה-proxy של ה-API, הסביבה או הארגון, הפריסה של שרת ה-proxy של ה-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. בודקים אם המשאב הוא חלק משרת ה-proxy של ה-API שנכשל או הועלה ברמת הסביבה או בארגון. אם לא, זו הסיבה לשגיאה.

    • יש לעבור לכרטיסייה 'משאבים' בחלונית 'ניווט' בעורך ה-API של שרת ה-proxy כדי להציג את כל המשאבים שהועלו ברמת שרת ה-API של ה-API. בדוגמה הזו לשרת ה-proxy של ה-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 האלה, המשאב חסר גם ברמת הארגון וגם ברמת הסביבה.

    אם המשאב לא זמין ברמת שרת ה-proxy של ה-API, הארגון והסביבה, תוחזר שגיאת הפריסה:

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

רזולוציה

יש לוודא שהמשאב שצוין ברכיב <ResourceURL> אכן קיים ברמת שרת ה-proxy של ה-API, הסביבה או הארגון. אפשר לקרוא מידע נוסף במאמר בנושא קובצי משאבים.

כדי לתקן את הדוגמה של מדיניות JavaCallout שמוצגת למעלה, מעלים את קובץ ה-JAR ברמה המתאימה (רמת שרת ה-proxy של ה-API, הארגון או הסביבה).

NoResourceForURL

הודעת שגיאה

כשפורסים את ה-API של ה-API דרך ממשק המשתמש של 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

צילום מסך של שגיאה לדוגמה

סיבה

השגיאה הזאת יכולה להופיע אם קובץ המשאב פגום או מועלה חלקית, למרות שנראה שהוא קיים ברמת שרת ה-proxy של ה-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 של שרת ה-proxy.

    המשאבים יכולים להיות זמינים ברמת הסביבה או ברמת הארגון. אפשר לקרוא מידע נוסף במאמר בנושא קובצי משאבים.

    כדי לקבוע אם המשאב קיים ברמת הסביבה, צריך לבצע את הקריאה הבאה ל-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. אם נקבע שהמשאב קיים ברמת שרת ה-proxy של ה-API, הארגון או הסביבה, מוחקים את המשאב ומעלים אותו מחדש, כפי שמתואר בשלב 2. אם לא, מדלגים לשלב 3.
  2. כדי למחוק את המשאב ברמת שרת ה-proxy של ה-API, מנווטים לכרטיסייה 'משאבים' בחלונית הניווט של עורך ה-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 של שרת ה-API, הארגון או הסביבה.

  4. אם העלאה מחדש של המשאב לא עוזרת, צריך להפעיל מחדש את מעבדי ההודעות שהושפעו. אם אתם משתמשים ב-Apigee Edge בענן, עליך לפנות לתמיכה של Apigee. אם אתם משתמשים בענן פרטי, כדאי לעיין במאמר הפעלה, עצירה, הפעלה מחדש ובדיקת הסטטוס של Apigee Edge.

JavaCalloutInstantiationFailed

הודעת שגיאה

כשפורסים את ה-API של ה-API דרך ממשק המשתמש של 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, שרת ה-proxy, הארגון או הסביבה. אם לא העליתם את קובץ ה-JAR לאף אחת מהרמות, עוברים אל 'פתרון'.
  3. אם העליתם את קובץ ה-JAR, עוברים אל הסיבה: קובץ JAR פגום.

רזולוציה

  1. אם קובץ ה-JAR פגום או שהועלה חלקית, יוצרים מחדש את ה-JAR ומעלים את קובץ ה-JAR ברמה המתאימה (שרת proxy של API, ארגון או סביבה).
  2. פורסים מחדש את שרת ה-proxy של ה-API.

הסיבה: קובץ JAR פגום

אבחון

  1. קובעים את קובץ ה-JAR שאמור להכיל את המחלקה (שזוהה בשלב #1 למעלה) שלא ניתן ליצור ממנה מופע.
  2. בודקים אם קובץ ה-JAR הספציפי פגום. לדוגמה, אם אי אפשר לבטל את הדגשת הקובץ כי הוא פגום או הועלה באופן חלקי. אם הוא פגום, עוברים ל'פתרון'.
  3. אם קובץ ה-JAR לא פגום, עוברים אל הסיבה: קובץ הכיתה חסר.

רזולוציה

  1. בונים מחדש את קובצי ה-JAR הפגומים ומעלים את קובץ ה-JAR ברמה המתאימה (שרת proxy של API, ארגון או רמת סביבה.
  2. פורסים מחדש את שרת ה-proxy של ה-API.

הסיבה: חסר קובץ מחלקה

אבחון

  1. בודקים אם קובץ ה-Java הספציפי (שזוהה בשלב 1 למעלה) הוא חלק מקובץ ה-JAR שצוין ב->ResourceURL< או מכל אחד מקובצי ה-JAR התלויים.
  2. אם קובץ המחלקה לא קיים באף אחד מקובצי ה-JAR, אתם קובעים את הגורם לשגיאה. עוברים אל 'פתרון'.
  3. אם קובץ המחלקה קיים באחד מקובצי ה-JAR שצוינו במדיניות JavaCallout, חייבת להיות בעיה בקוד ה-Java או במחלקה התלויה שמובילה לשגיאה הזו. א. אם אתם משתמשים ב-Public Cloud, תוכלו לפנות לתמיכה של Apigee. ב. אם אתם משתמשים בענן פרטי, עליכם לעבור להסיבה: בעיה בקוד Java.

רזולוציה

  1. יוצרים מחדש את ה-JAR עם קובצי המחלקה החסרים ומעלים את קובץ ה-JAR ברמה המתאימה (שרת proxy של ה-API, הארגון או הסביבה).
  2. פורסים מחדש את שרת ה-proxy של ה-API.

הסיבה: בעיה בקוד 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 עם קובצי המחלקה החסרים ומעלים את קובץ ה-JAR ברמה המתאימה (שרת proxy של ה-API, הארגון או הסביבה).
  3. פורסים מחדש את שרת ה-proxy של ה-API.

העלאת קובץ ה-JAR

יש לוודא שרכיב המשאב עם כל המחלקות הדרושות קיים ברמת שרת ה-proxy של ה-API, הסביבה או הארגון. אפשר לקרוא מידע נוסף במאמר בנושא קובצי משאבים.

  1. כדי להעלות משאב ברמת שרת ה-proxy של ה-API, לוחצים על + (סימן חיבור) בכרטיסייה 'משאבים', בוחרים באפשרות ייבוא קובץ ומעלים קובץ מהמחשב המקומי. שם הקובץ צריך להיות תואם לרכיב >ResourceURL<, אבל בלי הקידומת java://.

  2. אם רוצים שמשאב יהיה זמין ליותר משרת proxy אחד של API באותה סביבה, צריך להעלות את המשאב לסביבה. צריך להשתמש ב-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. כדי שהקובץ יהיה זמין לכל שרתי ה-proxy של ה-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"