すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:SDK for Java

最終更新日:Sep 17, 2025

Elastic Algorithm Service (EAS) SDK を使用すると、シンプルかつ安定した方法でモデルサービスを呼び出すことができます。このトピックでは、EAS SDK for Java のメソッドについて説明し、文字列の入力と出力、テンソルの入力と出力、キューサービス、リクエストデータの圧縮など、一般的なユースケースのサンプルコードを提供します。

依存関係の追加

プロジェクトに EAS SDK for Java を統合するには、eas-sdk 依存関係を pom.xml ファイルに追加します。SDK の最新バージョンについては、Maven リポジトリにアクセスしてください。サンプルコード:

<dependency>
  <groupId>com.aliyun.openservices.eas</groupId>
  <artifactId>eas-sdk</artifactId>
  <version>2.0.20</version>
</dependency>

バージョン 2.0.5 以降、SDK は、非同期リクエストの優先度を管理するキューサービスをサポートしています。互換性の問題なくキューサービスを使用するには、次の依存関係の必要なバージョンを追加します。

<dependency>
    <groupId>org.java-websocket</groupId>
    <artifactId>Java-WebSocket</artifactId>
    <version>1.5.1</version>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.1</version>
</dependency>

インターフェイス

PredictClient クラス

これはメインのクライアントクラスです。これを使用して、サービス情報を構成し、リクエストを送信し、予測結果を受信できます。

インターフェイス

説明

PredictClient(HttpConfig httpConfig)

  • 説明: PredictClient インスタンスを構築します。

  • パラメーター: httpConfig は、PredictClient インスタンスの構築に使用される HttpConfig インスタンスを指定します。

void setToken(String token)

  • 説明: HTTP リクエストで使用されるトークンを構成します。

  • パラメーター: token は、サービス認証に使用されるトークンを指定します。

void setModelName(String modelName)

  • 説明: オンライン予測に使用されるモデルの名前を構成します。

  • パラメーター: modelName は、モデルの名前を指定します。

void setEndpoint(String endpoint)

  • 説明: サービスのエンドポイントを "host:port" 形式で構成します。

  • パラメーター: endpoint は、リクエストを受信するエンドポイントを指定します。

void setDirectEndpoint(String endpoint)

  • 説明: Virtual Private Cloud (VPC) ダイレクト接続チャネルを介してサービスにアクセスするために使用されるエンドポイントを構成します。エンドポイントの例: pai-eas-vpc.cn-shanghai.aliyuncs.com

  • パラメーター: endpoint は、VPC ダイレクト接続用のサービスのエンドポイントを指定します。

void setRequestPath(String requestPath)

  • 説明: サーバーコードで定義されているリクエストパスを構成します。

  • パラメーター: requestPath は、サーバーリクエストパスを指定します。例: client.setRequestPath("/custom_path")

void setRetryCount(int retryCount)

  • 説明: リクエストが失敗した場合の最大再試行回数を構成します。

  • パラメーター: retryCount は、リクエストが失敗した場合の最大再試行回数を指定します。

void setRetryConditions(EnumSet retryConditions)

  • 説明: リクエストが失敗した場合の再試行条件を構成します。このメソッドは setRetryCount メソッドと一緒に使用できます。デフォルトでは、失敗したすべてのリクエストが再試行されます。このメソッドを使用して、特定のリクエストエラーに対してのみ再試行条件を構成できます。

  • パラメーター: retryConditions は、EnumSet 型の 1 つ以上の再試行条件を指定します。次の再試行条件がサポートされています:

    • RetryCondition.CONNECTION_FAILED: 接続リクエストが失敗しました。

    • RetryCondition.CONNECTION_TIMEOUT: 接続リクエストがタイムアウトしました。

    • RetryCondition.READ_TIMEOUT: リクエストに対する応答がタイムアウトしました。

    • RetryCondition.RESPONSE_5XX: ステータスコード 5xx が返されます。

    • RetryCondition.RESPONSE_4XX: ステータスコード 4xx が返されます。

  • サンプルコード:

    client.setRetryConditions(
        EnumSet.of(
            RetryCondition.READ_TIMEOUT,    // 読み取りタイムアウトが発生した場合に再試行します。
            RetryCondition.RESPONSE_5XX // ステータスコード 5xx が返された場合に再試行します。
        )
    );

    上記のサンプルコードは、リクエストがタイムアウトした場合、またはステータスコード 5xx が返された場合にのみリクエストが再試行されることを示しています。

void setContentType(String contentType)

  • 説明: HTTP クライアントのデータストリームタイプを構成します。デフォルトでは、データストリームタイプは "application/octet-stream" に設定されています。

  • パラメーター: contentType は、送信するデータストリームのタイプを指定します。

void setUrl(String url)

説明: リクエストの URL をカスタマイズします。

void setCompressor(Compressor compressor)

  • 説明: リクエストデータの圧縮メソッドを構成します。

  • パラメーター: compressor は圧縮メソッドを指定します。Compressor.Gzip および Compressor.Zlib 圧縮メソッドがサポートされています。

  • 例: 詳細については、「リクエストデータの圧縮」をご参照ください。

void addExtraHeaders(Map<String, String> extraHeaders)

  • 説明: カスタム HTTP ヘッダーを追加します。

  • パラメーター: Map<String, String> は、Map<String, String> 型の HTTP ヘッダーを指定します。

void createChildClient(String token, String endpoint, String modelName)

  • 説明: 親クライアントのスレッドプールを使用する子クライアントを作成します。このメソッドを呼び出して、マルチスレッド予測を実行します。

  • パラメーター:

    • token: サービス認証に使用されるトークン。

    • endpoint: サービスのエンドポイント。

    • modelName: サービスの名前。

void predict(TFRequest runRequest)

  • 説明: TensorFlow リクエストをサービスに送信します。

  • パラメーター: runRequest は TensorFlow リクエストインスタンスを指定します。

void predict(String requestContent)

  • 説明: リクエストコンテンツを文字列としてフォーマットして、サービスにリクエストを送信します。

  • パラメーター: requestContent は、リクエストコンテンツを含む文字列を指定します。

void predict(byte[] requestContent)

  • 説明: リクエストコンテンツをバイト配列としてフォーマットして、サービスにリクエストを送信します。

  • パラメーター: requestContent は、リクエストコンテンツを含むバイト配列を指定します。

HttpConfig クラス

基盤となる HTTP 接続パラメーター (タイムアウト、スレッド数、接続プールなど) を構成するために使用されます。

インターフェイス

説明

void setIoThreadNum(int ioThreadNum)

  • 説明: HTTP リクエストの送信に使用される I/O スレッドの数を構成します。デフォルトでは、2 つの I/O スレッドが使用されます。

  • パラメーター: ioThreadNum は、HTTP リクエストの送信に使用される I/O スレッドの数を指定します。

void setReadTimeout(int readTimeout)

  • 説明: リクエスト送信後に応答を待機するタイムアウト期間を構成します。デフォルト値: 5000 (5 秒を示します)。

  • パラメーター: readTimeout は、リクエストコンテンツの読み取りのタイムアウト期間を指定します。

void setConnectTimeout(int connectTimeout)

  • 説明: リクエストの接続タイムアウト期間を構成します。デフォルト値: 5000 (5 秒を示します)。

  • パラメーター: connectTimeout は、リクエストの接続タイムアウト期間を指定します。

void setMaxConnectionCount(int maxConnectionCount)

  • 説明: 最大接続数を構成します。デフォルト値: 1000。

  • パラメーター: maxConnectionCount は、PredictClient インスタンスの接続プールで許可される最大接続数を指定します。

void setMaxConnectionPerRoute(int maxConnectionPerRoute)

  • 説明: 各ルートのデフォルトの最大接続数を構成します。デフォルト値: 1000。

  • パラメーター: maxConnectionPerRoute は、各ルートのデフォルトの最大接続数を指定します。

void setKeepAlive(boolean keepAlive)

  • 説明: HTTP 接続の keep-alive メカニズムを有効にするかどうかを指定します。

  • パラメーター: keepAlive は、HTTP 接続の keep-alive メカニズムを有効にするかどうかを指定します。デフォルト値: true

int getErrorCode()

最後の呼び出しのステータスコードを返します。

string getErrorMessage()

最後の呼び出しのエラーメッセージを返します。

TFRequest クラス

TensorFlow モデルの入力データを構築するために使用されます。

インターフェイス

説明

void setSignatureName(String value)

  • 説明: サービスで使用され、SavedModel 形式で保存される TensorFlow モデルの SignatureDef を構成します。

  • パラメーター: value は、TensorFlow モデルの SignatureDef の名前を指定します。

void addFetch(String value)

  • 説明: サービスで使用される TensorFlow モデルの出力テンソルのエイリアスを構成します。

  • パラメーター: value は、出力テンソルのエイリアスを指定します。

void addFeed(String inputName, TFDataType dataType, long[]shape, ?[]content)

  • 説明: サービスで使用される TensorFlow モデルの入力テンソルを構成します。

  • パラメーター:

    • inputName: 入力テンソルのエイリアス。

    • dataType: 入力テンソルのデータの型。

    • shape: 入力テンソルの形状。

    • content: 入力テンソルのコンテンツ。このパラメーターは 1 次元の配列形式で指定します。

      dataType パラメーターを DT_FLOAT、DT_COMPLEX64、DT_BFLOAT16、または DT_HALF に設定した場合、content パラメーターは FLOAT 型要素の 1 次元配列である必要があります。dataType パラメーターを DT_COMPLEX64 に設定した場合、配列内の隣接する 2 つの要素はそれぞれ複素数の実部と虚部を表します。

      dataType パラメーターを DT_DOUBLE または DT_COMPLEX128 に設定した場合、content パラメーターは DOUBLE 型要素の 1 次元配列である必要があります。dataType パラメーターを DT_COMPLEX128 に設定した場合、配列内の隣接する 2 つの要素はそれぞれ複素数の実部と虚部を表します。

      dataType パラメーターを DT_INT32、DT_UINT8、DT_INT16、DT_INT8、DT_QINT8、DT_QUINT8、DT_QINT32、DT_QINT16、DT_QUINT16、または DT_UINT16 に設定した場合、content パラメーターは INT 型要素の 1 次元配列である必要があります。

      dataType パラメーターを DT_INT64 に設定した場合、content パラメーターは LONG 型要素の 1 次元配列である必要があります。

      dataType パラメーターを DT_STRING に設定した場合、content パラメーターは STRING 型要素の 1 次元配列である必要があります。

      dataType パラメーターを DT_BOOL に設定した場合、content パラメーターは BOOLEAN 型要素の 1 次元配列である必要があります。

List<Long> getTensorShape(String outputName)

  • 説明: 出力テンソルのエイリアスを使用して、出力テンソルの形状をクエリします。

  • パラメーター: outputName は、形状をクエリする出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルの形状を表す 1 次元配列。

List<Float> getFloatVals(String outputName)

  • 説明: データの型が DT_FLOAT、DT_COMPLEX64、DT_BFLOAT16、または DT_HALF である出力テンソルの content を抽出します。

  • パラメーター: outputName は、コンテンツを抽出する出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルのコンテンツを指定する 1 次元配列。

List<Double> getDoubleVals(String outputName)

  • 説明: データの型が DT_DOUBLE または DT_COMPLEX128 である出力テンソルの content を抽出します。

  • パラメーター: outputName は、コンテンツを抽出する出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルのコンテンツを指定する 1 次元配列。

List<Integer> getIntVals(String outputName)

  • 説明: データの型が DT_INT32、DT_UINT8、DT_INT16、DT_INT8、DT_QINT8、DT_QUINT8、DT_QINT32、DT_QINT16、DT_QUINT16、または DT_UINT16 である出力テンソルの content を抽出します。

  • パラメーター: outputName は、コンテンツを抽出する出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルのコンテンツを指定する 1 次元配列。

List<String> getStringVals(String outputName)

  • 説明: データの型が DT_STRING である出力テンソルの content を抽出します。

  • パラメーター: outputName は、コンテンツを抽出する出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルのコンテンツを指定する 1 次元配列。

List<Long> getInt64Vals(String outputName)

  • 説明: データの型が DT_INT64 である出力テンソルの content を抽出します。

  • パラメーター: outputName は、コンテンツを抽出する出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルのコンテンツを指定する 1 次元配列。

List<Boolean> getBoolVals(String outputName)

  • 説明: データの型が DT_BOOL である出力テンソルのコンテンツを抽出します。data

  • パラメーター: outputName は、コンテンツを抽出する出力テンソルのエイリアスを指定します。

  • 戻り値: 出力テンソルのコンテンツを指定する 1 次元配列。

QueueClient クラス

EAS キューサービスと対話し、データを生成、消費、管理するために使用されます。

インターフェイス

説明

QueueClient(String endpoint, String queueName, String token, HttpConfig httpConfig, QueueUser user)

  • 説明: QueueClient インスタンスを構築します。

  • パラメーター:

    • endpoint: サービスのエンドポイント。

    • queueName: サービスの名前。

    • token: サービスのトークン。

    • httpConfig: サービスリクエストの構成。

    • user: UserId および GroupName パラメーターを含みます。デフォルトでは、UserId の値は乱数で、GroupName の値は eas です。

JSONObject attributes()

  • 説明: キューサービスの詳細を取得します。

  • 戻り値: キューサービスに関する次の情報を含む JSONObject インスタンス:

    • meta.maxPayloadBytes: キュー内の各データレコードの最大サイズ。

    • meta.name: キューの名前。

    • stream.approxMaxLength: キューに保存できるデータレコードの最大数。

    • stream.firstEntry: キュー内の最初のデータレコードのインデックス。

    • stream.lastEntry: キュー内の最後のデータレコードのインデックス。

    • stream.length: キューに保存されているデータレコードの数。

Pair<Long, String> put(byte[] data, long priority, Map<String, String> tags)

  • 説明: キューサービスにデータを書き込みます。

  • パラメーター:

    • data: Byte[] 型のデータレコード。

    • priority: データレコードの優先度。デフォルト値は 0 で、データレコードの優先度が低いことを指定します。値 1 は高い優先度を指定します。

    • tags: カスタムパラメーター。

  • 戻り値: 2 つの要素の順序付きペア。最初の要素は Long 型で、データレコードのインデックスを示します。2 番目の要素は文字列型で、リクエスト ID を示します。

DataFrame[] get(long index, long length, long timeout, boolean autoDelete, Map<String, String> tags)

  • 説明: キューサービスからデータレコードを取得します。

  • パラメーター:

    • index: 取得の開始インデックス。値 -1 は、最新のデータレコードから取得を開始することを指定します。

    • length: 取得するデータレコードの量。

    • timeout: 取得のタイムアウト期間。単位: 秒。

    • autoDelete: データレコードが取得された後、キューから自動的に削除するかどうかを指定します。

    • tags: カスタムパラメーター。たとえば、このパラメーターをリクエスト ID に設定できます。

  • 戻り値: DataFrame の配列。

void truncate(Long index)

  • 説明: キュー内でインデックスがあるインデックスより小さいデータレコードを削除します。

String delete(Long index)

  • 説明: データレコードのインデックスを指定して、キュー内のデータレコードを削除します。

  • パラメーター: index は、削除するデータレコードのインデックスを指定します。

  • 戻り値: データレコードが削除された場合に OK が返されます。

JSONObject search(long index)

  • 説明: データレコードのキュー情報をクエリします。

  • パラメーター: index は、クエリするデータレコードのインデックスを指定します。

  • 戻り値: JSONObject 型のデータレコードのキュー情報。この情報には次のフィールドが含まれます:

    • ConsumerId: データレコードを処理するインスタンスの ID。

    • IsPending: データレコードが処理中かどうかを示します。

      • True は、データレコードが処理中であることを示します。

      • False は、データレコードがキューにあり、処理を待機していることを示します。

    • WaitCount: データレコードの前のデータレコードの数を示します。このパラメーターは、IsPending が False に設定されている場合にのみ有効です。IsPending が True に設定されている場合、このパラメーターの値は 0 です。

    応答の例:

    • {'ConsumerId': 'eas.****', 'IsPending': False, 'WaitCount':2} が返された場合、データレコードはキューにあり、処理を待機しています。

    • ログに no data in stream と表示され、{} が返された場合、データレコードはキューに見つかりません。これは、データレコードが処理され、結果がクライアントに返されたか、または index パラメーターが正しく構成されていないことが原因である可能性があります。

      重要

      QueueClient を使用して search 操作を呼び出す場合、グループ ID をサービス名に設定する必要があります。そうしないと、search 操作によって返される結果の IsPending の値は false になります。サンプルコード:

      • グループ ID をサービス名に設定する

        QueueUser u = new QueueUser(UUID.randomUUID().toString(), "<service_name>");
        QueueClient input_queue = new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), u);
      • 指定されたインデックスのデータのキュー情報をクエリする

        System.out.println(input_queue.search(index));

WebSocketWatcher watch(long index, long window, boolean indexOnly, boolean autoCommit, Map<String, String> tags)

  • 説明: 出力キューのデータをサブスクライブします。

  • パラメーター:

    • index: データの取得を開始するインデックス。値が -1 の場合、最新のデータのみが取得されます。

    • window: 送信ウィンドウのサイズ。これはコミットされていないデータの最大長です。コミットされていないデータの長さがこのパラメーターの値を超えると、キューサービスは送信を停止します。

    • indexOnly: 帯域幅を節約するために、index および tags パラメーターのみを返すかどうかを指定します。

    • autoCommit: データが送信された後にデータを自動的にコミットして、コミット操作の呼び出しを回避するかどうかを指定します。autoCommittrue に設定した場合、window パラメーターは無効になります。

    • tags: カスタムパラメーター。

  • 戻り値: サブスクライブしたデータを取得するために使用される WebSocketWatcher インスタンス。詳細については、このトピックの「キューサービスの使用」セクションをご参照ください。

String commit(Long index) または String commit(Long[] index)

  • 説明: データが消費されたことを確認し、キュー内のデータを削除します。

  • 戻り値: OK は、操作が成功したことを示します。

void end(boolean force)

説明: キューサービスを停止します。

DataFrame クラス

キューサービス内のデータ項目のカプセル化オブジェクト。

インターフェイス

説明

byte[] getData()

  • 説明: データレコードの値を取得します。

  • 戻り値: Byte[] 型の値。

long getIndex()

  • 説明: データレコードのインデックスを取得します。

  • 戻り値: Long 型のインデックス。

Map<String, String> getTags()

  • 説明: データレコードのタグを取得します。

  • 戻り値: Map<String,String> 型のタグ。リクエスト ID の取得に使用できます。例: df.getTags().get("requestId")

デモ

[文字列の入力と出力の使用]

カスタムプロセッサを使用してモデル (Predictive Model Markup Language (PMML) モデルなど) をデプロイする場合、リクエストコンテンツは多くの場合、文字列としてフォーマットされます。サンプルコード:

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;

public class TestString {
    public static void main(String[] args) throws Exception {
        // クライアントを開始して初期化します。PredictClient インスタンスは複数のリクエストで共有されます。リクエストごとに PredictClient インスタンスを作成しないでください。 
        PredictClient client = new PredictClient(new HttpConfig());
        client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****");
        // VPC ダイレクト接続機能を使用するには、setDirectEndpoint メソッドを呼び出します。
        // 例: client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // PAI コンソールで VPC ダイレクト接続機能を有効にし、vSwitch を構成する必要があります。この機能を有効にすると、ゲートウェイを介さずにサービスを呼び出すことができ、安定性とパフォーマンスが向上します。 
        // 注: ゲートウェイを使用してサービスを呼び出すには、ユーザー ID で始まるエンドポイントを使用します。エンドポイントを取得するには、EAS-Online Model Services ページで呼び出すサービスを見つけ、[サービスタイプ] 列の [呼び出し方法] をクリックします。表示されるダイアログボックスで、エンドポイントを表示できます。VPC ダイレクト接続機能を使用してサービスを呼び出すには、pai-eas-vpc.{region_id}.aliyuncs.com 形式のエンドポイントを使用します。 
        client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
        client.setModelName("scorecard_pmml_example");

        // 入力文字列を定義します。
        String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
        System.out.println(request);

        // EAS は文字列を返します。
        try {
            String response = client.predict(request);
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // クライアントをシャットダウンします。
        client.shutdown();
        return;
    }
}

上記のサンプルコードは、次の手順を実行します:

  1. PredictClient メソッドを呼び出して、サービスのクライアントを作成します。複数のサービスが関与している場合は、複数のクライアントを作成します。

  2. クライアントのトークン、エンドポイント、およびモデル名パラメーターを構成します。

  3. 入力として STRING 型の request 変数を作成し、client.predict メソッドを呼び出して HTTP リクエストを送信します。サービスは response パラメーターを返します。

[TensorFlow の入力と出力の使用]

サービスが TensorFlow モデルを使用する場合、入力は TFRequest 形式を使用し、出力は TFResponse 形式を使用する必要があります。サンプルコード:

import java.util.List;

import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.request.TFDataType;
import com.aliyun.openservices.eas.predict.request.TFRequest;
import com.aliyun.openservices.eas.predict.response.TFResponse;

public class TestTF {
    public static TFRequest buildPredictRequest() {
        TFRequest request = new TFRequest();
        request.setSignatureName("predict_images");
        float[] content = new float[784];
        for (int i = 0; i < content.length; i++) {
            content[i] = (float) 0.0;
        }
        request.addFeed("images", TFDataType.DT_FLOAT, new long[]{1, 784}, content);
        request.addFetch("scores");
        return request;
    }

    public static void main(String[] args) throws Exception {
        PredictClient client = new PredictClient(new HttpConfig());

        // VPC ダイレクト接続機能を使用するには、setDirectEndpoint メソッドを呼び出します。 
        // 例: client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.aliyuncs.com");
        // PAI コンソールで VPC ダイレクト接続機能を有効にし、vSwitch を構成する必要があります。この機能を有効にすると、ゲートウェイを介さずにサービスを呼び出すことができ、安定性とパフォーマンスが向上します。 
        // 注: ゲートウェイを使用してサービスを呼び出すには、ユーザー ID で始まるエンドポイントを使用します。エンドポイントを取得するには、EAS-Online Model Services ページで呼び出すサービスを見つけ、[サービスタイプ] 列の [呼び出し方法] をクリックします。表示されるダイアログボックスで、エンドポイントを表示できます。VPC ダイレクト接続機能を使用してサービスを呼び出すには、pai-eas-vpc.{region_id}.aliyuncs.com 形式のエンドポイントを使用します。 
        client.setEndpoint("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com");
        client.setModelName("mnist_saved_model_example");
        client.setToken("YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****");
        long startTime = System.currentTimeMillis();
        int count = 1000;
        for (int i = 0; i < count; i++) {
            try {
                TFResponse response = client.predict(buildPredictRequest());
                List<Float> result = response.getFloatVals("scores");
                System.out.print("Predict Result: [");
                for (int j = 0; j < result.size(); j++) {
                    System.out.print(result.get(j).floatValue());
                    if (j != result.size() - 1) {
                        System.out.print(", ");
                    }
                }
                System.out.print("]\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        long endTime = System.currentTimeMillis();
        System.out.println("Spend Time: " + (endTime - startTime) + "ms");
        client.shutdown();
    }
}

上記のサンプルコードは、次の手順を実行します:

  1. PredictClient メソッドを呼び出して、サービスのクライアントを作成します。複数のサービスが関与している場合は、複数のクライアントを作成します。

  2. クライアントのトークン、エンドポイント、およびモデル名パラメーターを構成します。

  3. TFRequest クラスを使用して入力をカプセル化し、TFResponse クラスを使用して出力をカプセル化します。

キューサービスの使用

QueueClient クラスを使用して、キューサービスを実装します。サンプルコード:

import com.alibaba.fastjson.JSONObject;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
import com.aliyun.openservices.eas.predict.http.QueueClient;
import com.aliyun.openservices.eas.predict.queue_client.QueueUser;
import com.aliyun.openservices.eas.predict.queue_client.WebSocketWatcher;

public class DemoWatch {
    public static void main(String[] args) throws Exception {
        /** キューサービスのクライアントを作成します。 */
        String queueEndpoint = "18*******.cn-hangzhou.pai-eas.aliyuncs.com";
        String inputQueueName = "test_queue_service";
        String sinkQueueName = "test_queue_service/sink";
        String queueToken = "test-token";

        /** 入力キューを作成します。入力キューにデータを追加すると、推論サービスは入力キューからリクエストデータを自動的に読み取ります。 */
        QueueClient inputQueue =
            new QueueClient(queueEndpoint, inputQueueName, queueToken, new HttpConfig(), new QueueUser());
        /** 出力キューを作成します。推論サービスが入力データを処理した後、結果が出力キューに書き込まれます。 */
        QueueClient sinkQueue =
            new QueueClient(queueEndpoint, sinkQueueName, queueToken, new HttpConfig(), new QueueUser());
        /** キュー内のデータをクリアします。注意して使用してください。 */
        inputQueue.clear();
        sinkQueue.clear();

        /** 入力キューにデータを追加します。 */
        int count = 10;
        for (int i = 0; i < count; ++i) {
            String data = Integer.toString(i);
            inputQueue.put(data.getBytes(), null);
            /** キューサービスは、複数優先度のキューをサポートしています。put メソッドを呼び出して、データの優先度を設定できます。デフォルトの優先度は 0 です。 */
            //  inputQueue.put(data.getBytes(), 0L, null);
        }

        /** watch メソッドを呼び出して、出力キューのデータをサブスクライブします。ウィンドウサイズは 5 です。 */
        WebSocketWatcher watcher = sinkQueue.watch(0L, 5L, false, true, null);
        /** WatchConfig パラメーターを構成して、再試行回数、再試行間隔 (秒単位)、および無期限に再試行するかどうかを指定できます。WatchConfig パラメーターを構成しない場合、デフォルトの再試行回数は 3、デフォルトの再試行間隔は 5 です。 */
        //  WebSocketWatcher watcher = sink_queue.watch(0L, 5L, false, true, null, new WatchConfig(3, 1));
        //  WebSocketWatcher watcher = sink_queue.watch(0L, 5L, false, true, null, new WatchConfig(true, 10));

        /** 出力データを取得します。 */
        for (int i = 0; i < count; ++i) {
            try {
                /** getDataFrame メソッドを呼び出して、DataFrame 型のデータを取得します。データが利用できない場合、メソッドはデータが利用可能になるまでブロックします。 */
                byte[] data = watcher.getDataFrame().getData();
                System.out.println("[watch] data = " + new String(data));
            } catch (RuntimeException ex) {
                System.out.println("[watch] error = " + ex.getMessage());
                break;
            }
        }
        /** ウォッチャーを閉じます。各クライアントは 1 つのウォッチャーしか持つことができません。ウォッチャーを閉じないと、キューサービスの別のクライアントを作成するときにエラーが報告されます。 */
        watcher.close();

        Thread.sleep(2000);
        JSONObject attrs = sinkQueue.attributes();
        System.out.println(attrs.toString());

        /** クライアントをシャットダウンします。 */
        inputQueue.shutdown();
        sinkQueue.shutdown();
    }
}

上記のサンプルコードは、次の手順を実行します:

  1. QueueClient メソッドを呼び出して、キューサービスのクライアントを作成します。推論サービスに必要な入力キューと出力キューを作成してください。

  2. put() メソッドを呼び出して入力キューにデータを送信し、watch() メソッドを呼び出して出力キューのデータをサブスクライブします。

    説明

    デモンストレーションの便宜上、この例では同じスレッドでデータを送信し、データをサブスクライブします。実際の実装では、異なるスレッドでデータを送信し、データをサブスクライブできます。

リクエストデータの圧縮

リクエストデータのサイズが大きい場合、EAS SDK を使用すると、データをサーバーに送信する前に Zlib または Gzip 形式で圧縮できます。データ圧縮機能を使用するには、サービスをデプロイするときに rpc.decompressor パラメーターを構成します。

サービスデプロイのサンプル構成:

"metadata": {
  "rpc": {
    "decompressor": "zlib"
  }
}

圧縮データを送信するためのサンプルコード:

package com.aliyun.openservices.eas.predict;
import com.aliyun.openservices.eas.predict.http.Compressor;
import com.aliyun.openservices.eas.predict.http.PredictClient;
import com.aliyun.openservices.eas.predict.http.HttpConfig;
public class TestString {
    public static void main(String[] args) throws Exception{
    	  // クライアントを開始して初期化します。 
        PredictClient client = new PredictClient(new HttpConfig());
        client.setEndpoint("18*******.cn-hangzhou.pai-eas.aliyuncs.com");
        client.setModelName("echo_compress");
        client.setToken("YzZjZjQwN2E4NGRkMDMxNDk5NzhhZDcwZDBjOTZjOGYwZDYxZGM2****");
        // コンプレッサーを Compressor.Gzip に設定することもできます。 
        client.setCompressor(Compressor.Zlib);  
        // 入力文字列を定義します。 
        String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]";
        System.out.println(request);
        // EAS は文字列を返します。 
        String response = client.predict(request);
        System.out.println(response);
        // クライアントをシャットダウンします。 
        client.shutdown();
        return;
    }
}

参照