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č).