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

Apigee Edge 문서입니다.
Apigee X 문서로 이동
info

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.

오류 스크린샷 예시

원인

JavaCallout 정책의 <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 프록시, 환경 또는 조직 수준에 있는지 확인합니다. 자세한 내용은 리소스 파일을 참고하세요.

위의 JavaCallout 정책 예시를 수정하려면 적절한 수준 (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 프록시 편집기의 탐색기 창에서 리소스 탭으로 이동하여 아래와 같이 리소스 옆에 있는 '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. 리소스를 다시 업로드해도 문제가 해결되지 않으면 영향을 받는 메시지 프로세서를 다시 시작해야 합니다. 클라우드에서 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 파일 누락 오류에서 식별된 자바 클래스를 포함하는 JAR 파일이 업로드되지 않았습니다.
손상된 JAR 파일 오류에서 식별된 자바 클래스를 포함하는 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. 클래스 파일이 JavaCallout 정책에 지정된 JAR 파일 중 하나에 있는 경우 이 오류를 유발하는 Java 코드 또는 종속 클래스에 문제가 있는 것입니다. a. 퍼블릭 클라우드 사용자인 경우 Apigee 지원팀에 문의하세요. b. 프라이빗 클라우드 사용자인 경우 원인: Java 코드 문제로 이동하세요.

해상도

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