자바 콜아웃 오류 처리 방법

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

자바 콜아웃이란 무엇인가요?

자바 콜아웃을 처음 사용하는 경우 먼저 자바 콜아웃을 만드는 방법부터 살펴보는 것이 좋습니다.

자바 콜아웃의 오류 처리

자바 콜아웃을 작성할 때 Java 코드에서 커스텀 오류 처리를 수행할 수 있습니다. 예를 들어 Edge의 프록시 흐름에서 커스텀 오류 메시지 및 헤더를 반환하거나 오류 정보를 사용하여 흐름 변수를 설정할 수 있습니다.

기본적인 커스텀 오류 처리 패턴을 보여주는 간단한 자바 콜아웃 예시를 살펴보겠습니다. 샘플은 예외 발생 시 커스텀 오류 메시지를 반환합니다. 또한 오류 스택 추적을 흐름 변수에 배치합니다. 이는 편리한 디버깅 기법일 수 있습니다.

프로젝트 다운로드

간단하게 하기 위해 GitHub의 Apigee api-platform-samples 저장소에서 이 프로젝트를 다운로드할 수 있습니다.

  1. api-platform-samples를 시스템에 다운로드하거나 복제합니다.
  2. 원하는 터미널 또는 코드 편집기에서 api-platform-samples/doc-samples/java-error 프로젝트로 이동합니다.

샘플 자바 코드

오류 처리 패턴은 간단합니다. messageContext.setVariable() 메서드를 사용하여 현재 Edge 흐름 컨텍스트에서 흐름 변수를 설정할 수 있습니다. 커스텀 오류 정보를 반환하려면 ExecutionResult 인스턴스를 생성하고 해당 인스턴스에 메서드를 호출하여 오류 응답 및 헤더를 설정합니다.

package com.apigeesample;

import com.apigee.flow.execution.ExecutionContext;
import com.apigee.flow.execution.ExecutionResult;
import com.apigee.flow.execution.spi.Execution;
import com.apigee.flow.message.MessageContext;
import com.apigee.flow.execution.Action;

import org.apache.commons.lang.exception.ExceptionUtils;


public class JavaError implements Execution {
    public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) {
                
        try {

                String name = messageContext.getMessage().getHeader("username");

                if (name != null && name.length()>0) {
                        messageContext.getMessage().setContent("Hello, " + name + "!");
                        messageContext.getMessage().removeHeader("username");

                } else {
                        throw new RuntimeException("Please specify a name parameter!");
                }
            
                return ExecutionResult.SUCCESS;

        } catch (RuntimeException ex) {

            ExecutionResult executionResult = new ExecutionResult(false, Action.ABORT);
            
            //--Returns custom error message and header
            executionResult.setErrorResponse(ex.getMessage());
            executionResult.addErrorResponseHeader("ExceptionClass", ex.getClass().getName());
            
            //--Set flow variables -- may be useful for debugging. 
            messageContext.setVariable("JAVA_ERROR", ex.getMessage());
            messageContext.setVariable("JAVA_STACKTRACE", ExceptionUtils.getStackTrace(ex));
            return executionResult;
        }
    }
}


Maven으로 코드 컴파일

Maven로 컴파일할 수 있도록 프로젝트가 설정되었습니다. javac를 사용하려는 경우 예시도 포함합니다.

  1. Maven이 설치되어 있는지 확인합니다.
    mvn -version
    
  2. java-error/buildsetup.sh 스크립트를 실행합니다. 이 스크립트는 로컬 Maven 저장소에 필요한 JAR 종속 항목을 설치합니다.
  3. cd 명령어로 java-error/callout 디렉터리로 이동합니다.
  4. Maven을 실행합니다.
    mvn clean package
    
  5. 원하는 경우 JAR 파일 edge-custom-policy-java-error.jarjava-error/apiproxy/resources/java에 복사되었는지 확인합니다. 프록시로 배포하려는 JAR 파일에 필요한 위치입니다.

javac로 컴파일

javac을 사용하여 코드를 컴파일하려면 java-error 디렉터리에서 다음과 유사한 작업을 수행할 수 있습니다. 필수 JAR 파일은 java-error/lib 디렉터리에 제공됩니다.

  1. cd 명령어로 api-platform-samples/doc-samples/java-error로 이동합니다.
  2. 경로에 javac가 있는지 확인합니다.

    javac -version
    
  3. 다음 javac 명령어를 실행합니다.

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/JavaProperties.java
    
  4. JAR 파일을 apiproxy/리소스/자바 디렉터리에 복사합니다. 프록시로 배포하려는 JAR 파일에 필요한 위치입니다.

    cp com/apigeesample/JavaProperties.class apiproxy/resources/java
    

프록시 배포 및 호출

배포 스크립트는 ./java-error 디렉터리에서 제공됩니다. 하지만 실행하기 전에 빠른 설정을 수행해야 합니다.

  1. cd 명령어로 api-platform-samples/doc-samples/java-error로 이동합니다.
  2. 아직 수정하지 않았다면 ../../setup/setenv.sh 파일을 열고 Apigee 계정 정보(사용자 이름(계정과 연결된 이메일 주소), 조직 이름, API 관리 호출에 사용하는 도메인)가 표시된 대로 수정합니다. 예를 들어 Edge 클라우드의 경우 도메인은 https://api.enterprise.apigee.com이지만 Edge Private Cloud를 사용하는 경우 도메인이 다를 수 있습니다.
  3. setenv.sh 파일을 저장합니다.
  4. 배포 스크립트를 실행합니다.
    ./deploy.sh
    
  5. 배포에 성공하면 호출 스크립트를 실행합니다.
    ./invoke.sh
    

    호출 스크립트는 다음과 같은 cURL 명령어를 호출합니다.

    curl  http://$org-$env.$api_domain/java-error
    

    호출에 '이름' 쿼리 매개변수가 포함되어 있지 않으므로 자바 코드에서 런타임 오류가 발생합니다. 프록시는 이 메시지와 헤더를 반환합니다.

  • 오류 메시지: Please specify a name parameter!
  • 헤더: ExceptionClass: java.lang.RuntimeException