JavaCallout 정책 런타임 오류 문제해결

현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동
정보

ResourceDoesNotExist

오류 메시지

Edge UI 또는 Edge 관리 API를 통한 API 프록시 배포가 다음 오류 메시지와 함께 실패합니다.

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.

오류 스크린샷 예시

원인

JavaCPP 정책<ResourceURL> 요소에 지정된 리소스가 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. 위의 1단계에서 식별된 리소스를 사용하는 JavaCallout 정책을 확인합니다.

    예를 들어 다음 정책은 오류 메시지의 값과 일치하는 <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 프록시에 업로드된 리소스가 없습니다.

    • 리소스는 환경 또는 조직 수준에서 사용할 수 있습니다. 자세한 내용은 리소스 파일을 참조하세요.

      • 리소스가 환경 수준에 있는지 확인하려면 curl을 사용하여 다음 API 호출을 실행합니다. curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

      • 리소스가 조직 수준에 있는지 확인하려면 환경 세부정보를 생략하고 curl을 사용하여 다음 API 호출을 실행합니다. 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 프록시, 환경 또는 조직 수준에 있는지 확인합니다. 자세한 내용은 리소스 파일을 참고하세요.

위에 표시된 Java콜아웃 정책 예를 수정하려면 적절한 수준 (API 프록시, 조직 또는 환경 수준)에서 JAR 파일을 업로드하세요.

NoResourceForURL

오류 메시지

Edge UI 또는 Edge 관리 API를 통한 API 프록시 배포가 다음 오류 메시지와 함께 실패합니다.

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 프록시 수준에서 업로드되었음을 확인할 수 있습니다.

    리소스는 환경 또는 조직 수준에서 사용할 수 있습니다. 자세한 내용은 리소스 파일을 참조하세요.

    리소스가 환경 수준에 있는지 확인하려면 curl을 사용하여 다음 API 호출을 실행합니다. curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

    리소스가 조직 수준에 있는지 확인하려면 환경 세부정보를 생략하고 curl을 사용하여 다음 API 호출을 실행합니다. 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 프록시 편집기의 Navigator 창에 있는 '리소스' 탭으로 이동한 다음 아래 그림과 같이 리소스 옆에 있는 'X' 버튼을 클릭합니다.

    환경 또는 조직 수준에서 리소스를 삭제하려면 이전에 진단 단계에서 사용된 API 호출에서 DELETE 동사를 사용합니다. 예를 들어 환경 수준에서 리소스를 삭제하려면 다음 명령어를 입력합니다. curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"

  3. 적절한 수준 (API 프록시, 조직 또는 환경 수준)에서 JAR 파일을 업로드합니다.

  4. 리소스를 다시 업로드해도 문제가 해결되지 않으면 영향을 받는 메시지 프로세서를 다시 시작해야 합니다. Cloud에서 Apigee Edge를 사용하는 경우 Apigee 지원팀에 문의하세요. 프라이빗 클라우드 사용자인 경우 Apigee Edge 시작, 중지, 다시 시작, 상태 확인을 참조하세요.

JavaCalloutInstantiationFailed

오류 메시지

Edge UI 또는 Edge 관리 API를 통한 API 프록시 배포가 다음 오류 메시지와 함께 실패합니다.

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 파일 누락 오류에서 식별된 Java 클래스가 포함된 JAR 파일은 업로드되지 않습니다.
손상된 JAR 파일 오류에서 식별된 Java 클래스를 포함하는 JAR 파일이 손상되었거나 부분적으로 업로드됩니다.
수업 파일 누락 오류에서 식별된 자바 클래스 파일이 >ResourceURL< 또는 종속 JAR 파일에 지정된 JAR 파일의 일부가 아닙니다.
자바 코드 문제 코드에 생성자 누락, 코드 종속 항목 문제, 기타 문제 등의 오류가 있습니다.

일반 진단 단계

  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. 위 1단계에서 식별된 클래스를 포함해야 하며 인스턴스화할 수 없는 JAR 파일을 확인합니다.
  2. 특정 JAR 파일이 API 프록시, 조직 또는 환경 수준에서 업로드되었는지 확인합니다. JAR 파일이 어느 수준에도 업로드되지 않으면 해결 방법으로 이동합니다.
  3. JAR 파일이 업로드되면 원인: 손상된 JAR 파일로 이동합니다.

해상도

  1. JAR 파일이 손상되거나 부분적으로 업로드된 경우 JAR을 다시 빌드하고 적절한 수준 (API 프록시, 조직 또는 환경 수준)에서 JAR 파일을 업로드합니다.
  2. API 프록시를 재배포합니다.

원인: 손상된 JAR 파일

진단

  1. 위 1단계에서 식별된 클래스를 포함해야 하며 인스턴스화할 수 없는 JAR 파일을 확인합니다.
  2. 특정 JAR 파일이 손상되었는지 확인합니다. 예를 들어 파일이 손상되었거나 부분적으로 업로드되어 압축을 풀 수 없는지 확인합니다. 손상된 경우 해결 방법으로 이동합니다.
  3. JAR 파일이 손상되지 않았다면 원인: 누락된 클래스 파일로 이동합니다.

해상도

  1. 손상된 JAR 파일을 다시 빌드하고 적절한 수준(API 프록시, 조직 또는 환경 수준)에서 JAR 파일을 업로드합니다.
  2. API 프록시를 재배포합니다.

원인: 누락된 클래스 파일

진단

  1. 위 1단계에서 식별된 특정 자바 클래스 파일이 >ResourceURL< 또는 종속 JAR 파일에 지정된 JAR 파일의 일부인지 확인합니다.
  2. 클래스 파일이 JAR 파일에 없으면 오류의 원인을 파악할 수 있습니다. 해결 방법으로 이동합니다.
  3. 클래스 파일이 JavaCall 정책에 지정된 JAR 파일 중 하나에 있는 경우 자바 코드 또는 종속 클래스에 이러한 오류를 일으키는 문제가 있어야 합니다. a. 퍼블릭 Cloud 사용자인 경우 Apigee 지원팀에 문의하세요. b. Private Cloud 사용자인 경우 원인: Java 코드 문제로 이동하세요.

해상도

  1. 누락된 클래스 파일로 JAR을 다시 빌드하고 적절한 수준(API 프록시, 조직 또는 환경 수준)에서 JAR 파일을 업로드합니다.
  2. API 프록시를 재배포합니다.

원인: Java 코드 문제

Private Cloud 사용자만을 위한 진단 단계

진단

  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을 다시 빌드하고 적절한 수준(API 프록시, 조직 또는 환경 수준)에서 JAR 파일을 업로드합니다.
  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"