איך מטפלים בשגיאות של יתרונות מרכזיים ב-Java

אתם צופים במסמכי התיעוד של Apigee Edge.
כדאי לעיין במסמכי התיעוד של Apigee X.
מידע

מהי קריאה ל-Java?

אם אין לכם ניסיון עם קריאות ל-Java, מומלץ להתחיל עם המאמר איך יוצרים קריאה ל-Java.

טיפול בשגיאות ב-Java Callout

כשכותבים Java Callout, יכול להיות שתרצו לבצע טיפול בשגיאות בהתאמה אישית בקוד Java. לדוגמה, יכול להיות שתרצו להחזיר הודעות שגיאה וכותרות בהתאמה אישית ו/או להגדיר משתני זרימה עם פרטי שגיאה בזרימת ה-proxy ב-Edge.

נציג דוגמה פשוטה של Java Callout שממחישה דפוסי טיפול בסיסיים בשגיאות מותאמות אישית. הדוגמה מחזירה הודעת שגיאה מותאמת אישית כשמתרחש חריג. הוא גם מציב את עקבות מחסנית השגיאות במשתנה של זרימת העבודה, וזו יכולה להיות טכניקה שימושית לניפוי באגים.

הורדת הפרויקט

כדי לפשט את התהליך, אפשר להוריד את הפרויקט הזה ממאגר api-platform-samples של Apigee ב-GitHub.

  1. מורידים או משכפלים את api-platform-samples למערכת.
  2. במסוף או בכלי לעריכת קוד לפי בחירתכם, עוברים לפרויקט api-platform-samples/doc-samples/java-error.

קוד Java לדוגמה

התבניות לטיפול בשגיאות הן פשוטות. אפשר להגדיר משתני Flow בהקשר הנוכחי של Edge Flow באמצעות השיטה messageContext.setVariable(). כדי להחזיר פרטי שגיאה מותאמים אישית, צריך ליצור מופע ExecutionResult ולקרוא לשיטות שלו כדי להגדיר את תגובת השגיאה ואת הכותרות.

package com.apigeesample;

import com.apigee.flow.execution.ExecutionContext;
import com.apigee.flow.execution.ExecutionResult;
import com.apigee.flow.execution.spi.Execution;
import com.apigee.flow.message.MessageContext;
import com.apigee.flow.execution.Action;

import org.apache.commons.lang.exception.ExceptionUtils;


public class JavaError implements Execution {
    public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) {

        try {

                String name = messageContext.getMessage().getHeader("username");

                if (name != null && name.length()>0) {
                        messageContext.getMessage().setContent("Hello, " + name + "!");
                        messageContext.getMessage().removeHeader("username");

                } else {
                        throw new RuntimeException("Please specify a name parameter!");
                }

                return ExecutionResult.SUCCESS;

        } catch (RuntimeException ex) {

            ExecutionResult executionResult = new ExecutionResult(false, Action.ABORT);

            //--Returns custom error message and header
            executionResult.setErrorResponse(ex.getMessage());
            executionResult.addErrorResponseHeader("ExceptionClass", ex.getClass().getName());

            //--Set flow variables -- may be useful for debugging.
            messageContext.setVariable("JAVA_ERROR", ex.getMessage());
            messageContext.setVariable("JAVA_STACKTRACE", ExceptionUtils.getStackTrace(ex));
            return executionResult;
        }
    }
}


קומפילציה של הקוד באמצעות Maven

הפרויקט מוגדר כך שאפשר לבצע קומפילציה באמצעות Maven. אם רוצים להשתמש בערך javac, נכלול גם דוגמה.

  1. מוודאים ש-Maven מותקן:
    mvn -version
  2. מריצים את הסקריפט java-error/buildsetup.sh. הסקריפט הזה מתקין את יחסי התלות הנדרשים ב-JAR במאגר Maven המקומי.
  3. משתמשים בפקודה cd כדי לעבור לספרייה java-error/callout.
  4. מריצים את Maven:
    mvn clean package
  5. אם רוצים, אפשר לוודא שקובץ ה-JAR‏ edge-custom-policy-java-error.jar הועתק אל java-error/apiproxy/resources/java. זה המיקום הנדרש לקובצי JAR שרוצים לפרוס באמצעות שרת proxy.

הידור באמצעות javac

אם רוצים להשתמש ב-javac כדי לקמפל את הקוד, אפשר לעשות משהו דומה למה שמופיע בהמשך (מתוך הספרייה java-error). קובצי ה-JAR הנדרשים מסופקים לכם בספרייה java-error/lib.

  1. ‫cd אל api-platform-samples/doc-samples/java-error.
  2. חשוב לוודא ש-javac נמצא בנתיב.

    javac -version
  3. מריצים את פקודת ה-javac הבאה:

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/JavaProperties.java
  4. מעתיקים את קובץ ה-JAR לספרייה apiproxy/resources/java. זה המיקום הנדרש לקובצי JAR שרוצים לפרוס באמצעות שרת proxy.

    cp com/apigeesample/JavaProperties.class apiproxy/resources/java

פריסה של ה-proxy והתקשרות אליו

סקריפט פריסה מסופק בספרייה ./java-error. אבל לפני שמפעילים פתרונות חכמים, צריך לבצע הגדרה מהירה.

  1. ‫cd אל api-platform-samples/doc-samples/java-error
  2. אם עוד לא עשיתם את זה, פותחים את הקובץ ../../setup/setenv.sh ועורכים אותו לפי ההוראות עם פרטי החשבון שלכם ב-Apigee: שם המשתמש (כתובת האימייל שמשויכת לחשבון), שם הארגון והדומיין שבו אתם משתמשים כדי לבצע קריאות לניהול API. לדוגמה, בדומיין Edge cloud, הדומיין הוא https://api.enterprise.apigee.com, אבל יכול להיות שהדומיין שלכם יהיה שונה אם אתם משתמשים ב-Edge Private Cloud.
  3. שומרים את קובץ ה-setenv.sh.
  4. מריצים את סקריפט הפריסה:
    ./deploy.sh
  5. אם הפריסה מצליחה, מפעילים את הסקריפט של הפונקציה:
    ./invoke.sh

    סקריפט ההפעלה קורא לפקודת cURL שנראית כך:

    curl  http://$org-$env.$api_domain/java-error

    מכיוון שהקריאה לא כוללת פרמטר שאילתה בשם name, קוד ה-Java מחזיר שגיאת זמן ריצה. ה-Proxy מחזיר את ההודעה והכותרת הבאות:

  • הודעת שגיאה: Please specify a name parameter!
  • כותרת: ExceptionClass: java.lang.RuntimeException