Устранение неполадок с ошибками выполнения политики JavaCallout

Вы просматриваете документацию по Apigee Edge.
Перейдите к документации по Apigee X.
Информация

ResourceDoesNotExist

Сообщение об ошибке

Развертывание прокси-сервера API через интерфейс Edge или API управления Edge завершается неудачно с сообщением об ошибке:

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

Пример сообщения об ошибке

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

Пример скриншота с ошибкой

Причина

Если ресурс, указанный в элементе <ResourceURL> в правиле JavaCallout, не существует на уровне прокси-сервера API, среды или организации, развертывание прокси-сервера API завершится неудачно.

диагностика;

  1. Укажите среду и название ресурса. Эта информация есть в сообщении об ошибке. Например, в приведенной ниже ошибке среда – test, а название ресурса, используемое в элементе <ResourceURL>, – myresource.jar.

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. Определите правило JavaCallout, которое использует ресурс, указанный на шаге 1.

    Например, в следующем правиле значение параметра <ResourceURL> указано как myresource.jar, что соответствует значению в сообщении об ошибке:

    <?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. Определите, является ли ресурс частью прокси-сервера API, который не работает, или был загружен на уровне среды или организации. Если нет, то это и есть причина ошибки.

    • Чтобы посмотреть все ресурсы, загруженные на уровне прокси-сервера API, перейдите на вкладку Resources (Ресурсы) на панели навигации редактора прокси-сервера API. В этом примере в прокси-сервер API не загружены ресурсы.

    • Ресурсы могут быть доступны на уровне среды или организации. Подробнее о файлах ресурсов…

      • Чтобы определить, существует ли ресурс на уровне среды, выполните следующий вызов API с помощью curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • Чтобы определить, существует ли ресурс на уровне организации, выполните следующий вызов API с помощью curl, опустив сведения о среде: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

      Если в ответ на запрос к этим API вы получаете код статуса 404, значит ресурс отсутствует как на уровне организации, так и на уровне среды.

    Если ресурс недоступен на уровне прокси-сервера API, организации и среды, возвращается ошибка развертывания:

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

Разрешение

Убедитесь, что ресурс, указанный в элементе <ResourceURL>, существует на уровне прокси-сервера API, среды или организации. Подробнее о файлах ресурсов…

Чтобы исправить приведенный выше пример правила JavaCallout, загрузите JAR-файл на подходящем уровне (прокси-сервер API, организации или среды).

NoResourceForURL

Сообщение об ошибке

Развертывание прокси-сервера API через интерфейс Edge или API управления Edge завершается неудачно с сообщением об ошибке:

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>

Пример сообщения об ошибке

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

Пример скриншота с ошибкой

Причина

Эта ошибка может возникнуть, если файл ресурса поврежден или загружен не полностью, даже если он отображается на уровне прокси-сервера API, среды или организации.

диагностика;

  1. Укажите среду и название ресурса. Эта информация есть в сообщении об ошибке. Например, в приведенной ниже ошибке название среды – test, а название ресурса, используемое в элементе <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. Убедитесь, что ресурс загружен на уровне прокси-сервера API, среды или организации. В примере ниже показано, что ресурс myresource.jar загружен на уровне прокси-сервера API.

    Ресурсы могут быть доступны на уровне среды или организации. Подробнее о файлах ресурсов…

    Чтобы определить, существует ли ресурс на уровне среды, выполните следующий вызов API с помощью curl: curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    Чтобы определить, существует ли ресурс на уровне организации, выполните следующий вызов API с помощью curl, опустив сведения о среде: curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"

    Если в ответ на запрос к этим API вы получаете код статуса 404, значит ресурс отсутствует как на уровне организации, так и на уровне среды.

Разрешение

  1. Если вы определили, что ресурс существует на уровне прокси-сервера API, организации или среды, удалите ресурс и повторно загрузите его, как описано на шаге 2. В противном случае перейдите к шагу 3.
  2. Чтобы удалить ресурс на уровне прокси-сервера API, перейдите на вкладку Resources (Ресурсы) в панели Navigator (Навигатор) редактора прокси-сервера API и нажмите кнопку X рядом с ресурсом, как показано ниже.

    Чтобы удалить ресурс на уровне среды или организации, используйте глагол DELETE в вызовах API, которые использовались ранее на этапах диагностики. Например, чтобы удалить ресурс на уровне среды, введите следующую команду: curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. Загрузите JAR-файл на подходящем уровне (прокси-сервер API, организации или среды).

  4. Если повторная загрузка ресурса не помогает, необходимо перезапустить затронутые процессоры сообщений. Если вы используете Apigee Edge в облаке, обратитесь в службу поддержки Apigee. Если вы используете частное облако, ознакомьтесь со статьей Как запустить, остановить, перезапустить и проверить статус Apigee Edge.

JavaCalloutInstantiationFailed

Сообщение об ошибке

Развертывание прокси-сервера API через интерфейс Edge или API управления Edge завершается неудачно с сообщением об ошибке:

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>

Или

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>

Пример сообщения об ошибке

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

Пример скриншота с ошибкой

Причина

Ниже перечислены распространенные причины, по которым возникает эта ошибка.

Cause Описание
Отсутствует JAR-файл Не загружен JAR-файл, содержащий класс Java, указанный в ошибке.
Поврежденный JAR-файл JAR-файл, содержащий класс Java, указанный в ошибке, поврежден или загружен не полностью.
Отсутствует файл класса Файл класса Java, указанный в сообщении об ошибке, не входит в JAR-файл, заданный в элементе >ResourceURL<, или в зависимые JAR-файлы.
Проблема с кодом Java В коде есть ошибка, например отсутствует конструктор, есть проблема с зависимостью кода или другая проблема.

Общий этап диагностики

  1. Определите название среды и класс, который не удалось импортировать. Например, в следующем сообщении об ошибке название среды – test, а название класса – my.class:

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

    Причина: отсутствует JAR-файл

диагностика;

  1. Определите JAR-файл, который должен содержать класс (указанный на шаге 1) и который не удалось создать.
  2. Проверьте, загружен ли определенный JAR-файл на уровне прокси-сервера API, организации или среды. Если JAR-файл не загружен ни на один из уровней, перейдите к разделу "Решение".
  3. Если файл JAR загружен, перейдите к разделу Причина: поврежденный файл JAR.

Разрешение

  1. Если JAR-файл поврежден или загружен не полностью, пересоберите его и загрузите JAR-файл на нужном уровне (прокси-сервер API, организации или среды).
  2. Повторно разверните прокси-сервер API.

Причина: поврежденный JAR-файл

диагностика;

  1. Определите JAR-файл, который должен содержать класс (определенный на шаге 1), который не удалось создать.
  2. Проверьте, не поврежден ли определенный JAR-файл. Например, если вы не можете распаковать файл JAR, потому что он поврежден или загружен не полностью. Если он поврежден, перейдите к разделу "Решение".
  3. Если файл JAR не поврежден, перейдите к разделу Причина: отсутствует файл класса.

Разрешение

  1. Восстановите поврежденные JAR-файлы и загрузите их на нужном уровне (прокси-сервер API, организации или среды).
  2. Повторно разверните прокси-сервер API.

Причина: отсутствует файл класса

диагностика;

  1. Проверьте, входит ли определенный файл класса Java (указанный на шаге 1 выше) в JAR-файл, заданный в >ResourceURL<, или в любой из зависимых JAR-файлов.
  2. Если файла класса нет ни в одном из JAR-файлов, вы определили причину ошибки. Перейдите к разделу "Разрешение".
  3. Если файл класса существует в одном из JAR-файлов, указанных в правиле JavaCallout, то проблема связана с кодом Java или зависимым классом. а. Если вы используете общедоступное облако, обратитесь в службу поддержки Apigee. б. Если вы используете частное облако, перейдите к разделу Причина: проблема с кодом Java.

Разрешение

  1. Пересоберите JAR-файл с отсутствующими файлами классов и загрузите JAR-файл на нужном уровне (прокси-сервер API, организации или среды).
  2. Повторно разверните прокси API.

Причина: проблема с кодом Java

Диагностические шаги только для пользователей частного облака

диагностика;

  1. Проверьте журналы Message Processor (/opt/apigee/var/log/edge-message-processor/system.log и /opt/apigee/var/log/edge-message-processor/configurations.log).
  2. Вы можете увидеть исключение, похожее на приведенное ниже.

    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. Внимательно прочитайте исключение, чтобы понять причину ошибки. Обычно это указывает на проблему в коде Java.

Разрешение

  1. В зависимости от причины сбоя вам может потребоваться исправить проблему в коде Java.
  2. Пересоберите JAR-файл с отсутствующими файлами классов и загрузите JAR-файл на нужном уровне (прокси-сервер API, организации или среды).
  3. Повторно разверните прокси API.

Как загрузить JAR-файл

Убедитесь, что элемент ресурса со всеми необходимыми классами существует на уровне прокси API, среды или организации. Подробнее о файлах ресурсов…

  1. Чтобы загрузить ресурс на уровне прокси API, нажмите + (знак плюса) на вкладке Resources (Ресурсы), выберите Import file (Импортировать файл) и загрузите файл с локального компьютера. Название файла должно совпадать с элементом >ResourceURL<, но без префикса java://.

  2. Если вы хотите, чтобы ресурс был доступен для нескольких прокси-серверов API в одной среде, загрузите его в эту среду. Вам нужно будет использовать Edge API, как описано в разделе Файлы ресурсов.

    Например, чтобы загрузить указанный файл на уровне среды, введите следующий вызов API на локальном компьютере:

    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"
    

    Выполните вызов API из того же каталога, что и файл.

  3. Чтобы файл был доступен для всех прокси API во всех средах организации, можно не указывать сведения о среде в базовом пути. Пример:

    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"