ルートの更新と状態の管理

このドキュメントでは、旅行を更新してその状態を管理する方法について説明します。これには、フィールド マスクを使用して旅行の関連フィールドを設定する操作が含まれます。このサイトの説明に従って Fleet Engine を設定し、乗車に割り当てられた車両を使用していることを前提としています。

ルート更新情報の基本

システムは、次のような状況で Fleet Engine を使用して乗車を更新します。

  • 作成後に車両を乗車に割り当てる場合。
  • 乗車ステータスが変更されたとき(車両が経由地を通過したときなど)。
  • 乗客数や降車場所などの旅行フィールドを更新する場合。

乗車を更新するには、gRPC または REST を使用してリクエストを送信します。

  • UpdateTrip() メソッド: gRPC または REST
  • UpdateTripRequest メッセージ: gRPC のみ

Fleet Engine: サービス アカウントのロールの説明に沿って、プロジェクトのサービス アカウントの適切な認証情報を使用します。

ルートのフィールドを更新する

1 つの目的地への乗車を作成する乗車フィールドで説明されている乗車フィールドは、どれでも更新できます。たとえば、乗車ルートを作成した後、まず車両を見つけてから、乗車ルートの vehicle_id フィールドを更新して、乗車ルートを実行する車両に関連付けるのが一般的です。

フィールド マスクを使用する

フィールド マスクは、API 呼び出し元がリクエストで取得または更新するフィールドを一覧表示する方法です。FieldMask を使用すると、不要な処理を回避し、パフォーマンスを向上させることができます。Fleet Engine は、すべてのリソースのフィールドを更新するためにフィールド マスクを使用します。

車両 ID で乗車を更新する

Fleet Engine がルートに沿って車両を追跡できるように、車両 ID を使用して乗車を構成する必要があります。次のコードサンプルは、車両 ID を使用して乗車を更新する方法を示しています。

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// The trip settings to update.
Trip trip = Trip.newBuilder()
    .setVehicleId("8241890")
    .build();

// The trip update request.
UpdateTripRequest updateTripRequest =
    UpdateTripRequest.newBuilder()      // No need for the header.
        .setName(tripName)
        .setTrip(trip)
        .setUpdateMask(FieldMask.newBuilder().addPaths("vehicle_id"))
        .build();

// Error handling.
// If the Fleet Engine has both a trip and vehicle with IDs, and if the
// credentials validate, then the service updates the trip.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:                    // Neither the trip nor vehicle exist.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

旅行の旅行状態を管理する

ルートの状態は、TripStatus 列挙型の値のいずれかを使用して指定します。旅行の状態が ENROUTE_TO_PICKUP から ARRIVED_AT_PICKUP に変わった場合など、旅行の状態が変化した場合は、Fleet Engine で旅行の状態を更新します。乗車ライフサイクルは常に NEW の状態値で始まり、COMPLETE または CANCELED の値で終わります。

ルート更新情報の例

次の例は、Fleet Engine で連続した乗車状態を更新する方法を示しています。

static final String PROJECT_ID = "my-rideshare-co-gcp-project";
static final String TRIP_ID = "trip-8241890";

String tripName = "providers/" + PROJECT_ID + "/trips/" + TRIP_ID;

TripServiceBlockingStub tripService = TripService.newBlockingStub(channel);

// Trip settings to be updated.
Trip trip = Trip.newBuilder()
    .setTripStatus(TripStatus.ARRIVED_AT_PICKUP)
    .build();

// Trip update request
UpdateTripRequest updateTripRequest = UpdateTripRequest.newBuilder()
    .setName(tripName)
    .setTrip(trip)
    .setUpdateMask(FieldMask.newBuilder().addPaths("trip_status"))
    .build();

// Error handling.
try {
  Trip updatedTrip = tripService.updateTrip(updateTripRequest);
} catch (StatusRuntimeException e) {
  Status s = e.getStatus();
  switch (s.getCode()) {
    case NOT_FOUND:            // The trip doesn't exist.
      break;
    case FAILED_PRECONDITION:  // The given trip status is invalid.
      break;
    case PERMISSION_DENIED:
      break;
  }
  return;
}

旅行を更新する方法の他の例については、その他の旅行タイプのセクションをご覧ください。

乗車エラーを処理する

既存の乗車を更新または検索するときに、DEADLINE_EXCEEDED エラーが発生することがあります。この場合、Fleet Engine の状態は不明です。この問題を調査するには、まず、更新またはモニタリングしようとしている同じ乗車 ID を使用して CreateTrip を再度呼び出します。201(CREATED)または 409(CONFLICT)のいずれかが返されます。後者の場合、前のリクエストは DEADLINE_EXCEEDED の前に成功しています。

Android または iOS 向けの Consumer SDK のネットワーク エラーの一覧をご覧ください。

次のステップ