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

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

РесурсDoesNotExist

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

Развертывание прокси-сервера 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, чтобы просмотреть все ресурсы, загруженные на уровне прокси 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, уровень организации или среды).

Норесаурцефорурл

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

Развертывание прокси-сервера 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, перейдите на вкладку «Ресурсы» на панели «Навигатор» редактора прокси-сервера 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

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

Причина

Вот типичные причины этой ошибки

Причина Описание
Отсутствует файл 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 и загрузите файл JAR на соответствующем уровне (прокси-сервер API, уровень организации или среды).
  2. Повторно разверните прокси-сервер API.

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

Диагностика

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

Разрешение

  1. Восстановите поврежденные файлы JAR и загрузите файл 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. Проверьте журналы процессора сообщений ( /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, нажмите + (знак плюса) на вкладке Ресурсы, затем выберите Импортировать файл и загрузить файл с локального компьютера. Имя файла должно соответствовать элементу >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"