13. Zamanlayıcı Olayları
Zamanlayıcı (timer) olayları, son teslim tarihine (deadline) dayalı iş akışı otomasyonu sağlar. Flowable, zamanlayıcıları kendi asenkron yürütücüsünü (async executor) kullanarak değerlendirir.
Zamanlayıcı Olay Türleri
| Tür | BPMN Elemanı | Amaç |
|---|---|---|
| Sınır - Kesintiye Uğratan (Boundary Interrupting) | <boundaryEvent cancelActivity="true"> |
Görevi iptal eder ve alternatif yolu izler |
| Sınır - Kesintiye Uğratmayan (Boundary Non-Interrupting) | <boundaryEvent cancelActivity="false"> |
Eylemi tetikler ancak görevi aktif tutar |
| Ara Yakalama (Intermediate Catch) | <intermediateCatchEvent> |
Süreci belirli bir süre için duraklatır |
Zamanlayıcı Süre Formatları (ISO 8601)
| Format | Örnek | Anlamı |
|---|---|---|
| Dakika | PT30M |
30 dakika |
| Saat | PT2H |
2 saat |
| Gün | P1D |
1 gün |
| Karma | P3DT4H |
3 gün 4 saat |
| Tekrarlayan | R/PT1H |
Süresiz olarak her saat başı tekrarla |
| Sınırlı Tekrarlar | R3/PT1H |
Her saat başı 3 kez tekrarla |
Desen 1: Zaman Aşımından Sonra Otomatik Atlama (Auto-Skip)
Görev belirli bir sürenin ardından otomatik olarak atlanır. Süreç sonraki adıma geçer.
<userTask id="optionalApproval" name="Optional Approval" flowable:candidateGroups="ROLE_APPROVER"/>
<!-- Interrupting timer: cancels task after 48 hours -->
<boundaryEvent id="timeout" attachedToRef="optionalApproval" cancelActivity="true">
<timerEventDefinition>
<timeDuration>PT48H</timeDuration>
</timerEventDefinition>
</boundaryEvent>
<!-- Both paths lead to the same next step -->
<sequenceFlow sourceRef="optionalApproval" targetRef="nextStep"/>
<sequenceFlow sourceRef="timeout" targetRef="nextStep"/>
Desen 2: Yükseltme (Zaman Aşımından Sonra Yeniden Atama)
Zaman aşımının (timeout) ardından görev farklı bir kullanıcıya veya role atanır (Escalation). reassignTask temsilcisini (delegate) kullanır.
<userTask id="employeeTask" name="Employee Review" flowable:assignee="${initiator}"/>
<!-- Non-interrupting timer: triggers escalation but keeps task -->
<boundaryEvent id="escalateTimer" attachedToRef="employeeTask" cancelActivity="false">
<timerEventDefinition>
<timeDuration>P2D</timeDuration>
</timerEventDefinition>
</boundaryEvent>
<sequenceFlow sourceRef="escalateTimer" targetRef="doEscalation"/>
<!-- Reassign to manager role -->
<serviceTask id="doEscalation" flowable:delegateExpression="${reassignTask}">
<extensionElements>
<flowable:field name="targetCandidateGroups" stringValue="ROLE_MANAGER"/>
<flowable:field name="clearExisting" stringValue="true"/>
</extensionElements>
</serviceTask>
ReassignTaskDelegate Alanları
| Alan | Açıklama |
|---|---|
targetAssignee |
Atanacak belirli kullanıcının e-postası |
targetCandidateUsers |
Virgülle ayrılmış kullanıcı e-posta listesi |
targetCandidateGroups |
Virgülle ayrılmış rol listesi (örneğin ROLE_MANAGER,ROLE_ADMIN) |
clearExisting |
Eğer "true" ise, yenilerini eklemeden önce mevcut atanmış kişiyi temizler |
Desen 3: Gecikmeli Eylemler (örneğin Takip E-postası)
Bir eylemi belirli bir gecikmenin (delay) ardından çalıştırır.
<userTask id="submitRequest" name="Submit Request" flowable:assignee="${initiator}"/>
<sequenceFlow sourceRef="submitRequest" targetRef="waitTimer"/>
<!-- Wait for 24 hours -->
<intermediateCatchEvent id="waitTimer" name="Wait 24 Hours">
<timerEventDefinition>
<timeDuration>PT24H</timeDuration>
</timerEventDefinition>
</intermediateCatchEvent>
<sequenceFlow sourceRef="waitTimer" targetRef="sendFollowUp"/>
<serviceTask id="sendFollowUp" flowable:delegateExpression="${sendReminder}">
<extensionElements>
<flowable:field name="to" expression="${initiator}"/>
<flowable:field name="subject" stringValue="Follow-up"/>
<flowable:field name="body" stringValue="24 hours have passed since submission."/>
</extensionElements>
</serviceTask>
Desen 4: Tekrarlayan E-posta Hatırlatıcıları
Görev beklemedeyken (pending) belirli bir zamanlamaya göre hatırlatıcı e-postalar gönderir. sendReminder temsilcisini kullanır.