במאמר הזה מוסבר איך לעדכן נסיעה ולנהל את הסטטוס שלה, כולל שימוש במסכת שדות כדי להגדיר את השדות הרלוונטיים לנסיעה. המדריך מבוסס על ההנחה שהגדרתם את Fleet Engine כמו שמתואר באתר הזה, ושאתם עובדים עם רכב שהוקצה לנסיעה.
יסודות העדכונים על נסיעות
המערכת משתמשת ב-Fleet Engine כדי לעדכן נסיעה במצבים הבאים:
- כשמקצים רכב לנסיעה אחרי שהיא נוצרה.
- כשהסטטוס של הנסיעה משתנה, למשל כשהרכב עובר דרך נקודות ציון.
- כשמעדכנים שדות של נסיעה, כמו מספר הנוסעים ונקודת היעד.
כדי לעדכן נסיעה, שולחים בקשה באמצעות gRPC או REST.
משתמשים בפרטי הכניסה המתאימים לחשבון השירות של הפרויקט, כפי שמתואר במאמר Fleet Engine: תפקידים בחשבון השירות.
עדכון שדות של נסיעות
אפשר לעדכן כל אחד משדות הנסיעה שמתוארים במאמר שדות נסיעה במאמר יצירת נסיעה ליעד יחיד. לדוגמה, אחרי שיוצרים נסיעה, נהוג קודם למצוא רכב ואז לעדכן את השדה vehicle_id של הנסיעה כדי לשייך אותה לרכב שיבצע אותה.
שימוש במסכות שדות
מסכות שדות מאפשרות למתקשרים ל-API לפרט את השדות שצריך לבקש או לעדכן. השימוש ב-FieldMask מונע פעולות מיותרות ומשפר את הביצועים. Fleet Engine משתמש במסכות שדות כדי לעדכן שדות בכל המשאבים.
עדכון הנסיעה עם מזהה הרכב
צריך להגדיר נסיעה עם מזהה כלי רכב כדי ש-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);
// 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.
כדי לבדוק את זה, קודם צריך להתקשר שוב אל CreateTrip באמצעות אותו מזהה נסיעה שאתם מנסים לעדכן או לעקוב אחריו. התגובה צריכה להיות 201 (נוצר) או 409 (קונפליקט). במקרה השני, הבקשה הקודמת הסתיימה בהצלחה לפני DEADLINE_EXCEEDED.
אפשר לעיין ברשימת שגיאות הרשת ב-Consumer SDK ל-Android או ל-iOS.