Běhové prostředí agend
Při zahájení agendy z libovolné šablony vzniká tzv. instance agendy. Činnost jednotlivých instancí zajišťuje běhové prostředí. Každá instance má přiřazený právě jeden běhový vzor (což je publikovaná verze agendy), podle kterého běží.
V dalším textu se často bude používat zkratka PAJS. PAJS (Process Application JavaScript) je rozšíření klasického JavaScriptu, které umožňuje v rámci agend provádět různé operace s agendou. PAJS je možné používat pouze v rámci agend. V dotaznících a formulářových podáních dostupný není. |
Běhový vzor
Běhový vzor obsahuje tři typy elementů:
-
Graf, který obsahuje společné vlastnosti dostupné všem prvkům a hranám obsaženým v tomto workflow.
V běhovém vzoru smí být právě jeden graf, jejich zanoření se nedovoluje.
-
Prvky, které definují činnosti, které má běhové prostředí vykonávat.
V některých prvcích se činnost běhového prostředí může přerušit (například u prvků typu uživatelský úkol či časovač).
Speciálním případem prvku jsou události prvku (boundary event):
-
Ty nedefinují žádnou práci, ale pouze podmínky, kdy se mají vykonat.
-
Dělí se na přerušující (přeruší zpracování prvku a běh pokračuje z prvku události) a nepřerušující (dále se čeká na zpracování prvku, ale běh nezávisle na tom pokračuje i z prvku události).
-
-
Hrany – spojují jednotlivé prvky a nedefinují žádnou činnost; běhové prostředí se na nich tedy nemůže nikdy zastavit.
Mohou definovat podmínku, za které je průchod touto hranou dovolen (pokud je podmínka v PAJS, měla by obsahovat pouze rozhodnutí, ale žádný výkonný kód).
Při běhu instance používá běhové prostředí token.
Token tedy vzniká v rámci instance agendy po jejím spuštění. Lze si ho představit jako určitou datovou strukturu, určující, ve kterém prvku (uzlu) diagramu (workflow) se agenda nachází a nesoucí v sobě informace o hodnotách proměnných. Informace o průchodu tokenů běhovým vzorem je ukládána do FlowInfo. |
FlowInfo je pole JSON objektů, zaznamenávající údaje o průchodu agendy jednotlivými prvky. |
Token v sobě mimo jiné obsahuje informaci, v jakém prvku se nachází; jeho stav je popsán čtveřicí logických hodnot (truIe / false):
-
AwaitingMove – token je připraven ke zpracování běhovým prostředím.
-
Finished – token již dokončil všechnu práci (doběhl do koncového prvku nebo doběhl do prvku, kde vzniklo více jeho následovníků a tento token dále nepokračuje).
-
Cancelled – token byl zrušen (zrušení instance z GUI/administrace).
-
Failed – při běhu tokenu došlo k chybě (identifikace chyby je uložena u tokenu).
Na běhové prostředí dohlíží plánovač, který zajišťuje spouštění běhového prostředí pro tokeny, které jsou ve stavu:
-
AwaitingMove = true
-
Finished = false
-
Cancelled = false
-
Failed = false.
Jedna instance běhového prostředí vždy zpracovává v danou chvíli právě jeden token. V systému ale může v jednu chvíli běžet více instancí běhového prostředí pro různé tokeny, a to i v rámci jedné instance procesu. |
Cyklus práce běhového prostředí
Běhové prostředí pracuje v následujícím cyklu:
Zpracování prvku, které se skládá z těchto bodů:
-
Naplánování událostí (boundary event).
-
Předzpracování prvku, které je specifické podle typu prvku.
-
Vstup do prvku zahrnuje zpracování výchozího GraphQL dotazu (pokud je nastaven), zpracování PAJS main funkce (pokud je nastavena), nastavení stavu procesu (pokud je nastaven) a nastavení popisu procesu (pokud je nastaven).
-
Práce prvku, tedy vykonání vlastní činnosti podle typu prvku.
-
Aktivace událostí (boundary event).
-
Výstup z prvku skládající se z nastavení popisu procesu (pokud je nastaven) a výstupní činnosti specifické pro prvek.
Vyhodnocení výstupních hran, pro které platí:
-
Výstupních hran může být i více – a to kombinace sekvenčních, podmíněných i výchozích hran.
-
Pokud je vyhodnocena právě jedna hrana, je token přesunut na vstup do prvku na konci této hrany.
-
Pokud je vyhodnoceno více hran, je pro každou z nich vytvořen nový token, který je postaven na výstup z prvku (má nastaveno AwaitingMove=true + kterou hranou má z prvku odejít), přičemž stávající token ukončí svou činnost (má nastaveno AwaitingMove=false, Finished=true).
U některých prvků může dojít k přerušení práce (prvek nastaví tokenu AwaitingMove=false). To může prvek provést ve fázi předzpracování prvku (běh se zastaví hned po této fázi) nebo ve fázi práce prvku (běh se zastaví po aktivaci událostí). Pokud je současně tokenu nastaveno i Finished=true, je práce tokenu v tomto prvku ukončena.
V obou těchto fázích zpracování prvku mohou vznikat i nové tokeny. Nově vzniklé tokeny mají jako rodičovský nastaven aktuální token, pokud není určeno jinak. Pokud dojde v jakékoliv fázi k chybě, je další zpracování přerušeno, aktuálnímu tokenu nastaveno Failed=true a do FailedMessage je uložena chybová zpráva.
Přijímání zpráv
Přijímání zpráv je postaveno mimo běhové prostředí. Zaslaná zpráva obsahuje informaci o příjemci (identifikátor předpisu agendy nebo běžící instance) a případně další data (globální proměnné, data zprávy).
Přijetí zprávy probíhá následovně:
-
Jde-li o zprávy zasílané instanci:
-
Je nalezena odpovídající instance a její běhový vzor.
-
V běhovém vzoru je vyhledán prvek přijímající danou zprávu.
-
Pokud v prvku stojí token, je vybrán právě tento token (pokud v prvku stojí více tokenů, je vybrán ten, který do prvku vstoupil první). Proces pokračuje obecnou částí.
-
-
Jde o zprávy zasílané agendě:
-
Je nalezen poslední publikovaný (nejnovější) běhový vzor agendy.
-
V tomto vzoru je nalezen prvek Zahájení agendy zprávou pro přijetí odpovídající zprávy (případně prvek Zahájení agendy pro přijetí specifické zprávy při spuštění agendy z gridu Zadat).
-
Je vytvořena nová instance a v ní nový token, který je umístěn do nalezeného prvku.
-
Jsou nastaveny globální proměnné ze zprávy.
-
Proces pokračuje obecnou částí.
-
-
Obecná část platná pro zprávy zasílané instanci i agendě:
-
Data se zpracují PAJS funkcí Zpracování přijatých dat (pokud je nastavena).
-
Token je nastaven ke zpracování běhovým prostředím (AwaitingMove=true).
-
Pokud má token běžet ihned, je běhové prostředí inicializováno a spuštěno bezprostředně (nečeká se na plánovač).
-