이동 업데이트 및 상태 관리

이 문서에서는 경로를 업데이트하고 상태를 관리하는 방법을 설명합니다. 여기에는 필드 마스크를 사용하여 경로와 관련된 필드를 설정하는 작업이 포함됩니다. 이 사이트에 설명된 대로 Fleet Engine을 설정했으며 이동에 할당된 차량을 사용하고 있다고 가정합니다.

경로 업데이트 기본사항

시스템은 다음과 같은 상황에서 Fleet Engine을 사용하여 이동을 업데이트합니다.

  • 차량이 생성된 후 이동에 차량을 할당할 때
  • 이동 상태가 변경되는 경우(예: 차량이 중간 지점을 통과하는 경우)
  • 승객 수 및 하차 지점과 같은 경로 필드를 업데이트할 때

이동을 업데이트하려면 gRPC 또는 REST를 사용하여 요청을 전송합니다.

  • UpdateTrip() 메서드: gRPC 또는 REST
  • UpdateTripRequest 메시지: gRPC만 해당

Fleet Engine: 서비스 계정 역할에 설명된 대로 프로젝트의 서비스 계정에 적절한 사용자 인증 정보를 사용합니다.

이동 경로 필드 업데이트

단일 목적지 경로 만들기경로 필드에 설명된 경로 필드를 업데이트할 수 있습니다. 예를 들어 이동을 만든 후에는 먼저 차량을 찾은 다음 이동 vehicle_id 필드를 업데이트하여 이동을 실행할 차량과 연결하는 것이 일반적입니다.

필드 마스크 사용

필드 마스크는 요청이 반환 또는 업데이트해야 하는 필드를 API 호출자가 나열하는 방식입니다. FieldMask를 사용하면 불필요한 작업을 방지하고 성능을 개선할 수 있습니다. Fleet Engine은 모든 리소스에서 필드를 업데이트하는 데 필드 마스크를 사용합니다.

차량 ID로 이동 업데이트

Fleet 엔진이 경로를 따라 차량을 추적할 수 있도록 차량 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용 소비자 SDK의 네트워크 오류 목록을 참고하세요.

다음 단계