このドキュメントでは、ルートを更新してその状態を管理する方法について説明します。これには、フィールド マスクを使用してルートに関連するフィールドを設定する操作が含まれます。このサイトの説明に従って Fleet Engine を設定しており、ルートに割り当てられた車両で作業していることを前提としています。
ルート更新の基本
システムは、次の状況で Fleet Engine を使用してルートを更新します。
- ルートの作成後に車両をルートに割り当てる場合。
- ルートのステータスが変更されたとき(車両がウェイポイントを通過したときなど)。
- 乗客数や乗車場所など、ルートの項目を更新する場合。
ルートを更新するには、gRPC または REST を使用してリクエストを送信します。
Fleet Engine: サービス アカウントのロールの説明に従って、プロジェクトのサービス アカウントに適切な認証情報を使用してください。
ルートのフィールドを更新する
単一の目的地へのルートを作成するのルート フィールドで説明されているルート フィールドを更新できます。たとえば、ルートを作成した後、まず車両を検索し、ルート 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(作成済み)または 409(競合)が返されます。後者の場合、DEADLINE_EXCEEDED
の前に前のリクエストが成功しています。
Android または iOS の Consumer SDK のネットワーク エラーのリストをご覧ください。