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

Vous consultez la documentation d'Apigee Edge.
Consultez la documentation 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 le message d'erreur suivant:

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 JavaCallout 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 défaillant ou 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 suivante est renvoyée:

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

Résolution

Assurez-vous que la ressource spécifiée dans l'élément <ResourceURL> existe au niveau du proxy de l'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 JavaCallout 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 le message d'erreur suivant:

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 de l'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 de l'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.

Résolution

  1. Si vous déterminez que la ressource existe au niveau du proxy de l'API, de l'organisation ou de l'environnement, supprimez-la 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 de navigation de l'éditeur de proxy d'API et cliquez sur le bouton « X » à côté de la ressource, comme indiqué 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 d'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 Cloud, contactez l'assistance Apigee. Si vous êtes un utilisateur de cloud privé, consultez la section 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 le message d'erreur suivant:

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 avec le code Java Le code comporte une erreur, par exemple un constructeur manquant, un problème de dépendance de code ou un autre problème.

É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 importé au niveau du proxy de l'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.

Résolution

  1. Si le fichier JAR est corrompu ou partiellement importé, recompilez-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.

Résolution

  1. Recompilez 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 existe dans l'un des fichiers JAR spécifiés dans la règle JavaCallout, un problème lié au code Java ou à la classe dépendante doit être à l'origine de cette erreur. a. Si vous êtes un utilisateur de cloud public, contactez l'assistance Apigee. b. Si vous êtes un utilisateur de Private Cloud, passez à Cause: Java Code Issue (Cause : problème de code Java).

Résolution

  1. Recompilez le fichier JAR avec le ou les fichiers de classe manquants et importez-le 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 Private Cloud 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. Vous pouvez voir une exception semblable à l'exemple ci-dessous:

    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.

Résolution

  1. Selon la cause de l'échec, vous devrez peut-être le résoudre dans votre code Java.
  2. Recompilez le fichier JAR avec le ou les fichiers de classe manquants et importez-le 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 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"