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

מוצג המסמך של Apigee Edge.
עוברים אל מסמכי תיעוד של Apigee X.
מידע

ResourceDoesNotExist

הודעת שגיאה

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

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

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

NoResourceForURL

הודעת שגיאה

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

רזולוציה

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

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

JavaCalloutInstantiationFailed

הודעת שגיאה

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

שלב 'אבחון נפוץ'

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

רזולוציה

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

הסיבה: בעיה בקוד 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. לפרוס מחדש את ה-API Proxy.

העלאת קובץ ה-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 בכל הסביבות בארגון, אפשר להשמיט את פרטי הסביבה מה-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"