Risoluzione degli errori di runtime dei criteri JavaCallout

Stai visualizzando la documentazione di Apigee Edge.
Vai alla documentazione di Apigee X.
informazioni

ResourceDoesNotExist

Messaggio di errore

Il deployment del proxy API tramite l'UI o l'API di gestione perimetrale non riesce e genera questo messaggio di errore:

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

Esempio di messaggio di errore

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

Screenshot di errore di esempio

Causa

Se la risorsa specificata nell'elemento <ResourceURL> nel criterio JavaCallout non esiste a livello di organizzazione, proxy o ambiente, il deployment del proxy API non andrà a buon fine.

Diagnostica

  1. Identifica l'ambiente e il nome della risorsa. Puoi trovare queste informazioni nel messaggio di errore. Ad esempio, nel seguente errore l'ambiente è test e il nome della risorsa utilizzato nell'elemento <ResourceURL> è myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Determina il criterio JavaCallout che utilizza la risorsa identificata nel passaggio 1 riportato sopra.

    Ad esempio, il seguente criterio specifica il valore di <ResourceURL> come myresource.jar, che corrisponde al valore nel messaggio di errore:

    <?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. Determina se la risorsa fa parte del proxy API con errori o se è stata caricata a livello di ambiente o di organizzazione. In caso contrario, è questa la causa.

    • Vai alla scheda Risorse nel riquadro di navigazione dell'editor proxy API per visualizzare tutte le risorse caricate a livello di proxy API. In questo esempio, per il proxy API non sono state caricate risorse.

    • Le risorse possono essere disponibili a livello di ambiente o di organizzazione. Per ulteriori informazioni, consulta File di risorse.

      • Per determinare se la risorsa esiste a livello di ambiente, esegui la chiamata API seguente utilizzando curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Per determinare se la risorsa esiste a livello di organizzazione, esegui la chiamata API seguente utilizzando curl, omettendo i dettagli dell'ambiente: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Se ricevi un codice di stato 404 come risposta per queste API, significa che la risorsa risulta mancante sia a livello di organizzazione che di ambiente.

    Se la risorsa non è disponibile a livello di proxy API, organizzazione e ambiente, viene restituito l'errore di deployment:

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

Risoluzione

Assicurati che la risorsa specificata nell'elemento <ResourceURL> esista a livello di organizzazione, proxy o ambiente dell'API. Per ulteriori informazioni, consulta File di risorse.

Per correggere il criterio JavaCallout di esempio mostrato sopra, carica il file JAR al livello appropriato (proxy API, organizzazione o livello di ambiente).

NoResourceForURL

Messaggio di errore

Il deployment del proxy API tramite l'UI o l'API di gestione perimetrale non riesce e genera questo messaggio di errore:

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>

Esempio di messaggio di errore

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

Screenshot di errore di esempio

Causa

Questo errore può verificarsi se il file di risorse è danneggiato o caricato parzialmente, anche se sembra esistere a livello di proxy API, ambiente o organizzazione.

Diagnostica

  1. Identifica l'ambiente e il nome della risorsa. Puoi trovare queste informazioni nel messaggio di errore. Ad esempio, nell'errore seguente, il nome dell'ambiente è test e il nome della risorsa utilizzato nell'elemento <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. Assicurati che la risorsa sia caricata a livello di organizzazione, proxy o ambiente. Nell'esempio riportato di seguito, puoi vedere che la risorsa myresource.jar viene caricata a livello di proxy API.

    Le risorse possono essere disponibili a livello di ambiente o di organizzazione. Per ulteriori informazioni, consulta File di risorse.

    Per determinare se la risorsa esiste a livello di ambiente, esegui la chiamata API seguente utilizzando curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Per determinare se la risorsa esiste a livello di organizzazione, esegui la chiamata API seguente utilizzando curl, omettendo i dettagli dell'ambiente: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Se ricevi un codice di stato 404 come risposta per queste API, significa che la risorsa risulta mancante sia a livello di organizzazione che di ambiente.

Risoluzione

  1. Se stabilisci che la risorsa esiste a livello di proxy API, organizzazione o ambiente, eliminala e ricaricala, come descritto nel passaggio 2. In caso contrario, vai al passaggio 3.
  2. Per eliminare la risorsa a livello di proxy API, vai alla scheda Risorse nel riquadro di navigazione dell'editor proxy API e fai clic sul pulsante "X" accanto alla risorsa, come mostrato di seguito.

    Per eliminare la risorsa a livello di ambiente o organizzazione, utilizza il verbo DELETE sulle chiamate API utilizzate in precedenza nei passaggi della diagnostica. Ad esempio, per eliminare la risorsa a livello di ambiente, inserisci il comando seguente: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Carica il file JAR) al livello appropriato (proxy API, organizzazione o ambiente).

  4. Se il problema persiste dopo aver ricaricato la risorsa, i processori di messaggi interessati devono essere riavviati. Se utilizzi Apigee Edge in Cloud, contatta l'assistenza Apigee. Se sei un utente di Private Cloud, consulta Avvio, arresto, riavvio e controllo dello stato di Apigee Edge.

JavaCalloutInstantiationFailed

Messaggio di errore

Il deployment del proxy API tramite l'UI o l'API di gestione perimetrale non riesce e genera questo messaggio di errore:

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>

Oppure

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>

Esempio di messaggio di errore

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

Screenshot di errore di esempio

Causa

Di seguito sono riportate le cause tipiche di questo errore

Causa Descrizione
File JAR mancante Il file JAR contenente la classe Java identificata nell'errore non viene caricato.
File JAR danneggiato Il file JAR contenente la classe Java identificata nell'errore è danneggiato o parzialmente caricato.
File del corso mancante Il file della classe Java identificato nell'errore non fa parte del file JAR specificato in >ResourceURL< o nei file JAR dipendenti.
Problema con il codice Java È presente un errore nel codice, ad esempio un costruttore mancante, un problema di dipendenza del codice o un altro problema.

Passaggio di diagnosi comune

  1. Identifica il nome dell'ambiente e la classe che non è stato possibile importare. Ad esempio, nel seguente messaggio di errore il nome dell'ambiente è test e il nome della classe è my.class:

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

    Causa: file JAR mancante

Diagnostica

  1. Determina il file JAR che dovrebbe contenere la classe (identificata nel passaggio 1 sopra) e di cui non è stato possibile creare un'istanza.
  2. Verifica se il file JAR specifico è stato caricato a livello di proxy API, organizzazione o ambiente. Se il file JAR non viene caricato in nessuno dei livelli, vai alla sezione Risoluzione.
  3. Se il file JAR è stato caricato, vai a Causa: file JAR danneggiato.

Risoluzione

  1. Se il file JAR è danneggiato o è stato caricato parzialmente, ricrealo e caricalo al livello appropriato (proxy API, organizzazione o ambiente).
  2. Esegui di nuovo il deployment del proxy API.

Causa: file JAR danneggiato

Diagnostica

  1. Determina il file JAR che dovrebbe contenere la classe (identificata nel passaggio 1 sopra) di cui non è stato possibile creare un'istanza.
  2. Controlla se il file JAR specifico è danneggiato. Ad esempio, se non riesci a sbloccare il file perché è danneggiato o è stato caricato parzialmente. Se è danneggiata, vai alla sezione Risoluzione.
  3. Se il file JAR non è danneggiato, vai a Causa: file di classe mancante.

Risoluzione

  1. Ricrea i file JAR danneggiati e carica il file JAR al livello appropriato (proxy API, organizzazione o livello di ambiente.
  2. Esegui di nuovo il deployment del proxy API.

Causa: file del corso mancante

Diagnostica

  1. Controlla se il file di classe Java specifico (identificato nel passaggio 1 sopra) fa parte del file JAR specificato in >ResourceURL< o uno dei file JAR dipendenti.
  2. Se il file della classe non esiste in nessuno dei file JAR, hai determinato la causa dell'errore. Vai a Risoluzione.
  3. Se il file della classe è presente in uno dei file JAR specificati nel criterio JavaCallout, è necessario che questo errore si sia verificato con il codice Java o con la classe dipendente. a. Se sei un utente del cloud pubblico, contatta l'Assistenza Apigee. b. Se sei un utente di Private Cloud, passa a Causa: problema con il codice Java.

Risoluzione

  1. Ricrea il JAR con i file della classe mancanti e carica il file JAR al livello appropriato (proxy API, organizzazione o livello di ambiente).
  2. Esegui di nuovo il deployment del proxy API.

Causa: problema con il codice Java

Passaggi di diagnostica solo per utenti di Private Cloud

Diagnostica

  1. Controlla i log del processore di messaggi (/opt/apigee/var/log/edge-message-processor/system.log e /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Potresti notare un'eccezione simile all'esempio riportato di seguito:

    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. Leggi attentamente l'eccezione per comprendere il motivo dell'errore. In genere, ciò potrebbe indicare un problema nel codice Java.

Risoluzione

  1. A seconda della causa dell'errore, potrebbe essere necessario risolvere il problema nel codice Java.
  2. Ricrea il JAR con i file della classe mancanti e carica il file JAR al livello appropriato (proxy API, organizzazione o livello di ambiente).
  3. Esegui di nuovo il deployment del proxy API.

Carica il file JAR

Assicurati che l'elemento risorsa con tutte le classi necessarie esista a livello di proxy API, ambiente o organizzazione. Per ulteriori informazioni, consulta File di risorse.

  1. Per caricare una risorsa a livello di proxy API, fai clic sul segno + (segno più) nella scheda Risorse, quindi seleziona Importa file e carica il file dalla macchina locale. Il nome file deve corrispondere all'elemento >ResourceURL<, ma senza prefisso java://.

  2. Se vuoi che una risorsa sia disponibile per più proxy API nello stesso ambiente, caricala nell'ambiente. Dovrai utilizzare l'API Edge, come descritto in File di risorse.

    Ad esempio, inserisci la seguente chiamata API dalla macchina locale per caricare il file specificato a livello di ambiente:

    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"
    

    Effettua la chiamata API dalla stessa directory del file.

  3. Per rendere disponibile il file per tutti i proxy API in tutti gli ambienti dell'organizzazione, puoi omettere i dettagli dell'ambiente nel percorso base. Ad esempio:

    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"