Fehlerbehebung bei der Laufzeit von JavaCallout-Richtlinien

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

ResourceDoesNotExist

Fehlermeldung

Die Bereitstellung des API-Proxys über die Edge-Benutzeroberfläche oder die Edge-Verwaltungs-API schlägt mit dieser Fehlermeldung fehl:

Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.

Beispiel für Fehlermeldung

Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.

Beispiel für einen Fehler-Screenshot

Ursache

Wenn die im <ResourceURL>-Element in der JavaCallout-Richtlinie angegebene Ressource auf API-Proxy-, Umgebungs- oder Organisationsebene nicht vorhanden ist, schlägt die Bereitstellung des API-Proxys fehl.

Diagnose

  1. Ermitteln Sie die Umgebung und den Ressourcennamen. Diese Informationen finden Sie in der Fehlermeldung. Im folgenden Fehler ist die Umgebung beispielsweise test und der im <ResourceURL>-Element verwendete Ressourcenname ist myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Ermitteln Sie die JavaCallout-Richtlinie, die die oben in Schritt 1 angegebene Ressource verwendet.

    Die folgende Richtlinie gibt beispielsweise den Wert von <ResourceURL> als myresource.jar an, was mit dem Wert in der Fehlermeldung übereinstimmt:

    <?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. Ermitteln Sie, ob die Ressource entweder Teil des fehlerhaften API-Proxys ist oder auf Umgebungs- oder Organisationsebene hochgeladen wird. Wenn nicht, ist sie die Ursache des Fehlers.

    • Gehen Sie im Navigationsbereich des API-Proxy-Editors zum Tab "Ressourcen", um alle Ressourcen anzuzeigen, die auf API-Proxyebene hochgeladen wurden. In diesem Beispiel wurden für den API-Proxy keine Ressourcen hochgeladen.

    • Ressourcen können auf Umgebungs- oder Organisationsebene verfügbar sein. Weitere Informationen finden Sie unter Ressourcendateien.

      • Führen Sie den folgenden API-Aufruf mit „curl“ aus, um festzustellen, ob die Ressource auf Umgebungsebene vorhanden ist: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Um festzustellen, ob die Ressource auf Organisationsebene vorhanden ist, führen Sie den folgenden API-Aufruf mit curl aus und lassen Sie die Umgebungsdetails weg: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Wenn Sie als Antwort für diese APIs einen Statuscode 404 erhalten, fehlt die Ressource sowohl auf Organisations- als auch auf Umgebungsebene.

    Wenn die Ressource auf API-Proxy-, Organisations- und Umgebungsebene nicht verfügbar ist, wird der Bereitstellungsfehler zurückgegeben:

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

Auflösung

Achten Sie darauf, dass die im Element <ResourceURL> angegebene Ressource auf API-Proxy-, Umgebungs- oder Organisationsebene vorhanden ist. Weitere Informationen finden Sie unter Ressourcendateien.

Um die oben gezeigte Beispiel-JavaCallout-Richtlinie zu korrigieren, laden Sie die JAR-Datei auf der entsprechenden Ebene hoch (API-Proxy-, Organisations- oder Umgebungsebene).

NoResourceForURL

Fehlermeldung

Die Bereitstellung des API-Proxys über die Edge-Benutzeroberfläche oder die Edge-Verwaltungs-API schlägt mit dieser Fehlermeldung fehl:

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>

Beispiel für Fehlermeldung

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar

Beispiel für einen Fehler-Screenshot

Ursache

Dieser Fehler kann auftreten, wenn die Ressourcendatei beschädigt oder teilweise hochgeladen wurde, obwohl sie offenbar auf der API-Proxy-, Umgebungs- oder Organisationsebene vorhanden zu sein scheint.

Diagnose

  1. Identifizieren Sie die Umgebung und den Ressourcennamen. Diese Informationen finden Sie in der Fehlermeldung. Im folgenden Fehler lautet der Umgebungsname beispielsweise test und der im <ResourceURL>-Element verwendete Ressourcenname ist 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. Achten Sie darauf, dass die Ressource auf API-Proxy-, Umgebungs- oder Organisationsebene hochgeladen wird. Im folgenden Beispiel können Sie sehen, dass die Ressource myresource.jar auf die API-Proxyebene hochgeladen wurde.

    Ressourcen können auf Umgebungs- oder Organisationsebene verfügbar sein. Weitere Informationen finden Sie unter Ressourcendateien.

    Führen Sie den folgenden API-Aufruf mit „curl“ aus, um festzustellen, ob die Ressource auf Umgebungsebene vorhanden ist: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Um festzustellen, ob die Ressource auf Organisationsebene vorhanden ist, führen Sie den folgenden API-Aufruf mit curl aus und lassen Sie die Umgebungsdetails weg: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Wenn Sie als Antwort für diese APIs einen Statuscode 404 erhalten, fehlt die Ressource sowohl auf Organisations- als auch auf Umgebungsebene.

Auflösung

  1. Wenn Sie feststellen, dass die Ressource auf API-Proxy-, Organisations- oder Umgebungsebene vorhanden ist, löschen Sie die Ressource und laden Sie sie noch einmal hoch, wie in Schritt 2 beschrieben. Fahren Sie andernfalls mit Schritt 3 fort.
  2. Um die Ressource auf API-Proxy-Ebene zu löschen, navigieren Sie zur Registerkarte Ressourcen im Navigator-Bereich des API-Proxy-Editors und klicken Sie, wie unten dargestellt, auf die Schaltfläche „X“ neben der Ressource.

    Um eine Ressource auf Umgebungs- oder Organisationsebene zu löschen, verwenden Sie das DELETE-Verb für die API-Aufrufe, die zuvor in den Diagnoseschritten verwendet wurden. Wenn Sie beispielsweise die Ressource auf Umgebungsebene löschen möchten, geben Sie den folgenden Befehl ein: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Laden Sie die JAR-Datei auf der entsprechenden Ebene (API-Proxy-, Organisations- oder Umgebungsebene) hoch.

  4. Wenn das erneute Hochladen der Ressource nichts nützt, müssen die betroffenen Message Processor neu gestartet werden. Wenn Sie Apigee Edge in der Cloud verwenden, wenden Sie sich an den Apigee-Support. Wenn Sie ein Private Cloud-Nutzer sind, lesen Sie Starten, Anhalten, Neustarten und Prüfen des Status von Apigee Edge.

JavaCalloutInstantiationFailed

Fehlermeldung

Die Bereitstellung des API-Proxys über die Edge-Benutzeroberfläche oder die Edge-Verwaltungs-API schlägt mit dieser Fehlermeldung fehl:

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>

Alternative

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>

Beispiel für Fehlermeldung

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class

Beispiel für einen Fehler-Screenshot

Ursache

Typische Ursachen für diesen Fehler

Ursache Beschreibung
Fehlende JAR-Datei Die JAR-Datei mit der im Fehler identifizierten Java-Klasse wird nicht hochgeladen.
Beschädigte JAR-Datei Die JAR-Datei mit der im Fehler identifizierten Java-Klasse ist beschädigt/teilweise hochgeladen.
Fehlende Klassendatei Die im Fehler angegebene Java-Klassendatei ist nicht Teil der JAR-Datei, die unter >ResourceURL< oder in abhängigen JAR-Dateien angegeben ist.
Java-Code-Problem Der Code enthält einen Fehler, etwa einen fehlenden Konstruktor, ein Problem mit der Codeabhängigkeit oder ein anderes Problem.

Allgemeiner Diagnoseschritt

  1. Identifizieren Sie den Namen der Umgebung und die Klasse, die nicht importiert werden konnten. In der folgenden Fehlermeldung lautet der Umgebungsname beispielsweise test und der Klassenname ist my.class:

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
    
    

    Ursache: Fehlende JAR-Datei

Diagnose

  1. Bestimmen Sie die JAR-Datei, die die Klasse enthalten soll (oben in Schritt 1 identifiziert), die nicht instanziiert werden konnte.
  2. Überprüfen Sie, ob die spezifische JAR-Datei auf API-Proxy-, Organisations- oder Umgebungsebene hochgeladen wurde. Wenn die JAR-Datei nicht auf eine der Ebenen hochgeladen wurde, gehen Sie zu "Lösung".
  3. Wenn die JAR-Datei hochgeladen wurde, gehen Sie zu Ursache: beschädigte JAR-Datei.

Auflösung

  1. Wenn die JAR-Datei beschädigt oder teilweise hochgeladen wurde, erstellen Sie sie neu und laden Sie die JAR-Datei auf der entsprechenden Ebene (API-Proxy-, Organisations- oder Umgebungsebene) hoch.
  2. Stellen Sie den API-Proxy neu bereit.

Ursache: Beschädigte JAR-Datei

Diagnose

  1. Bestimmen Sie die JAR-Datei, die die Klasse enthalten soll (oben in Schritt 1 identifiziert), die nicht instanziiert werden konnte.
  2. Prüfen Sie, ob die jeweilige JAR-Datei beschädigt ist. Beispielsweise wenn Sie die Datei nicht entpacken können, weil sie beschädigt ist oder unvollständig hochgeladen wurde. Wenn sie beschädigt ist, gehen Sie zu "Lösung".
  3. Wenn die JAR-Datei nicht beschädigt ist, gehen Sie zu Ursache: Fehlende Klassendatei.

Auflösung

  1. Erstellen Sie die beschädigten JAR-Dateien neu und laden Sie die JAR-Datei hoch auf der entsprechenden Ebene (API-Proxy-, Organisations- oder Umgebungsebene).
  2. Stellen Sie den API-Proxy neu bereit.

Ursache: Fehlende Klassendatei

Diagnose

  1. Prüfen Sie, ob die (oben in Schritt 1 genannte Java-Klassendatei) Teil der JAR-Datei ist, die in >ResourceURL< oder einer der abhängigen JAR-Dateien angegeben ist.
  2. Wenn die Klassendatei in keiner der JAR-Dateien vorhanden ist, haben Sie die Ursache des Fehlers ermittelt. Gehe zu "Lösung".
  3. Wenn die Klassendatei in einer der in der JavaCallout-Richtlinie angegebenen JAR-Dateien enthalten ist, muss ein Problem mit dem Java-Code oder der abhängigen Klasse zu diesem Fehler führen. a. Wenn Sie Nutzer der öffentlichen Cloud sind, wenden Sie sich an den Apigee-Support. b. Wenn Sie ein Private Cloud-Nutzer sind, fahren Sie mit Ursache: Java-Codeproblem fort.

Auflösung

  1. Erstellen Sie die JAR-Datei mit den fehlenden Klassendateien neu und laden Sie die JAR-Datei auf die entsprechende Ebene (API-Proxy-, Organisations- oder Umgebungsebene) hoch.
  2. Stellen Sie den API-Proxy neu bereit.

Ursache: Problem mit Java-Code

Diagnoseschritte nur für Private Cloud-Nutzer

Diagnose

  1. Prüfen Sie die Message Processor-Protokolle (/opt/apigee/var/log/edge-message-processor/system.log und /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Möglicherweise wird eine Ausnahme wie im folgenden Beispiel angezeigt:

    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. Lesen Sie sich die Ausnahme sorgfältig durch, um den Grund für den Fehler zu verstehen. In der Regel weist dies auf Probleme in Ihrem Java-Code hin.

Auflösung

  1. Je nach Ursache des Fehlers müssen Sie das Problem möglicherweise in Ihrem Java-Code beheben.
  2. Erstellen Sie die JAR-Datei mit den fehlenden Klassendateien neu und laden Sie die JAR-Datei auf die entsprechende Ebene (API-Proxy-, Organisations- oder Umgebungsebene) hoch.
  3. Stellen Sie den API-Proxy neu bereit.

JAR-Datei hochladen

Stellen Sie sicher, dass das Ressourcenelement mit allen erforderlichen Klassen auf API-Proxy-, Umgebungs- oder Organisationsebene vorhanden ist. Weitere Informationen finden Sie unter Ressourcendateien.

  1. Zum Hochladen einer Ressource auf API-Proxyebene klicken Sie auf dem Tab "Ressourcen" auf + (Pluszeichen), wählen Sie dann Datei importieren aus und laden Sie die Datei von Ihrem lokalen Computer hoch. Der Dateiname muss dem Element >ResourceURL< entsprechen, aber ohne das Präfix java://.

  2. Wenn eine Ressource für mehrere API-Proxys in derselben Umgebung verfügbar sein soll, laden Sie die Ressource in die Umgebung hoch. Sie müssen die Edge-API verwenden, wie unter Ressourcendateien beschrieben.

    Geben Sie beispielsweise den folgenden API-Aufruf vom lokalen Computer ein, um die angegebene Datei auf der Umgebungsebene hochzuladen:

    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"
    

    Führen Sie den API-Aufruf aus demselben Verzeichnis wie die Datei aus.

  3. Wenn Sie die Datei für alle API-Proxys in allen Umgebungen der Organisation verfügbar machen möchten, können Sie die Umgebungsdetails im Basispfad weglassen. Beispiel:

    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"