Résoudre les erreurs d'exécution de la règle JavaCallout

<ph type="x-smartling-placeholder"></ph> Vous consultez la documentation Apigee Edge.
Accédez à la page Documentation sur Apigee X.
En savoir plus

ResourceDoesNotExist

Message d'erreur

Le déploiement du proxy d'API via l'interface utilisateur Edge ou l'API de gestion Edge échoue avec ce message d'erreur:

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

Exemple de message d'erreur

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

Exemple de capture d'écran d'erreur

Cause

Si la ressource spécifiée dans l'élément <ResourceURL> de la règle JavaAccroche n'existe pas au niveau du proxy d'API, de l'environnement ou de l'organisation, le déploiement du proxy d'API échoue.

Diagnostic

  1. Identifiez l'environnement et le nom de la ressource. Vous trouverez cette information dans le message d'erreur. Par exemple, dans l'erreur suivante, l'environnement est test et le nom de la ressource utilisé dans l'élément <ResourceURL> est myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Déterminez la règle JavaCallout qui utilise la ressource identifiée à l'étape 1 ci-dessus.

    Par exemple, la règle suivante spécifie la valeur de <ResourceURL> comme étant myresource.jar, ce qui correspond à la valeur figurant dans le message d'erreur :

    <?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. Déterminez si la ressource fait partie du proxy d'API qui est défaillante ou qui a été importée au niveau de l'environnement ou de l'organisation. Si ce n'est pas le cas, il s'agit de la cause de l'erreur.

    • Accédez à l'onglet "Resources" (Ressources) dans le volet de navigation de l'éditeur de proxys d'API pour afficher toutes les ressources importées au niveau du proxy d'API. Dans cet exemple, le proxy d'API ne contient aucune ressource importée.

    • Les ressources peuvent être disponibles au niveau de l'environnement ou de l'organisation. Pour en savoir plus, consultez la page Fichiers de ressources.

      • Pour déterminer si la ressource existe au niveau de l'environnement, exécutez l'appel d'API suivant à l'aide de curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Pour déterminer si la ressource existe au niveau de l'organisation, exécutez l'appel d'API suivant à l'aide de curl, en omettant les détails de l'environnement: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Si vous recevez un code d'état 404 en réponse à ces API, cela signifie que la ressource est manquante au niveau de l'organisation et de l'environnement.

    Si la ressource n'est pas disponible au niveau du proxy d'API, de l'organisation et de l'environnement, l'erreur de déploiement est renvoyée:

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

Solution

Assurez-vous que la ressource spécifiée dans l'élément <ResourceURL> existe au niveau du proxy d'API, de l'environnement ou de l'organisation. Pour en savoir plus, consultez la section Fichiers de ressources.

Pour corriger l'exemple de règle JavaAccroche ci-dessus, importez le fichier JAR au niveau approprié (proxy d'API, organisation ou environnement).

NoResourceForURL

Message d'erreur

Le déploiement du proxy d'API via l'interface utilisateur Edge ou l'API de gestion Edge échoue avec ce message d'erreur:

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>

Exemple de message d'erreur

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

Exemple de capture d'écran d'erreur

Cause

Cette erreur peut se produire si le fichier de ressources est corrompu ou partiellement importé, même s'il semble exister au niveau du proxy d'API, de l'environnement ou de l'organisation.

Diagnostic

  1. Identifiez l'environnement et le nom de la ressource. Vous trouverez cette information dans le message d'erreur. Par exemple, dans l'erreur suivante, le nom de l'environnement est test et le nom de la ressource utilisé dans l'élément <ResourceURL> est 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. Assurez-vous que la ressource est importée au niveau du proxy d'API, de l'environnement ou de l'organisation. Dans l'exemple ci-dessous, vous pouvez voir que la ressource myresource.jar est importée au niveau du proxy d'API.

    Les ressources peuvent être disponibles au niveau de l'environnement ou de l'organisation. Pour en savoir plus, consultez la page Fichiers de ressources.

    Pour déterminer si la ressource existe au niveau de l'environnement, exécutez l'appel d'API suivant à l'aide de curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Pour déterminer si la ressource existe au niveau de l'organisation, exécutez l'appel d'API suivant à l'aide de curl, en omettant les détails de l'environnement: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Si vous recevez un code d'état 404 en réponse à ces API, cela signifie que la ressource est manquante au niveau de l'organisation et de l'environnement.

Solution

  1. Si vous déterminez que la ressource existe au niveau du proxy d'API, de l'organisation ou de l'environnement, supprimez la ressource et réimportez-la, comme décrit à l'étape 2. Sinon, passez à l'étape 3.
  2. Pour supprimer la ressource au niveau du proxy d'API, accédez à l'onglet Ressources dans le volet Navigateur de l'éditeur de proxy d'API et cliquez sur le bouton « X » à côté de la ressource, comme illustré ci-dessous.

    Pour supprimer une ressource au niveau de l'environnement ou de l'organisation, utilisez le verbe DELETE sur les appels d'API utilisés précédemment dans les étapes de diagnostic. Par exemple, pour supprimer la ressource au niveau de l'environnement, saisissez la commande suivante: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Importez le fichier JAR) au niveau approprié (proxy API, organisation ou environnement).

  4. Si la réimportation de la ressource ne résout pas le problème, vous devez redémarrer les processeurs de messages concernés. Si vous utilisez Apigee Edge dans le cloud, contactez l'assistance Apigee. Si vous êtes un utilisateur de cloud privé, consultez Démarrer, arrêter, redémarrer et vérifier l'état d'Apigee Edge.

JavaCalloutInstantiationFailed

Message d'erreur

Le déploiement du proxy d'API via l'interface utilisateur Edge ou l'API de gestion Edge échoue avec ce message d'erreur:

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>

Ou

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>

Exemple de message d'erreur

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

Exemple de capture d'écran d'erreur

Cause

Voici les causes typiques de cette erreur :

Cause Description
Fichier JAR manquant Le fichier JAR contenant la classe Java identifiée dans l'erreur n'est pas importé.
Fichier JAR corrompu Le fichier JAR contenant la classe Java identifiée dans l'erreur est corrompu ou partiellement importé.
Fichier de classe manquant Le fichier de classe Java identifié dans l'erreur ne fait pas partie du fichier JAR spécifié dans >ResourceURL< ou dans les fichiers JAR dépendants.
Problème de code Java Le code contient une erreur, par exemple un constructeur manquant, un problème de dépendance du code ou autre.

Étape de diagnostic commune

  1. Identifiez le nom de l'environnement et de la classe dont l'importation a échoué. Par exemple, dans le message d'erreur suivant, le nom de l'environnement est test et le nom de la classe est my.class :

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

    Cause : fichier JAR manquant

Diagnostic

  1. Déterminez le fichier JAR qui est censé contenir la classe (identifiée à l'étape 1 ci-dessus) et qui ne peut pas être instancié.
  2. Vérifiez si le fichier JAR spécifique est téléchargé au niveau du proxy d'API, de l'organisation ou de l'environnement. Si le fichier JAR n'est importé à aucun de ces niveaux, accédez à la section "Solution".
  3. Si le fichier JAR est importé, accédez à la section Cause : fichier JAR corrompu.

Solution

  1. Si le fichier JAR est corrompu ou partiellement importé, recréez-le et importez-le au niveau approprié (proxy d'API, organisation ou environnement).
  2. Redéployez le proxy d'API.

Cause : fichier JAR corrompu

Diagnostic

  1. Déterminez le fichier JAR qui est censé contenir la classe (identifiée à l'étape 1 ci-dessus) et qui ne peut pas être instancié.
  2. Vérifiez que le fichier JAR spécifique est corrompu. Par exemple, si vous ne pouvez pas extraire les données du fichier JAR, car il est corrompu ou partiellement importé. S'il est corrompu, accédez à la section "Solution".
  3. Si le fichier JAR n'est pas corrompu, accédez à la cause Cause : fichier de classe manquant.

Solution

  1. Recréez le ou les fichiers JAR corrompus et importez-les au niveau approprié (proxy d'API, organisation ou environnement).
  2. Redéployez le proxy d'API.

Cause : fichier de classe manquant

Diagnostic

  1. Vérifiez si le fichier de classe Java spécifique (identifié à l'étape 1 ci-dessus) fait partie du fichier JAR spécifié dans >ResourceURL< ou de l'un des fichiers JAR dépendants.
  2. Si le fichier de classe n'existe dans aucun fichier JAR, vous avez déterminé l'origine de l'erreur. Accédez à la section "Solution".
  3. Si le fichier de classe figure dans l'un des fichiers JAR spécifiés dans la règle JavaAccroche, il doit y avoir un problème avec le code Java ou la classe dépendante à l'origine de cette erreur. a. Si vous utilisez le cloud public, contactez l'assistance Apigee. b. Si vous utilisez un cloud privé, passez à la section Cause: problème de code Java.

Solution

  1. Recréez le fichier JAR avec le ou les fichiers de classe manquants, puis importez le fichier JAR au niveau approprié (proxy d'API, organisation ou environnement).
  2. Redéployez le proxy d'API.

Cause: problème de code Java

Étapes de diagnostic pour les utilisateurs de cloud privé uniquement

Diagnostic

  1. Vérifiez les journaux du processeur de messages (/opt/apigee/var/log/edge-message-processor/system.log et /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Une exception semblable à l'exemple ci-dessous peut s'afficher:

    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. Lisez attentivement l'exception pour comprendre la raison de l'échec. En général, cela peut indiquer un problème dans votre code Java.

Solution

  1. Selon la cause de l'échec, vous devrez peut-être corriger le problème dans votre code Java.
  2. Recréez le fichier JAR avec le ou les fichiers de classe manquants, puis importez le fichier JAR au niveau approprié (proxy d'API, organisation ou environnement).
  3. Redéployez le proxy d'API.

Importer le fichier JAR

Assurez-vous que l'élément de ressource avec toutes les classes nécessaires existe au niveau du proxy d'API, de l'environnement ou de l'organisation. Pour en savoir plus, consultez la page Fichiers de ressources.

  1. Pour importer une ressource au niveau du proxy d'API, cliquez sur + (signe plus) dans l'onglet "Resources" (Ressources), sélectionnez Import file (Importer un fichier), puis importez un fichier depuis votre machine locale. Le nom du fichier doit correspondre à l'élément >ResourceURL<, mais sans le préfixe java://.

  2. Si vous souhaitez qu'une ressource soit disponible pour plusieurs proxys d'API dans le même environnement, importez-la dans l'environnement. Vous devez utiliser l'API Edge, comme décrit dans la section Fichiers de ressources.

    Par exemple, saisissez l'appel d'API suivant depuis la machine locale pour importer le fichier spécifié au niveau de l'environnement :

    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"
    

    Envoyez l'appel d'API depuis le même répertoire que le fichier.

  3. Pour rendre le fichier disponible pour tous les proxys d'API dans tous les environnements de l'organisation, vous pouvez omettre les détails de l'environnement dans le chemin de base. Exemple :

    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"