Mails erst nach dem Commit verschicken, nicht mitten in der Verarbeitung #122
Labels
No labels
Kind
Bug
Kind
Enhancement
Kind
Maintenance
Priority
P1
Priority
P2
Priority
P3
Status
In Progress
Status
Need More Info
Status
Zur Abnahme
Änderungen Wettspielreglement
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
sffs-tt-basel/sffs-tt-issues#122
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Gefunden bei der Arbeit an #23 (20.10.2026), am Code nachgeprüft auf
main8ac1b58.Was heute passiert
Es gibt genau einen Versandpunkt:
CaptainNotificationService.deliververschickt die Mail synchron (mailer.send, Zeile 189). Danach schreibtsendden Protokolleintrag (Zeilen 159–170). Alle 12 Aufrufer tun das innerhalb einer@Transactional-Methode, mitten in der fachlichen Verarbeitung:TeamMatchResultService:160resultSubmittedsubmitTeamMatchResultService:283forfeitSubmittedsubmitForfeitTeamMatchResultService:330resultChangedByAssociationcorrectTeamMatchResultService:428forfeitLiftedliftForfeitTeamMatchResultService:462correctionRequestedrequestCorrectionTeamMatchProposalService:77,:113,:138,:145,:167create,accept,clearSchedule,reject,withdrawOptionsTeamMatchResource:182matchDeleteddelete. Die Mail „Begegnung gelöscht“ geht vor dem Löschen (Zeile 183) rausCaptainReminderService:205sendReminderrun: eine Transaktion über alle Begegnungen, danach die Elo-Rechnung (#23)Folgen
d0554c6undd14915a(20.07.) so entstanden.Vorschlag
@Observes(during = TransactionPhase.AFTER_SUCCESS). Wird zurückgerollt, geht keine Mail raus.NotificationMailerab.Für den Plan
AFTER_SUCCESSbraucht ein Test eine abgeschlossene Transaktion. Welche Tests das betrifft, wird erst aufgezählt und dann abgestimmt.Abnahme
TeamMatchResource.delete: Scheitert das Löschen, geht keine Mail „Begegnung gelöscht“ raus.NotificationMaileroderCaptainNotificationService.delivermehr. ArchUnit prüft das.Aus dem Review von ADR 0033 (Session „reviewer“, 20.10.2026), am Code bestätigt auf
maind40e99d. Das muss beim Bau dieses Issues entschieden werden.Der Protokolleintrag ist nicht nur Protokoll
CaptainReminderService.checkAutoConfirmation(Zeile 188) rechnet die Frist für die automatische Bestätigung ab dem neuesten EintragRESULTAT_EINGEREICHT(sentAt). Fehlt er, nimmt der Job ersatzweisematch.scheduledAt.Schreibt der Benachrichtiger den Eintrag nach dem Commit und scheitert dabei, beginnt die Frist am Spieltag statt am Tag der Einreichung, und die Begegnung wird zu früh automatisch bestätigt. Der Eintrag hat heute zwei Bedeutungen: Versandnachweis und Einreichungszeitpunkt (CLAUDE.md, „Eine Bedeutung je Feld“).
Zwei Wege, beide brauchen Ollis Entscheid:
sentAtheisst dann „beauftragt“, nicht „versandt“.Verhaltensänderung, die in die Abnahme gehört
Heute wirft ein Versandfehler bei Ereignis-Mails (
isMailFailureTolerated=false,CaptainNotificationService.deliverZeile 191) und rollt den ganzen Vorgang zurück. Fällt der Mailserver aus, kann niemand ein Resultat einreichen. Nach dem Umbau geht die Einreichung durch, nur die Mail fehlt. Ereignis-Mails holt niemand nach; nur die drei Erinnerungen prüft der Fristen-Job über das Protokoll (remind, Zeile 202).Rahmen: ADR 0033 (
docs/adr/0033-schichten-mit-fachkern-und-entitaeten-ohne-active-record.md), Regel 8 („Folgen werden gemeldet, nicht miterledigt“).Entscheidung 1 (Olli, 20.10.2026): Weg (a). Der Einreichungszeitpunkt bekommt ein eigenes Feld an der Begegnung und wird beim Einreichen in derselben Transaktion gespeichert. Der Fristen-Job rechnet die automatische Bestätigung nur noch nach diesem Feld. Der Protokolleintrag bleibt reines Versandprotokoll und wird erst nach erfolgreichem Versand geschrieben. Eine Migration übernimmt für bereits eingereichte Begegnungen den heutigen Zeitpunkt aus dem Protokoll.
Verworfen wurde (b): Ein Eintrag beim Speichern hiesse „beauftragt“ statt „versandt“, und eine gescheiterte Erinnerung des Fristen-Jobs würde nie wiederholt.
Entscheidung 2 (Olli, 20.10.2026): Variante (i). Scheitert eine Vorgangs-Mail nach dem Commit, bleibt der Vorgang gespeichert und die Mail ist verloren; der Fehler steht im Server-Log. Nachgeholt werden wie bisher nur die Erinnerungen des Fristen-Jobs. Begründung: Mailserver und Anwendung laufen im selben Rechenzentrum, ein unabhängiger Ausfall nur des Mailservers ist unwahrscheinlich. Heute blockiert ein Mailausfall dagegen die ganze Erfassung. Ein Nachholen auch der Vorgangs-Mails (Outbox) wäre ein eigenes Issue.