Solución de errores en el entorno de ejecución de la política de JavaCallout

Estás consultando la documentación de Apigee Edge.
Consulta la documentación de Apigee X.
Información

ResourceDoesNotExist

Mensaje de error

La implementación del proxy de API a través de la IU de Edge o de la API de Edge Management falla y muestra este mensaje de error:

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

Ejemplo de mensaje de error

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

Captura de pantalla de error de ejemplo

Causa

Si el recurso especificado en el elemento <ResourceURL> en la política Javatexto no existe a nivel del proxy de la API, del entorno o de la organización, la implementación del proxy de la API fallará.

Diagnóstico

  1. Identifica el entorno y el nombre del recurso. Puedes encontrar esta información en el mensaje de error. Por ejemplo, en el siguiente error, el entorno es test y el nombre del recurso que se usa en el elemento <ResourceURL> es myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Determina la política JavaCallout que usa el recurso identificado en el paso1 anterior.

    Por ejemplo, la siguiente política especifica el valor de <ResourceURL> como myresource.jar, que coincide con el valor del mensaje de error:

    <?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 si el recurso es parte del proxy de API con errores o si se subió a nivel del entorno o de la organización. De lo contrario, esa es la causa del error.

    • Para ver todos los recursos subidos en el nivel del proxy de API, navega a la pestaña Recursos en el panel de navegación del editor de proxy de API. En este ejemplo, el proxy de API no tiene recursos subidos.

    • Los recursos pueden estar disponibles a nivel del entorno o de la organización. Para obtener más información, consulta Archivos de recursos.

      • Para determinar si el recurso existe en el nivel del entorno, emite la siguiente llamada a la API con curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Para determinar si el recurso existe a nivel de la organización, emite la siguiente llamada a la API con curl y omite los detalles del entorno: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Si recibes un código de estado 404 como respuesta para estas APIs, significa que falta el recurso en el nivel de organización y de entorno.

    Si el recurso no está disponible a nivel del proxy de API, la organización ni el entorno, se muestra el error de implementación:

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

Resolución

Asegúrate de que el recurso especificado en el elemento <ResourceURL> exista a nivel del proxy de API, del entorno o de la organización. Para obtener más información, consulta Archivos de recursos.

Para corregir la política JavaReferencia de ejemplo anterior, sube el archivo JAR en el nivel adecuado (nivel de proxy de API, organización o entorno).

NoResourceForURL

Mensaje de error

La implementación del proxy de API a través de la IU de Edge o de la API de Edge Management falla y muestra este mensaje de error:

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>

Ejemplo de mensaje de error

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

Captura de pantalla de error de ejemplo

Causa

Este error puede ocurrir si el archivo de recursos está dañado o se subió parcialmente, aunque parezca existir a nivel del proxy de la API, del entorno o de la organización.

Diagnóstico

  1. Identifica el entorno y el nombre del recurso. Puedes encontrar esta información en el mensaje de error. Por ejemplo, en el siguiente error, el nombre del entorno es test y el nombre del recurso que se usa en el elemento <ResourceURL> es 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. Asegúrate de que el recurso se suba a nivel del proxy de API, del entorno o de la organización. En el siguiente ejemplo, puedes ver que el recurso myresource.jar se subió al nivel de proxy de API.

    Los recursos pueden estar disponibles a nivel del entorno o de la organización. Para obtener más información, consulta Archivos de recursos.

    Para determinar si el recurso existe en el nivel del entorno, emite la siguiente llamada a la API con curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Para determinar si el recurso existe a nivel de la organización, ejecuta la siguiente llamada a la API con curl y omite los detalles del entorno: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Si recibes un código de estado 404 como respuesta para estas APIs, significa que falta el recurso en el nivel de organización y de entorno.

Resolución

  1. Si determinas que el recurso existe a nivel del proxy de API, la organización o el entorno, bórralo y vuelve a subirlo, como se describe en el paso 2. De lo contrario, sigue con el paso 3.
  2. Para borrar el recurso a nivel del proxy de la API, navegue hasta la pestaña "Resources" del panel de navegación del Editor de proxy de la API y haga clic en el botón "X" junto al recurso, como se muestra a continuación.

    Para borrar un recurso a nivel del entorno o de la organización, usa el verbo DELETE en las llamadas a la API que se usaron anteriormente en los pasos de diagnóstico. Por ejemplo, para borrar el recurso en el nivel de entorno, ingresa el siguiente comando: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Sube el archivo JAR) en el nivel adecuado (proxy de API, organización o nivel de entorno.

  4. Si volver a subir el recurso no ayuda, deberás reiniciar los procesadores de mensajes afectados. Si usas Apigee Edge en Cloud, comunícate con el equipo de asistencia de Apigee. Si eres usuario de la nube privada, consulta Inicia, detén, reinicia y verifica el estado de Apigee Edge.

JavaCalloutInstantiationFailed

Mensaje de error

La implementación del proxy de API a través de la IU de Edge o de la API de Edge Management falla y muestra este mensaje de error:

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>

O

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>

Ejemplo de mensaje de error

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

Captura de pantalla de error de ejemplo

Causa

Estas son las causas comunes de este error

Causa Descripción
Falta el archivo JAR No se sube el archivo JAR que contiene la clase Java identificada en el error.
Archivo JAR dañado El archivo JAR que contiene la clase Java identificada en el error está dañado o se subió parcialmente.
Falta el archivo de clase El archivo de clase Java identificada en el error no forma parte del archivo JAR especificado en >ResourceURL< ni en archivos JAR dependientes.
Problema del código de Java Hay un error en el código, como un constructor faltante, un problema de dependencia de código o algún otro problema.

Paso de diagnóstico común

  1. Identifica el nombre del entorno y la clase que no se pudo importar. Por ejemplo, en el siguiente nombre de entorno, un mensaje de error es test y el nombre de la clase es 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: falta el archivo JAR

Diagnóstico

  1. Determina el archivo JAR que debe contener la clase (identificado en el paso 1 anterior) y en el que no se pudo crear una instancia.
  2. Verifica si el archivo JAR específico se subió a nivel del proxy de la API, de la organización o del entorno. Si el archivo JAR no se sube a ninguno de los niveles, ve a Resolución.
  3. Si se sube el archivo JAR, ve a Causa: archivo JAR dañado.

Resolución

  1. Si el archivo JAR está dañado o se subió parcialmente, vuelve a compilarlo y súbelo al nivel adecuado (nivel de proxy de API, organización o entorno).
  2. Vuelve a implementar el proxy de API.

Causa: archivo JAR dañado

Diagnóstico

  1. Determina el archivo JAR que debe contener la clase (identificado en el paso 1 anterior) en el que no se pudo crear una instancia.
  2. Revisa si el archivo JAR específico está dañado. Por ejemplo, si no puedes desanidar el archivo porque está dañado o se subió parcialmente. Si está dañado, ve a Resolución.
  3. Si el archivo JAR no está dañado, ve a Causa: Falta el archivo de clase.

Resolución

  1. Vuelve a compilar los archivos JAR dañados y sube el archivo JAR en el nivel adecuado (nivel de proxy de API, organización o entorno).
  2. Vuelve a implementar el proxy de API.

Causa: falta el archivo de clase

Diagnóstico

  1. Verifica si el archivo de clase Java específico (identificado en el paso 1 anterior) forma parte del archivo JAR especificado en >ResourceURL< o en cualquiera de los archivos JAR dependientes.
  2. Si el archivo de clase no existe en ninguno de los archivos JAR, determinaste la causa del error. Ve a Resolución.
  3. Si el archivo de clase existe en uno de los archivos JAR especificados en la política JavaReferencia, debe haber un problema con el código Java o la clase dependiente que genere este error. a. Si eres usuario de la nube pública, comunícate con el equipo de asistencia de Apigee. b. Si eres usuario de la nube privada, ve a Causa: problema con el código Java.

Resolución

  1. Vuelve a compilar el JAR con los archivos de clase faltantes y sube el archivo JAR en el nivel adecuado (nivel de proxy de API, organización o entorno).
  2. Vuelve a implementar el proxy de API.

Causa: problema con el código Java

Pasos de diagnóstico solo para usuarios de la nube privada

Diagnóstico

  1. Verifica los registros de Message Processor (/opt/apigee/var/log/edge-message-processor/system.log y /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Es posible que veas una excepción similar al siguiente ejemplo:

    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. Lee atentamente la excepción para comprender el motivo del error. Por lo general, esto puede indicar algún problema en tu código Java.

Resolución

  1. Según la causa de la falla, es posible que debas solucionar el problema en tu código Java.
  2. Vuelve a compilar el JAR con los archivos de clase faltantes y sube el archivo JAR en el nivel adecuado (nivel de proxy de API, organización o entorno).
  3. Vuelve a implementar el proxy de API.

Sube el archivo JAR

Asegúrate de que el elemento de recurso con todas las clases necesarias exista a nivel del proxy de API, del entorno o de la organización. Para obtener más información, consulta Archivos de recursos.

  1. Para subir un recurso a nivel del proxy de API, haz clic en + (signo más) en la pestaña Recursos. Luego, selecciona Importar archivo y suba el archivo desde su máquina local. El nombre del archivo debe coincidir con el elemento >ResourceURL<, pero sin el prefijo java://.

  2. Si quieres que un recurso esté disponible para más de un proxy de API en el mismo entorno, sube el recurso al entorno. Deberás usar la API de Edge, como se describe en Archivos de recursos.

    Por ejemplo, ingresa la siguiente llamada a la API desde la máquina local para subir el archivo especificado a nivel de entorno:

    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"
    

    Emite la llamada a la API desde el mismo directorio que el archivo.

  3. A fin de que el archivo esté disponible para todos los proxies de API dentro de todos los entornos de la organización, puedes omitir los detalles del entorno en la ruta base. Por ejemplo:

    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"