이 문서에서는 경로를 업데이트하고 상태를 관리하는 방법을 설명합니다. 여기에는 필드 마스크를 사용하여 경로와 관련된 필드를 설정하는 작업이 포함됩니다. 이 사이트에 설명된 대로 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 (CREATED) 또는 409 (CONFLICT)가 반환됩니다. 후자의 경우 이전 요청이 DEADLINE_EXCEEDED
전에 성공했습니다.
Android 또는 iOS용 소비자 SDK의 네트워크 오류 목록을 참고하세요.