Java コールアウト エラーの処理方法

Java Callout とは

Java Callout を初めて使用する場合は、Java Callout の作成方法から始めることをおすすめします。

Java コールアウトのエラー処理

Java コールアウトを作成すると、Java コードでカスタムエラー処理を行うことができます。たとえば、カスタムのエラー メッセージとヘッダーを返すことができます。また、エラー情報を含むフロー変数を Edge のプロキシフローに設定することもできます。

基本的なカスタムエラー処理のパターンを示す単純な Java コールアウトの例を見てみましょう。このサンプルは、例外が発生すると、カスタムのエラー メッセージを返します。また、手軽なデバッグの方法として、エラー スタックトレースをフロー変数に格納します。

プロジェクトをダウンロードする

このプロジェクトは、GitHub の Apigee api-platform-samples リポジトリからダウンロードできます。

  1. システムに api-platform-samples をダウンロードするか、クローンを作成します。
  2. ターミナルまたは任意のコードエディタで api-platform-samples/doc-samples/java-error プロジェクトに移動します。

サンプル Java コード

このエラー処理パターンは単純明快です。現在の Edge フロー コンテキストで messageContext.setVariable() メソッドを使用してフロー変数を設定できます。カスタムエラー情報を返すには、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 スクリプトを実行します。このスクリプトにより、必要な JAR 依存関係がローカルの Maven リポジトリにインストールされます。
  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/resources/java ディレクトリにコピーします。これは、プロキシでデプロイする 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 Cloud の場合、ドメインは https://api.enterprise.apigee.com ですが、Edge Private Cloud を使用している場合はドメインが異なる可能性があります。
  3. setenv.sh ファイルを保存します。
  4. deploy スクリプトを実行します。
    ./deploy.sh
  5. デプロイが成功したら、invoke スクリプトを実行します。
    ./invoke.sh

    invoke スクリプトは、次のような cURL コマンドを呼び出します。

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

    この呼び出しには "name" クエリ パラメータが含まれていないため、Java コードは実行時エラーをスローします。プロキシは次のメッセージとヘッダーを返します。

  • エラー メッセージ: Please specify a name parameter!
  • ヘッダー: ExceptionClass: java.lang.RuntimeException