keiro-dsl-0.17.0.0: test/fixtures/process-timers.keiro
language keiro-dsl 6
context process-timers
id IncidentId prefix=inc
process IncidentTimers
name "incident-timers"
reactions version 1
input IncidentReported { incidentId:IncidentId raisedAt:Time detail:Text }
input ResponderAcked { incidentId:IncidentId }
correlate input.incidentId via idText
saga IncidentSaga category "incidentTimers"
target Incident
projections [ ]
on IncidentReported
advance RecordIncident { incidentId }
schedule escalation fireAt input.raisedAt + 5m { incidentId detail }
schedule reminder once fireAt input.raisedAt + 60m { incidentId }
on ResponderAcked
cancel reminder
dispatch-id strategy=uuidv5 from=(name, correlationId, sourceEventId, targetStreamName, occurrence)
rejected => halt
poison => halt
timers max-attempts 5 dead-letter "incident timer exceeded ceiling"
timer escalation
id uuidv5 "incident-escalation-timer:" <> correlationId
payload { kind="escalation" incidentId:IncidentId detail:Text }
fire dispatch Incident@correlationId EscalateIncident { incidentId }
fired-event-id uuidv5 "incident-escalation-fired:" <> correlationId
on-ok Fired ; on-reject Fired ; on-ambiguous Retry ; on-error Retry ; not-mine Retry
decode unknown-status => Cancelled
timer reminder
id uuidv5 "incident-reminder-timer:" <> correlationId
payload { kind="reminder" incidentId:IncidentId }
fire dispatch Incident@correlationId RemindIncident { incidentId }
fired-event-id uuidv5 "incident-reminder-fired:" <> correlationId
on-ok Fired ; on-reject Fired ; on-ambiguous Retry ; on-error Retry ; not-mine Retry
decode unknown-status => Cancelled
aggregate IncidentSaga
regs
states Open
command RecordIncident { incidentId }
event IncidentRecorded = fields(RecordIncident)
Open -- RecordIncident --> emit IncidentRecorded ; goto Open
aggregate Incident
regs
states Open EscalatedState
command EscalateIncident { incidentId }
command RemindIncident { incidentId }
event IncidentEscalated = fields(EscalateIncident)
event IncidentReminded = fields(RemindIncident)
Open -- EscalateIncident --> emit IncidentEscalated ; goto EscalatedState
Open -- RemindIncident --> emit IncidentReminded ; goto Open