이 문서에서는 경로를 업데이트하고 상태를 관리하는 방법을 설명합니다. 여기에는 필드 마스크를 사용하여 경로와 관련된 필드를 설정하는 작업이 포함됩니다. 이 사이트에 설명된 대로 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;
}
기타 이동 유형 섹션에서 이동을 업데이트하는 다른 예시를 확인할 수 있습니다.
경로 오류 처리
기존 경로를 업데이트하거나 찾을 때 Fleet Engine의 상태를 알 수 없는 DEADLINE_EXCEEDED
오류가 발생할 수 있습니다.
이를 조사하려면 먼저 업데이트하거나 모니터링하려는 것과 동일한 이동 ID를 사용하여 CreateTrip
를 다시 호출합니다. 201(CREATED) 또는 409(CONFLICT)가 반환됩니다. 후자의 경우 이전 요청이 DEADLINE_EXCEEDED
전에 성공했습니다.
Android 또는 iOS용 소비자 SDK의 네트워크 오류 목록을 참고하세요.