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.