Fehlerbehebung bei der Laufzeit von JavaCallout-Richtlinien

<ph type="x-smartling-placeholder"></ph> Sie sehen die Dokumentation zu Apigee Edge.
Gehen Sie 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 der folgenden 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 Element <ResourceURL> der JavaCallout-Richtlinie angegebene Ressource nicht auf API-Proxy-, Umgebungs- oder Organisationsebene 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 API-Proxys ist, der fehlerhaft ist oder auf Umgebungs- oder Organisationsebene hochgeladen wurde. 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 dem Befehl „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"

      • Wenn Sie herausfinden möchten, ob die Ressource auf Organisationsebene vorhanden ist, führen Sie den folgenden API-Aufruf mit „curl“ aus und lassen Sie dabei 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 404-Statuscode 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 JavaCallout-Beispielrichtlinie 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 der folgenden 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 ist, obwohl sie auf API-Proxy-, Umgebungs- oder Organisationsebene zu existieren 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 den API-Proxy, die Umgebung oder die Organisationsebene hochgeladen wurde. 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 dem Befehl „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"

    Wenn Sie herausfinden möchten, ob die Ressource auf Organisationsebene vorhanden ist, führen Sie den folgenden API-Aufruf mit „curl“ aus und lassen Sie dabei 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 404-Statuscode 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 wie in Schritt 2 beschrieben noch einmal hoch. Anderenfalls fahren Sie mit Schritt 3 fort.
  2. Um die Ressource auf API-Proxy-Ebene zu löschen, gehen Sie zum Tab Resources (Ressourcen) im Navigator-Bereich des API-Proxy-Editors und klicken Sie auf die Schaltfläche „X“ neben der Ressource, wie unten dargestellt.

    Wenn Sie eine Ressource auf Umgebungs- oder Organisationsebene löschen möchten, verwenden Sie das DELETE-Verb für die API-Aufrufe, die zuvor in Diagnoseschritten verwendet wurden. Wenn Sie die Ressource beispielsweise 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 hoch (API-Proxy-, Organisations- oder Umgebungsebene).

  4. Wenn das erneute Hochladen der Ressource nicht hilft, müssen die betroffenen Message Processor neu gestartet werden. Wenn Sie Apigee Edge in Cloud verwenden, wenden Sie sich an den Apigee-Support. Wenn Sie ein Private Cloud-Nutzer sind, lesen Sie Apigee Edge starten, beenden, neu starten und Status prüfen.

JavaCalloutInstantiationFailed

Fehlermeldung

Die Bereitstellung des API-Proxys über die Edge-Benutzeroberfläche oder die Edge-Verwaltungs-API schlägt mit der folgenden 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>

oder

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 bzw. unvollständig 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 nur teilweise hochgeladen wurde, erstellen Sie die JAR-Datei neu und laden Sie die JAR-Datei auf der entsprechenden Ebene hoch (API-Proxy-, Organisations- oder Umgebungsebene).
  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ädigte JAR-Datei(en) neu und laden Sie die JAR-Datei hoch, und zwar 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 vorhanden ist, muss ein Problem mit dem Java-Code oder der abhängigen Klasse vorliegen, das zu diesem Fehler führt. a) Wenn Sie eine öffentliche Cloud nutzen, 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 der entsprechenden Ebene hoch (API-Proxy-, Organisations- oder Umgebungsebene).
  2. Stellen Sie den API-Proxy neu bereit.

Ursache: Java-Codeproblem

Diagnoseschritte nur für Private Cloud-Nutzer

Diagnose

  1. Prüfen Sie die Message Processor-Logs (/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 genau durch, um die Fehlerursache zu verstehen. In der Regel weist dies auf ein Problem 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 der entsprechenden Ebene hoch (API-Proxy-, Organisations- oder Umgebungsebene).
  3. Stellen Sie den API-Proxy neu bereit.

JAR-Datei hochladen

Achten Sie darauf, 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"