Ana içeriğe geç

Workflow

Workflow, vNext platformunda iş süreçlerini modelleyen ana definable unit'tir. JSON formatında tanımlanır ve vnext-schema üzerinden doğrulanır.

Schema: vnext-schema/workflow-definition.schema.json

Tanım JSON Örneği

Schema: workflow-definition.schema.json

{
"key": "account-opening",
"flow": "sys-flows",
"flowVersion": "1.0.0",
"domain": "banking",
"version": "1.0.0",
"tags": ["banking", "account", "account-opening"],
"_comment": "Hesap açma iş akışı",
"attributes": {
"type": "F",
"labels": [
{ "label": "Account Opening", "language": "en-US" },
{ "label": "Hesap Açma", "language": "tr-TR" }
],
"schema": {
"key": "account-master-schema",
"domain": "banking",
"flow": "sys-schemas",
"version": "1.0.0"
},
"startTransition": {
"key": "start",
"target": "account-type-selection",
"triggerType": 0,
"versionStrategy": "Minor",
"labels": [
{ "label": "Start", "language": "en-US" },
{ "label": "Başlat", "language": "tr-TR" }
],
"schema": {
"key": "start-schema",
"domain": "banking",
"flow": "sys-schemas",
"version": "1.0.0"
},
"mapping": null
},
"states": [
{
"key": "account-type-selection",
"stateType": 1,
"versionStrategy": "Minor",
"labels": [
{ "label": "Account Type Selection", "language": "en-US" },
{ "label": "Hesap Türü Seçimi", "language": "tr-TR" }
],
"view": {
"view": {
"key": "account-type-selection-view",
"domain": "banking",
"flow": "sys-views",
"version": "1.0.0"
},
"loadData": false
},
"transitions": [
{
"key": "select-demand-deposit",
"target": "account-detail",
"triggerType": 0,
"versionStrategy": "Minor",
"labels": [
{ "label": "Select Demand Deposit", "language": "en-US" },
{ "label": "Vadesiz Hesap Seç", "language": "tr-TR" }
],
"schema": {
"key": "demand-deposit-schema",
"domain": "banking",
"flow": "sys-schemas",
"version": "1.0.0"
},
"mapping": {
"location": "./src/SelectDemandDepositMapping.csx",
"code": "<BASE64_ENCODED_CODE>"
},
"view": null,
"rule": null,
"timer": null
}
]
},
{
"key": "account-detail",
"stateType": 2,
"versionStrategy": "Minor",
"labels": [
{ "label": "Account Detail", "language": "en-US" },
{ "label": "Hesap Detay", "language": "tr-TR" }
],
"view": {
"view": {
"key": "account-detail-view",
"domain": "banking",
"flow": "sys-views",
"version": "1.0.0"
},
"loadData": true,
"extensions": ["extension-customer-detail"]
},
"transitions": [
{
"key": "complete-account",
"target": "completed",
"triggerType": 0,
"versionStrategy": "Minor",
"labels": [
{ "label": "Complete", "language": "en-US" },
{ "label": "Tamamla", "language": "tr-TR" }
],
"onExecutionTasks": [
{
"order": 1,
"task": {
"key": "create-account",
"domain": "banking",
"flow": "sys-tasks",
"version": "1.0.0"
},
"mapping": {
"location": "./src/CreateAccountMapping.csx",
"code": "<BASE64_ENCODED_CODE>"
}
}
],
"mapping": null,
"schema": null,
"view": null,
"rule": null,
"timer": null
}
]
},
{
"key": "completed",
"stateType": 3,
"subType": 1,
"versionStrategy": "None",
"labels": [
{ "label": "Completed", "language": "en-US" },
{ "label": "Tamamlandı", "language": "tr-TR" }
]
}
],
"cancel": {
"key": "cancel-account-opening",
"target": "cancelled",
"triggerType": 0,
"versionStrategy": "None",
"labels": [
{ "label": "Cancel", "language": "en-US" },
{ "label": "İptal", "language": "tr-TR" }
]
},
"timeout": {
"key": "account-opening-timeout",
"target": "timed-out",
"versionStrategy": "None",
"timer": {
"reset": "None",
"duration": "PT30M"
}
},
"functions": [
{
"key": "function-get-customer-detail",
"domain": "core",
"flow": "sys-functions",
"version": "1.0.0"
}
],
"extensions": [
{
"key": "extension-customer-detail",
"domain": "core",
"flow": "sys-extensions",
"version": "1.0.0"
}
],
"queryRoles": [
{ "role": "account-officer", "grant": "allow" },
{ "role": "guest", "grant": "deny" }
]
}
}

Workflow Türleri

KodTürAçıklamaTipik Kullanım
CCorePlatform çekirdek iş akışlarıSistem işlemleri, platform servisleri
FFlowAna iş akışlarıİşletme ana süreçleri, kullanıcı etkileşimi
SSubFlowAlt iş akışlarıTekrar kullanılabilir süreç parçaları
PSubProcessAlt süreçlerParalel ve bağımsız işlemler (fire-and-forget)

Properties

Top-Level Alanlar

AlanTipZorunluPattern / KısıtAçıklama
$schemastringHayırJSON Schema referansı
keystringEvet^[a-z0-9-]+$Workflow'un benzersiz tanımlayıcısı (domain içinde unique)
flowstringEvet^[a-z0-9-]+$Kategorize amaçlı flow ismi
flowVersionstringEvet^\d+\.\d+\.\d+(-[a-zA-Z]+\.\d+)?$Flow versiyonu (SemVer)
domainstringEvet^[a-z0-9-]+$Workflow'un ait olduğu domain
versionstringEvet^\d+\.\d+\.\d+(-[a-zA-Z]+\.\d+)?$Workflow tanım versiyonu (SemVer)
tagsstring[]EvetEtiketler — sorgu/filtre için
_commentstringHayırAçıklama / yorum
attributesobjectEvetWorkflow'un asıl tanımı (aşağıda)

attributes Alanları

AlanTipZorunluAçıklama
typestringEvetWorkflow türü: C, F, S, P (yukarıdaki tür tablosu)
scripts NewobjectHayırFlow seviyesi helper ve izinli assembly tanımı (aşağıda)
statesarrayEvetState listesi. Tam olarak bir Initial state (stateType: 1) içermelidir
startTransitionobjectEvetBaşlangıç transition tanımı (aşağıda)
labelsarrayEvetÇoklu dil etiketleri (minItems: 1). Her öğe: label + language
schemaobjectHayırMaster schema referansı. schema ile reference objesi içerir
timeoutobject | nullHayırWorkflow seviyesi timeout tanımı (aşağıda)
functionsarrayHayırWorkflow'da kullanılan function referansları
featuresarrayHayırWorkflow'da kullanılan feature (extension) referansları
extensionsarrayHayırWorkflow'da kullanılan extension referansları
sharedTransitionsarrayHayırBirden fazla state'den erişilebilen ortak transition'lar (aşağıda)
errorBoundaryobject | nullHayırGlobal hata yönetim tanımı (aşağıda)
cancelobject | nullHayırCancel transition tanımı. Yalnızca triggerType: 0 (manual)
exitobject | nullHayırExit transition tanımı. Yalnızca triggerType: 0 (manual)
updateDataobject | nullHayırUpdate data transition. target her zaman $self
queryRolesarrayHayırRoot-level sorgu rolleri. DENY her zaman ALLOW'u geçersiz kılar
output Newobject | nullHayırSync yanıt için opsiyonel output mapping (scriptCode, IOutputHandler). Ayrıntı: Output Mapping
event Newobject | nullHayırWorkflow seviyesi event tanımı. Tanımlıysa harici bir event bu workflow'un yeni bir instance'ını başlatabilir (action=start). Transition seviyesi event'ten bağımsızdır. Ayrıntı: Event Transition
config Newobject | nullHayırFlow seviyesi yapılandırma. Şu an built-in function cache ayarını (functionCache) içerir. null ise host varsayılanları geçerlidir. Ayrıntı: Config (Built-in Function Cache)

Reference Yapısı

Workflow tanımı içinde birçok yerde kullanılan genel referans objesidir. İki formdan biri kullanılır:

FormZorunlu AlanlarAçıklama
Explicitkey, domain, flow, versionDoğrudan bileşen referansı
RefrefDosya yolu ile bileşen referansı

State Yapısı

State Alanları

AlanTipZorunluAçıklama
keystringEvetState benzersiz tanımlayıcısı (pattern: ^[a-z0-9-]+$)
stateTypeintegerEvetState tipi — aşağıdaki enum tablosuna bakın
subTypeintegerHayırState alt tipi — aşağıdaki enum tablosuna bakın. Varsayılan: 0
versionStrategystringEvetVersiyon stratejisi: None, Patch, Minor, Major
labelsarrayEvetÇoklu dil etiketleri (minItems: 1)
viewobject | nullHayırState view tanımı: view (reference), loadData (boolean), extensions (string[])
subFlowobject | nullHayırSubFlow state için alt akış tanımı: type (S/P), process (reference), mapping
transitionsarrayHayırBu state'den çıkan transition'lar. Wizard state (stateType: 5) için yalnızca bir manuel transition tanımlanabilir
onEntriesarrayHayırState'e girildiğinde çalıştırılacak task'lar
onExitsarrayHayırState'den çıkılırken çalıştırılacak task'lar
errorBoundaryobject | nullHayırState seviyesi hata yönetimi
queryRolesarrayHayırState seviyesi sorgu rolleri. Root queryRoles'u override eder. Instance bu state'teyken state/data/view/schema read fonksiyonlarınca uygulanır; izin yoksa 403 (bkz. Query Roles)
aliasarrayHayırState için rol bazlı alternatif çoklu-dil etiketleri. Tanımlıysa State Function state değerini role göre maskeler
notificationsarrayHayırState'e bağlı bildirim tanımları. Transition pipeline tamamlandıktan sonra enqueue edilir ve durable çalışır — bkz. State Notifications
interactionobject | nullHayırState etkileşim yapılandırması (ör. longPoll). Long-poll'un ne zaman sonlandırılacağını deklaratif tanımlar — bkz. State Interaction (Long Poll)

stateType Enum Değerleri

DeğerAdAçıklama
1InitialBaşlangıç state'i. Workflow'da tam olarak bir tane olmalıdır
2IntermediateAra state
3FinalBitiş state'i
4SubFlowAlt akış çağıran state
5WizardWizard (sihirbaz) state. Yalnızca bir manuel transition'a sahip olabilir

Wizard State ve View Davranışı

Wizard state, kullanıcı girdisini transition tabanlı modellemek için kullanılan özel state tipidir. Bir Wizard state içinde yalnızca bir manuel transition tanımlanabilir; input, seçim ve onay gibi kullanıcı etkileşimleri state view içinde data alanı olarak değil, bu transition'ın view'ı üzerinden alınmalıdır.

State Function aktif state'in tipini Wizard olarak değerlendirdiğinde önce authorization/role evaluation sonrasında kullanılabilir transition listesini belirler. Kullanılabilir manuel transition varsa View Function, state view yerine bu transition'ın view'ını döndürür. Transition üzerinde view tanımlı değilse state'de tanımlı view fallback olarak kullanılır.

Örneğin hesap açılışı akışında "hesap türü seçimi" state'inde kullanıcıdan vadeli/vadesiz seçimi alınacaksa bu seçim state view içinde veri alanı olarak modellenmemelidir. Seçim transition routing perspektifiyle tasarlanır; böylece her seçim ayrı transition görünürlüğü, loglama ve raporlama katkısı sağlar. State view varsa, summary veya wizard'a devam edeceği ekran olarak kullanılmalıdır.

stateSubType Enum Değerleri

DeğerAdAçıklama
0NoneBelirli bir alt tip yok (varsayılan)
1SuccessBaşarılı tamamlanma
2ErrorHata durumu
3TerminatedManuel sonlandırılmış
4SuspendedGeçici askıya alınmış
5BusyMeşgul
6Humanİnsan müdahalesi gerektiren

State Alias (Rol Tabanlı State Maskeleme)

alias, bir state'in dış dünyaya nasıl görüneceğini role göre maskelemek için kullanılır. Bir süreç client tarafında başlayıp backoffice'te devam ederken, arka planda Fraud, Limit, KPS gibi kontrol state'leri çalışır. Client durumu State Function ile sorduğunda normalde ham state.key döner — bu da iç süreç adımlarının client'a sızmasına ve bir güvenlik açığına yol açar.

alias ile aynı state'e rol bazlı alternatif çoklu-dil etiketleri tanımlanabilir: client "Değerlendirme Aşamasında" gibi maskelenmiş bir değer görürken, backoffice aktörleri kendi rollerine uygun alias'ı (örn. "Operasyon İncelemesinde") görür.

alias bir dizidir; her öğe aşağıdaki alanlara sahiptir:

AlanTipZorunluAçıklama
namestringEvetAlias adı. İstek diline uygun bir label bulunamazsa fallback olarak döner
rolesarrayEvetBu alias'ın geçerli olduğu roller (minItems: 1)
labelsarrayEvetAlias'ın çoklu-dil etiketleri (minItems: 1)

roles alanları:

AlanTipZorunluAçıklama
rolestringEvetRol adı
grantstringEvetallow veya deny. DENY her zaman ALLOW'u geçersiz kılar

labels alanları:

AlanTipZorunluAçıklama
labelstringEvetEtiket metni
languagestringEvetDil kodu (pattern: ^[a-z]{2}(-[A-Z]{2})?$, örn. tr, en, tr-TR)

Örnek:

{
"alias": [
{
"name": "Değerlendirme Aşamasında",
"roles": [
{ "role": "backoffice.operator", "grant": "allow" }
],
"labels": [
{ "label": "Operasyon İncelemesinde", "language": "tr" },
{ "label": "Under Operational Review", "language": "en" }
]
}
]
}

Çözümleme Davranışı:

State Function state değerini döndürürken aşağıdaki sırayı izler:

  1. State'te alias tanımı yoksastate.key döner (mevcut davranış).
  2. alias tanımı varsa → istek yapan aktörün rolleri her alias'ın roles listesine göre değerlendirilir (DENY her zaman ALLOW'u geçersiz kılar).
  3. Eşleşen bir alias bulunursa → istek diline (Accept-Language) uygun label döner; o dilde label yoksa alias.name döner.
  4. Hiçbir alias rolü eşleşmezse → state.key fallback olarak döner.

State Notifications

State'e girildikten sonra, transition pipeline'ı tamamlandığında platform bildirim taleplerini enqueue eder ve durable olarak çalıştırır. Bu yapı Notification Task'tan bağımsızdır; task pipeline'ına bağlı kalmadan state geçişini takip eden bildirimleri kapsam dışında tutar.

Dapr Binding yapılandırması Notification Task ile aynı convention'ı izler (vnext-notification-state).

stateNotification Alanları

AlanTipZorunluAçıklama
typeintegerEvetBildirim tipi. Şu an yalnızca 0 (State) desteklenir
mappingscriptCodeEvetIStateNotificationMapping implementasyonu. Bildirim içeriğini ve hedef metadata'yı şekillendirir
rulescriptCode | nullHayırKoşul scripti. Tanımsız veya null ise bildirim her durumda çalışır

Örnek:

{
"key": "waiting-approval",
"stateType": 2,
"notifications": [
{
"type": 0,
"mapping": { "type": "L", "code": "<base64-encoded-script>", "encoding": "B64" },
"rule": { "type": "L", "code": "<base64-encoded-condition>", "encoding": "B64" }
}
]
}
ipucu

rule alanı yalnızca belirli koşullarda (örn. yalnızca belirli bir transition üzerinden gelindiğinde) bildirim göndermek için kullanılır. rule yoksa her state girişinde bildirim enqueue edilir.

İlgili: IStateNotificationMapping · Notification Task


State Interaction (Long Poll)

State Function, client tarafında long-polling ile süreç durumunu döner. interaction.longPoll ile bu açık tutulan isteğin ne zaman sonlandırılacağı state tanımında deklaratif olarak belirtilir. Runtime, isteği bir transition gerçekleşene veya fallback timeout dolana kadar açık tutar. Böylece bir süreç tasarımında farklı client'lar süreci kendi durak noktaları ile belirleyebilir.

interaction opsiyoneldir ve şimdilik tek bir alt blok taşır: longPoll.

AlanTipZorunluAçıklama
terminatebooleanEvetState'ten çıkıldığında açık olan long-poll isteğinin sonlandırılıp sonlandırılmayacağı
fallbackTimeoutSecondsintegerHayırİstek fallback'e düşmeden önce açık tutulacağı maksimum saniye (minimum: 1). Client ack gönderemezse bu süre sonunda platform isteği otomatik kapatır
rolesarrayEvetLong-poll etkileşimini kullanabilecek roller. DENY her zaman ALLOW'u geçersiz kılar

Örnek:

{
"key": "waiting-approval",
"stateType": 2,
"interaction": {
"longPoll": {
"terminate": true,
"fallbackTimeoutSeconds": 30,
"roles": [
{ "role": "client.app", "grant": "allow" }
]
}
}
}

State Yanıtındaki interaction Objesi

State Function yanıtındaki interaction objesi, state'te interaction.longPoll tanımlıysa (rol kontrolüne tabi olarak) terminate değerinden bağımsız her zaman döner:

"interaction": {
"terminateLongPoll": false,
"fallbackTimeoutSeconds": 600
}
AlanAçıklama
terminateLongPollState'in interaction.longPoll.terminate değerini yansıtır
fallbackTimeoutSecondsFallback penceresi (varsayılan 60). interaction.longPoll tanımlıysa her zaman döner
ackAcknowledge endpoint href'i. Yalnızca terminateLongPoll: true iken bulunur

Client davranışı:

  • terminateLongPoll: true → client aktif long-poll isteğini sonlandırır, girilen state'in ekranını render eder ve ack ile platformu bilgilendirir. Süre içinde ack gelmezse zamanlanmış fallback pipeline'ı otomatik devam ettirir.
  • terminateLongPoll: false → client, instance durumundan bağımsız olarak durmuş bir long-poll isteği varsa yeniden başlatır ve fallbackTimeoutSeconds penceresi boyunca denemeye devam eder.

Long Poll Acknowledge

Client, açık tuttuğu long-poll isteğini tamamladığında acknowledge endpoint'ini çağırarak platformu bilgilendirir:

PATCH /api/v1/{domain}/workflows/{workflow}/instances/{instance}/longpoll/ack

Client hata alır veya talep gönderemezse fallbackTimeoutSeconds süresi dolduğunda platform isteği otomatik olarak kapatır. Bu sayede client çökmesi veya ağ hatası durumunda long-poll askıda kalmaz.

İlgili doküman: Async / Sync Yöntemi


State Yaşam Döngüsü

State machine aşağıdaki yaşam döngüsünü takip eder:

Yaşam Döngüsü Adımları

  1. State Policy Kontrolleri

    • State'de tanımlı transition'lar kontrol edilir
    • Client sadece manuel ve event transition'ları tetikleyebilir
    • Auto ve schedule transition'lar sadece sistem tarafından çalıştırılır
  2. Current Transition OnExecutionTasks

    • Mevcut transition'ın OnExecutionTask'ları çalıştırılır
  3. Current State OnExits

    • Mevcut state'in OnExit task'ları çalıştırılır
  4. State Değişimi

    • Current Transition'ın target state'ine geçiş yapılır
    • State değişimi sadece transition'lar üzerinden gerçekleşir
  5. State OnEntries

    • Yeni state'in OnEntry task'ları çalıştırılır

5.1. State Notifications

  • State'de tanımlı bildirimler enqueue edilir ve durable olarak gönderilir
  • rule koşulu varsa değerlendirilir; koşul sağlanmazsa bildirim atlanır
  1. State Tipi Kontrolü

    • Finish: Instance durumu "Completed" olarak güncellenir
    • SubFlow: Sadece SubFlow çalıştırılır
  2. Auto Transition'lar

    • Otomatik transition'lar çalıştırılır
  3. Schedule Transition'lar

    • Zamanlanmış transition'lar çalıştırılır

Transition Yapısı

Transition Alanları

AlanTipZorunluAçıklama
keystringEvetTransition benzersiz tanımlayıcısı (pattern: ^[a-z0-9-]+$)
targetstringEvetHedef state key'i. $self veya bir state key (pattern: ^(\$self|[a-z0-9-]+)$)
fromstringHayırKaynak state key'i
triggerTypeintegerEvetTetikleme tipi — aşağıdaki enum tablosuna bakın
triggerKindintegerHayırOtomatik transition alt tipi. Varsayılan: 0
versionStrategystringEvetNone, Patch, Minor, Major
labelsarrayEvetÇoklu dil etiketleri (minItems: 1)
schemaobject | nullHayırTransition schema referansı (request body validation)
ruleobject | nullKoşulluKural betiği. triggerType: 1 (auto) ise zorunlu (triggerKind 10 hariç)
timerobject | nullKoşulluTimer betiği (ITimerMapping). triggerType: 2 (scheduled) ise zorunlu. Schedule transition'ın nasıl timer ürettiği için bkz. Timer mapping
viewobject | nullHayırTransition view tanımı. Yalnızca triggerType: 0 (manual) için geçerli
onExecutionTasksarrayHayırTransition sırasında çalıştırılacak task listesi
mappingobject | nullHayırTransition input mapping betiği
rolesarrayHayırYetkilendirme rolleri. DENY her zaman ALLOW'u geçersiz kılar
annotations Newobject | nullHayırClient-side filtreleme ve UI bağlamı için key-value metadata. Platform annotations değerlerini yorumlamaz (passthrough). Çakışmaları önlemek için namespace'li key'ler kullanın (örn. ui/visible-in, ui/priority)
event Newobject | nullKoşulluTransition seviyesi event tanımı. triggerType: 3 ise zorunlu. Ayrıntı: Event Transition
resourceLock Newobject | nullHayırTransition sırasında çalışan dağıtık kaynak kilidi (Dapr lock.redis). Yalnızca Manual profilde çalışır; start, state-level ve shared transition'larda geçerlidir. Ayrıntı: Kaynak Kilitleme

triggerType Enum Değerleri

DeğerAdAçıklamaZorunlu Alanlar
0ManualKullanıcı tarafından tetiklenir
1AutomaticOtomatik tetiklenirrule zorunlu (triggerKind: 10 hariç)
2ScheduledZamanlayıcı ile tetiklenirtimer zorunlu
3EventHarici pub/sub event'i ile tetiklenir — bkz. Event Transitionevent zorunlu

triggerKind Enum Değerleri

DeğerAdAçıklama
0Not applicableUygulanmaz (varsayılan)
10Default autoVarsayılan otomatik transition (rule opsiyonel)

versionStrategy Enum Değerleri

DeğerAçıklama
NoneVersiyon güncellemesi yok
PatchPatch versiyon artırımı
MinorMinor versiyon artırımı
MajorMajor versiyon artırımı

Annotations

annotations alanı, platform tarafından yorumlanmayan serbest key-value metadata'dır. UI SDK'ları ve istemci uygulamaları transition'ları filtrelemek, gruplamak veya koşullu render etmek için kullanır. Çakışmaları önlemek için namespace'li key'ler kullanılması önerilir.

Tanımlı Key'ler

KeyTipAçıklama
ui/visibility-channelstringPipe (|) ile ayrılmış kanal listesi. Yalnızca belirtilen kanallarda gösterilir
ui/priorityinteger (string)Sıralama önceliği. Düşük değer = yüksek öncelik
ui/intentstringGörsel davranış ipucu

ui/visibility-channel Değerleri

DeğerKanal
IbWebİnternet Bankacılığı
backofficeBackoffice
IbIvnAppCall Center

ui/intent Değerleri

DeğerAçıklama
cancelİptal aksiyonu
destructiveGeri alınamaz / yıkıcı aksiyon
closeEkran veya modal kapatma
confirmOnay gerektiren aksiyon

Örnek

"annotations": {
"ui/visibility-channel": "IbIvnApp|backoffice",
"ui/priority": "1",
"ui/intent": "cancel"
}

Event Transition

Bir transition, harici bir pub/sub event'i ile tetiklenebilir. Bunun için transition'da "triggerType": 3 ve bir event tanımı bulunmalıdır. Ayrıca workflow seviyesinde attributes.event tanımlanarak harici bir event ile yeni instance başlatılabilir (action=start). İki tanım birbirinden bağımsızdır.

event objesinin tek alanı vardır:

AlanTipZorunluAçıklama
mappingobjectEvetIEventMapping uygulayan mapping betiği (standart scriptCode yapısı: location + base64 code). Ham event payload'ını InstanceKey + Body'ye (veya key yoksa Selector'e) dönüştürür
{
"key": "abort-order",
"target": "aborted",
"triggerType": 3,
"versionStrategy": "Minor",
"labels": [{ "label": "Abort Order", "language": "en-US" }],
"event": {
"mapping": { "location": "./src/AbortEventMapping.csx", "code": "<base64>" }
}
}

Kurallar:

  • Event transition yalnızca state transition'ları ve shared transition'lar üzerinde tanımlanabilir; startTransition, cancel, exit ve updateData manuel kalır.
  • triggerType: 3 olan bir transition'a event dışı teslimat NotAnEventTransition hatasıyla reddedilir.
  • Event teslimatı POST /api/v1/{domain}/workflows/{workflow}/instances/events?action=transition&transitionKey=<key> endpoint'i üzerinden yapılır; topic ve Dapr Subscription tanımları domain'e aittir.

Uçtan uca akış (korelasyon kuralları, Dapr Subscription YAML'ları, runtime davranışları, test) için: Event-Driven Workflow'lar.


StartTransition Yapısı

AlanTipZorunluAçıklama
keystringEvetTransition key'i
targetstringEvetHedef state (Initial state olmalı)
triggerTypeintegerEvetSabit: 0 (yalnızca manual)
versionStrategystringEvetNone, Patch, Minor, Major
labelsarrayEvetÇoklu dil etiketleri
schemaobject | nullHayırStart request body validation schema'sı
onExecutionTasksarrayHayırBaşlangıçta çalıştırılacak task'lar
mappingobject | nullHayırInput mapping betiği
rolesarrayHayırYetkilendirme rolleri
annotations Newobject | nullHayırClient-side filtreleme ve UI bağlamı için key-value metadata (passthrough)
resourceLock Newobject | nullHayırDağıtık kaynak kilidi. Ayrıntı: Kaynak Kilitleme

Davranış

Start transition view tanımı alamaz (tabloda view alanı bilinçli olarak yoktur); yalnızca schema ile başlangıç verisi ve validation tanımlanabilir. Bu, instance'ın hangi veriyle başlatılacağını belirler.

  • Service-to-service (S2S) akışlar: Start transition'da schema ile veri almak mantıklıdır; çağıran sistem başlangıç payload'ını doğrudan gönderir.
  • Client-base akışlar: Instance genellikle base bilgiyle başlatılır; kullanıcı girdisi (gerekiyorsa) start'ta değil, initial state view'inde alınır. Çünkü client tarafı girdiyi view üzerinden toplar.
Flow tasarım notu

Girdi modelini bu ayrıma göre kurgulayın: S2S tetikleyiciler için start schema; kullanıcıdan girdi gereken client akışlarında ise minimal start payload'ı + initial state view. State vs transition view ayrımı için bkz. Pseudo UI → Giriş ve User Integration.


Özel Transition'lar

Cancel Transition

AlanTipZorunluAçıklama
keystringEvetCancel transition key'i
targetstringEvetHedef state (iptal state'i)
triggerTypeintegerEvetSabit: 0 (yalnızca manual)
versionStrategystringEvetVersiyon stratejisi
labelsarrayEvetÇoklu dil etiketleri
availableInstring[]HayırCancel'ın geçerli olduğu state'ler
view, schema, mapping, onExecutionTasks, rolesHayırStandart transition alanları
annotations Newobject | nullHayırClient-side filtreleme ve UI bağlamı için key-value metadata (passthrough)

Alt akışları varsa onlara da cancel bildirisi yayınlar. Alt akışlarda cancel tanımı yoksa bypass edilir.

Exit Transition

Cancel ile aynı yapıda. Client implementasyonlarında ekran çıkışları veya ekrandan ayrılma durumlarında aktif instance'ları sonlandırır.

Update Data Transition

Cancel ile aynı yapıda, tek fark: target her zaman $self olmalıdır. Alt akışlardan üst akış data'sını ara bloklarda güncellemek için kullanılır.

Shared Transitions

Birden fazla state'den erişilebilen ortak transition'lardır. Standart transition alanlarına ek olarak:

AlanTipZorunluAçıklama
availableIn Newstring[]HayırTransition'ın geçerli olduğu state key'leri. Tanımlanmazsa tüm state'lerden erişilebilir
annotations Newobject | nullHayırClient-side filtreleme ve UI bağlamı için key-value metadata (passthrough)
event Newobject | nullKoşulluEvent tanımı. triggerType: 3 ise zorunlu — bkz. Event Transition
resourceLock Newobject | nullHayırDağıtık kaynak kilidi. Ayrıntı: Kaynak Kilitleme

Shared transition'larda triggerType yalnızca 0 (Manual), 2 (Scheduled) veya 3 (Event) olabilir.


Timeout Yapısı

AlanTipZorunluAçıklama
keystringEvetTimeout tanımlayıcısı
targetstringEvetTimeout durumunda hedef state
versionStrategystringEvetVersiyon stratejisi
timerobjectEvetreset (string) + duration (ISO 8601, örn. PT30M)
mappingobject | nullHayırDinamik timeout hesaplama betiği. Başarısız olursa statik timer.duration kullanılır

Error Boundary Yapısı

Workflow (global), state ve task seviyesinde tanımlanabilir. Öncelik sırası: task > state > workflow.

Error Boundary Alanları

AlanTipAçıklama
onErrorarrayHata kuralları listesi. Priority sırasına göre (düşük değer = yüksek öncelik) değerlendirilir
onTimeoutobjectTimeout hatası politikası

onError Kural Yapısı (errorHandlerRule)

AlanTipZorunluAçıklama
actionintegerEvetHata aksiyonu — aşağıdaki enum tablosuna bakın
errorTypesstring[]HayırEşlenecek exception tipleri. * veya boş = tümü
errorCodesstring[]HayırEşlenecek hata kodları (örn. Task:400007, 500)
transitionstringKoşulluTetiklenecek transition key'i. Rollback ve Notify için zorunlu, Abort için yasak
priorityintegerHayırKural önceliği (minimum: 1, varsayılan: 100). Düşük değer = yüksek öncelik
retryPolicyobjectKoşulluRetry konfigürasyonu. action: 1 (Retry) ise zorunlu
logOnlybooleanHayırtrue ise yalnızca log yazar, akışı etkilemez. Varsayılan: false

errorAction Enum Değerleri

DeğerAdAçıklamaKısıtlar
0Abortİşlemi durdurtransition belirtilmemeli
1RetryYeniden deneretryPolicy zorunlu
2RollbackTelafi state'ine döntransition zorunlu
3IgnoreHatayı yoksay, devam et
4NotifyBildirim gönder ve transition yaptransition zorunlu
5LogYalnızca logla, akışı etkilemez

Retry Policy

AlanTipZorunluVarsayılanAçıklama
maxRetriesintegerHayır3Maksimum yeniden deneme sayısı
initialDelaystringEvetİlk deneme öncesi bekleme süresi (ISO 8601, örn. PT5S)
backoffTypeintegerHayır10 = Fixed, 1 = Exponential
backoffMultipliernumberHayır2.0Exponential backoff çarpanı (minimum: 1)
maxDelaystringHayırDenemeler arası maksimum bekleme süresi (ISO 8601)
useJitterbooleanHayırtrueDeneme gecikmesine rastgele jitter eklenip eklenmeyeceği

Diğer Yapılar

Config (Built-in Function Cache)

attributes.config, flow seviyesi yazar-kontrollü ayarları tek bir obje altında toplar. Şu an tek üyesi, built-in instance function'larının (data, view, schema, …) cache süresini ayarlayan functionCache'dir.

"config": {
"functionCache": {
"ttlSeconds": 120
}
}
AlanTipZorunluVarsayılanAçıklama
functionCache.ttlSecondsintegerHayırHost varsayılanı (60 sn)Bu workflow'un built-in function yanıtları için cache TTL'i (saniye). null veya pozitif olmayan değer host varsayılanına düşer (InstanceFunctionCache:DefaultTtlSeconds)

Çalışma modeli:

  • Built-in function isteği cache'lenir; aynı instance için tekrarlanan istekler TTL boyunca cache'ten döner.
  • Instance değiştiğinde cache düşer ve yeni istek yeniden cache'lenir.
  • State Function bu kapsamın dışındadır — State Function cache'ini platform kendisi yönetir (host tarafındaki StateFunctionCache ayarları); config.functionCache onu etkilemez.

Resource Lock

Transition tanımına eklenen resourceLock bloğu, paylaşılan bir kaynağı (koltuk, günlük limit, hesap vb.) birden fazla instance'ın aynı anda değiştirmesini engelleyen dağıtık kilit mekanizmasıdır (Dapr lock.redis). start, state-level ve sharedTransitions transition'larında geçerlidir ve yalnızca Manual profilde çalışır. Önerilen model, kilidi giriş transition'ında Acquire ile almak ve bırakmayı runtime'a devretmektir (instance terminal olduğunda otomatik release). Tam davranış modeli, keyExpression yazımı, conflict/409 ve örnekler için bkz. Kaynak Kilitleme (Resource Lock).

MasterSchema

attributes.schema alanı, workflow'un instance data ana yapısını belirler. Gelişmiş filtreleme ve instance data'nın her değişim noktasında tutarlılık kontrolü sağlar.

uyarı

Instance data her state'de merge ile genişlediğinden master schema'da required kullanılmamalı ve additionalProperties: true olmalıdır. Alan görünürlüğü (x-roles), filtrelenebilirlik/sıralanabilirlik (x-filterOperators / x-sortable) gibi davranışlar da master şemada tanımlanır. Davranış kuralları, filtering ve view kullanımı için bkz. Schema → Master Schema Davranışı.

Functions ve Extensions

attributes.functions ve attributes.extensions alanları, workflow'a bağlı function ve extension reference listelerini içerir. Her öğe standart reference yapısındadır.

Scripts (Helpers & Allowed Assemblies)

attributes.scripts, flow boyunca geçerli olacak helper referanslarını ve izinli assembly'leri tanımlar. Tek tek mapping objelerine scripts eklemek yerine, tüm flow'da kullanılacak bir helper/assembly burada bir kez bildirilir.

"scripts": {
"helpers": [
{ "key": "rsa-crypto", "version": "1.0.0", "domain": "core", "flow": "sys-mappings" }
],
"allowedAssemblies": ["System.Security.Cryptography"]
}
AlanTipAçıklama
helpersarraysys-mappings bileşenlerine referans (key, version, domain, flow: "sys-mappings")
allowedAssembliesstring[]Script bağlamı için izinli .NET assembly'leri (sandbox allow-list'e eklenir)

Aynı scripts yapısı her mapping objesinde (transition mapping, rule, timer, subflow mapping, task onExecutionTasks[].mapping vb.) de tanımlanabilir. Helper bileşenleri, REF encoding ve sandbox ayrıntıları için bkz. Mapping Bileşeni ve Scripting / Sandbox.

Mapping encoding ve REF

Tüm mapping/scriptCode objelerinde encoding değeri B64, NAT veya REF olabilir. REF ile code, gömülü string yerine bir sys-mappings bileşenine referans objesidir:

"mapping": {
"encoding": "REF",
"code": { "key": "initial-mapping", "version": "1.0.0", "flow": "sys-mappings", "domain": "core" }
}

Ayrıntı için bkz. Mapping Bileşeni → REF Encoding.

Output Mapping

attributes.output, workflow için opsiyonel bir output mapping tanımıdır — sync yanıtları şekillendirir (standart scriptCode yapısı, IOutputHandler implementasyonu). Instance sync=true ile başlatıldığında veya transition edildiğinde, output script'in ürettiği sonuç standart StartInstanceOutput / TransitionOutput zarfı yerine doğrudan HTTP yanıt gövdesi olarak döner — script'in belirlediği statusCode ve headers değerleri ile birlikte. Bu, Function endpoint'lerindeki output davranışının workflow'a taşınmış halidir; flow kendi API sözleşmesini şekillendirebilir.

"attributes": {
"type": "F",
"output": {
"type": "L",
"code": "<base64-encoded IOutputHandler script>",
"encoding": "B64"
}
}

Davranış kuralları:

  • Sadece sync=true isteklerde devreye girer; sync=false yanıtı ({ id, status }) değişmez.
  • Doğrudan yanıt, output script gerçekten çalıştığında uygulanır — script bilinçli olarak boş gövde de dönebilir (kendi status code / header'ları ile).
  • Subflow instance'ları hariçtir: /sub/instances/start ve subflow transition'ları standart modeli korur (parent/child correlation bu modele dayanır).
  • Output script hata alırsa platform hatayı loglar ve standart yanıta geri döner — output mapping isteği asla bozmaz.

Bkz. Async / Sync Yöntemi ve mapping yapısı için Mapping Bileşeni.

Query Roles

attributes.queryRoles yetkilendirme mekanizmasıdır. Workflow ve instance içindeki state'leri kimlerin sorgulayabileceği bilgisini tutar. queryRoles iki seviyede tanımlanabilir: flow (root) seviyesinde ve her state seviyesinde.

Öncelik: Değerlendirmede önce instance'ın mevcut (current) state'inin queryRoles tanımı baz alınır. State'de tanım yoksa flow seviyesindeki queryRoles kullanılır. Yani state tanımı, varsa flow (root) tanımını override eder; yoksa flow tanımına geri düşülür.

AlanTipZorunluAçıklama
rolestringEvetRol adı
grantstringEvetallow veya deny. DENY her zaman ALLOW'u geçersiz kılar

Etki alanı: queryRoles, built-in read fonksiyonları — state, data, view, schema — tarafından instance'ın mevcut (current) state'i üzerinde değerlendirilir. State seviyesi tanımı flow (root) seviyesini override eder; çağıranın sonucu allow değilse fonksiyon 403 döner. Ayrıntı için bkz. Built-in Functions → Read fonksiyonlarında queryRoles authorize ve Yetkilendirme.

İlgili