이동 업데이트 및 상태 관리

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

여행 업데이트 기본사항

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

  • 여행이 생성된 후 차량을 여행에 할당하는 경우
  • 이동 상태가 변경되는 경우(예: 차량이 경유지를 통과하는 경우)
  • 승객 수, 하차 지점 등 여행 필드를 업데이트하는 경우

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

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

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 (CREATED) 또는 409 (CONFLICT)를 반환해야 합니다. 후자의 경우 이전 요청이 DEADLINE_EXCEEDED 전에 성공했습니다.

Android 또는 iOS용 Consumer SDK의 네트워크 오류 목록을 참고하세요.

다음 단계