Zum Hauptinhalt springen

Status verfolgen

TL;DR – Status oder vollständiges Ereignisprotokoll einer Submission abrufen, um den Fortschritt durch das Zustandsmodell submitted → forwarded → accepted / rejected zu verfolgen. Die Hintergründe erklärt Vorgänge und Ereignisprotokoll.

Zustandsmodell einer Submission​

Zustände mit ✎ schreibt der Empfänger — signiert mit seinem Signaturschlüssel. Eine ausführliche Erklärung der Zustände finden Sie im Glossar und im Konzept Vorgänge und Ereignisprotokoll.

Aktuellen Status abfragen (Sender)​

Status und Eventlog stecken im TransferLog: cases().logOf(...) liefert es für eine einzelne Nachricht (Submission oder Reply), latest() den aktuellsten Eintrag als CaseEvent mit seinem EventState.

SentSubmission sent = onlineService.send(submission);

// latest() wirft bei leerem Log — direkt nach dem Senden ist immer mindestens ein Event da
CaseEvent latest = onlineService.cases().logOf(sent).latest();

System.out.printf("Submission %s → %s%n",
sent.submissionId(), latest.state());

Ein Aufruf statt zweier separater Roundtrips: logOf(...) liefert das TransferLog dieser einen Nachricht, latest() (nach issueTime) trägt den aktuellen Stand als EventState.

Auf Endstatus warten (.NET, Paket Fitko.FitConnect.Zbp)

WaitForCompletionAsync(sent, timeoutSeconds: 60) pollt, bis die Submission ihren Endstatus (Accepted oder Rejected) erreicht hat. Die Erweiterungsmethode liegt im Paket Fitko.FitConnect.Zbp (nicht im Basispaket) — installieren Sie es auch dann, wenn Sie kein ZBP nutzen, sobald Sie diese Komfortfunktion wollen.

Vollständiges Eventlog abrufen​

Zwei Blickwinkel auf denselben Vorgang: logOf(nachricht) liefert das Log einer einzelnen Nachricht, events(caseId) das Log des ganzen Vorgangs — die Namen sind absichtlich verschieden.

Log einer einzelnen Nachricht, samt Ausgabe aller Einträge:

TransferLog log = onlineService.cases().logOf(sent);
List<CaseEvent> entries = log.entries();

for (CaseEvent e : entries) {
System.out.printf("[%s] %s%n", e.issueTime(), e.state());
}

Log des ganzen Vorgangs — alle Submissions und Replies dieses Case zusammen:

List<CaseEvent> caseLog = onlineService.cases().events(caseId);

Status auf der Empfängerseite​

Empfangsseitig verwenden Sie die Organisation — das Log lässt sich direkt aus dem wartenden bzw. empfangenen Objekt abrufen, ganz ohne separates Tripel aus IDs.

Organisation organisation = sdk.organisation(myDestinationId, keys);

CaseEvent latest = organisation.cases().logOf(submissionForPickup).latest();

List<CaseEvent> log =
organisation.cases().logOf(submissionForPickup).entries();

Abgelehnt — und warum?​

Ein REJECTED-Event trägt die Problem-Liste des Empfängers. Das SDK lehnt seit 4.0.0-rc.1 nichts mehr von allein ab („Auto-Reject“ gibt es weder in Java noch in .NET); jede Ablehnung ist eine Entscheidung des Fachverfahrens auf Basis des Prüfberichts — siehe Konzept: Der Prüfbericht. Als Onlinedienst lesen Sie die Gründe aus dem letzten Event:

CaseEvent latest = onlineService.cases().logOf(sent).latest();
if (latest.state() == EventState.REJECTED) {
latest.problems().forEach(p -> log.warn("{}: {}", p.getType(), p.getDetail()));
}
Häufige Stolperfallen
  • Polling-Intervalle: Pollen Sie nicht aggressiver als nötig. 30 Sekunden bis wenige Minuten sind in der Praxis ausreichend.
  • Submission verschwunden: Akzeptierte oder abgewiesene Submissions werden im Zustelldienst gelöscht. Sie erhalten dann 404-ähnliche Fehler. Persistieren Sie den Endstatus in Ihrem System, sobald er erreicht ist.
  • Callbacks statt Polling: Wenn Ihre Anwendung öffentlich erreichbar ist, ist Callbacks effizienter als Polling.

Weiter geht's​