ベースクライアント

基本クライアントインスタンスと HTTP スタック

ベースクライアントは 、 OkHttp Stack を使用して HERE platform データサービスと通信します。 OkHttp は、軽量で効率的な HTTP クライアントです。 すべてのユースケースの 99% で 、アプリケーションのランタイム全体にBaseClientのインスタンスを 1 つ使用するのが適しています。 これは 、キャッシュ 、接続プールなどの 1 つのセットを使用して、 OkHttp スタックのインスタンスが 1 つ実行されていることを意味します ただし、 BaseClient 1 つのアプリケーションで複数のインスタンスを必要とする可能性のあるアプリケーションをサポートしています ( 例 Flink タスクスロット)。 これは、 OkHttp の複数のインスタンスが実行されていることを意味します。 リソースを大量に消費するため、慎重に使用してください。 複数のインスタンスを使用する場合 は、この記事を参照して影響を確認してください。

以下の点に注意してください。

  • BaseClientインスタンスのshutdown()関数を呼び出した後は、 JVM のランタイム中にそのインスタンスを使用したり、再アクティブ化したりすることはできなくなります。
  • デフォルト shutdown() では、 JVM のシャットダウン時に関数が自動的に呼び出されます。 この動作が望ましくない場合 com.here.platform.data.client.http.auto-shutdownfalse は、をに設定して無効にできます。

設定

データ クライアント ベース ライブラリは、 HERE platform データ API と通信するときに、 3 つのレベルの抽象化を行います。

  1. ベースクライアント
  2. 特定の API
  3. 特定のエンドポイント

Base Clientは、サポートされているすべての API のベースです。 すべての API に適用される概念を紹介 します。現在は一般的な設定です。

特定の APIは、その API のすべてのエンドポイントをカプセル化します。 現在 の API ごとの設定で、その API のすべてのエンドポイントに適用される概念について説明します。

特定のエンドポイントによって、使用可能で必須または任意のすべてのパラメータが決定されます。 データ型を定義し、リクエストのエンコードとレスポンスのデコードを暗黙的に行います。 要求 ごとの設定をサポートwithHeaderParam() し、関数を使用して任意の HTTP ヘッダーパラメータを設定します。

各エンドポイントコールの結果は、そのエンドポイントに定義されている結果タイプの将来のものになります。 エンドポイントの呼び出し後 、更新されたメトリクスを取得できます。

Base Client を作成してシャットダウンするだけの、非常にシンプルなアプリケーションです。 保留されているリソースは、アイドル状態のままになると自動的に解放されます。したがって、クライアントを明示的にシャットダウンする必要はありません。最後の行は省略できます。 ただし、クライアントをただちにシャットダウンする必要がある shutdown() 場合は、この目的に適した方法です。

Scala
Java
import com.here.platform.data.client.base.generated.scaladsl.model.config.CatalogsResultBase
import com.here.platform.data.client.base.scaladsl.BaseClient
import com.here.platform.data.client.base.http.settings.{
  ApiConfiguration,
  RetryPolicy,
  RetryStrategyType
}

import java.util.concurrent.{ExecutorService, ForkJoinPool}
import scala.concurrent.{Await, ExecutionContext}
object WorkingWithBaseClientMain {

  import ExecutionContext.Implicits.global

  def main(args: Array[String]): Unit = {

    val client = BaseClient()

    // val whateverApi = client.of[WhateverApi]
    // do something with whateverApi

    // Note: if you use a real api call it usually returns a Future thus the
    //       client.shutdown() needs to be in the final .andThen() block
    client.shutdown()
  }
}
import com.here.platform.data.client.base.javadsl.BaseClient;
import com.here.platform.data.client.base.javadsl.BaseClientJava;

public class JavaWorkingWithBaseClientMain {
  public static void main(String[] args) {
    BaseClient baseClient = BaseClientJava.instance();

    // WhateverApi whateverApi = new WhateverApi(baseClient);
    // do something with whateverApi

  }
}

このアプリケーションは、エンドポイントレベルで再試行ロジックを定義するカタログのリストを取得します。 一般的な設定または特定の設定の定義の詳細を参照してください。 最後に、そのエンドポイントのメトリックを取得します。

Scala
Java
import com.here.platform.data.client.base.generated.scaladsl.model.config.CatalogsResultBase
import com.here.platform.data.client.base.scaladsl.BaseClient
import com.here.platform.data.client.base.http.settings.{
  ApiConfiguration,
  RetryPolicy,
  RetryStrategyType
}

import java.util.concurrent.{ExecutorService, ForkJoinPool}
import scala.concurrent.{Await, ExecutionContext}
import com.here.platform.data.client.base.generated.codecs.JsonSupport._
import com.here.platform.data.client.base.generated.scaladsl.api.config.ConfigApi
import com.here.platform.data.client.base.common.metrics.scaladsl.BaseClientMetricsScala
import scala.concurrent.duration._
import scala.util.{Failure, Success}

object WorkingWithBaseClientMain2 {

  import ExecutionContext.Implicits.global

  def main(args: Array[String]): Unit = {

    val client = BaseClient()
    val configApi = client.of[ConfigApi]
    val retryPolicy =
      RetryPolicy(100.millis, 10.seconds, 60.seconds, Set(408), RetryStrategyType.EXPONENTIAL, 10)

    val result = configApi
      .getCatalogs(
        verbose = Some(false),
        organisationType = Nil,
        layerType = Nil,
        region = Nil,
        resourceType = None,
        coverage = Nil,
        access = Nil,
        marketplaceReady = None,
        sortBy = None,
        sortOrder = None
      )
      .withConfig(ApiConfiguration(retryPolicy))
      .executeToEntity()

    result
      .andThen {
        case Success(response) => println(s"response: $response")
        case Failure(ex) => ex.printStackTrace()
      }
      .andThen {
        case _ =>
          /// [metrics]
          BaseClientMetricsScala()
            .getMetricsFor("ConfigApi.getCatalogs")
            .flatMap(_.counter)
            .foreach(c => println(c.count))
        /// [metrics]
      }

    Await.result(result, Duration.Inf)
  }
}
import com.here.platform.data.client.base.common.metrics.javadsl.BaseClientMetricsJava;
import com.here.platform.data.client.base.common.metrics.javadsl.MetricsJava;
import com.here.platform.data.client.base.generated.javadsl.api.config.ConfigApi;
import com.here.platform.data.client.base.generated.scaladsl.model.config.CatalogsListResult;
import com.here.platform.data.client.base.http.settings.ApiConfiguration;
import com.here.platform.data.client.base.http.settings.RetryPolicy;
import com.here.platform.data.client.base.http.settings.RetryStrategyType;
import com.here.platform.data.client.base.javadsl.BaseClient;
import com.here.platform.data.client.base.javadsl.BaseClientJava;
import java.time.Duration;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Optional;

public class JavaWorkingWithBaseClientMain2 {
  public static void main(String[] args) {
    BaseClient baseClient = BaseClientJava.instance();
    ConfigApi configApi = new ConfigApi(baseClient);
    ApiConfiguration config =
        new ApiConfiguration.Builder()
            .withRetryPolicy(
                new RetryPolicy.Builder()
                    .withRetryStrategy(RetryStrategyType.EXPONENTIAL)
                    .withInitTimeout(Duration.ofMillis(100))
                    .withMaxAttempts(10)
                    .withRetriableHttpErrors(new HashSet(Arrays.asList(408)))
                    .withRequestTimeout(Duration.ofSeconds(10))
                    .withOverallTimeout(Duration.ofSeconds(60))
                    .build())
            .build();

    ConfigApi.GetCatalogsAdapter request =
        configApi.getCatalogs().withVerbose(Optional.of(true)).build().withConfig(config);
    CatalogsListResult listResult =
        (CatalogsListResult) request.executeToEntity().toCompletableFuture().join();

    System.out.println(listResult);

    /// [metrics]
    new BaseClientMetricsJava.builder()
        .getInstance()
        .getMetricsFor("ConfigApi.getCatalogs")
        .flatMap(MetricsJava::getCounter)
        .ifPresent(c -> System.out.println(c.count()));
    /// [metrics]

  }
}

ブロックリクエストの場合 :

Scala
Java
object WorkingWithBaseClientMainBlocking {

  import ExecutionContext.Implicits.global

  def main(args: Array[String]): Unit = {

    val client = BaseClient()()
    val configApi = client.of[ConfigApi]

    val result: CatalogsResultBase = configApi
      .getCatalogs(verbose = Some(false))
      .toEntity()

    println(s"response: $result")
  }
}
public class JavaWorkingWithBaseClientMainBlocking {
  public static void main(String[] args) {
    BaseClient baseClient = BaseClientJava.instance();
    ConfigApi configApi = new ConfigApi(baseClient);

    CatalogsListResult listResult =
        (CatalogsListResult)
            configApi.getCatalogs().withVerbose(Optional.of(true)).build().toEntity();

    System.out.println(listResult);
  }
}

BaseClient は、 Spark または Flink で実行されている場合にのみ、同期リクエストを使用する必要があります。 並列処理とマルチスレッド処理は、 Flink と Spark によって内部的に処理されます。

」に一致する結果は 件です

    」に一致する結果はありません