Úvod do Flowable
1. Prehľad
Flowable je nástroj obchodného procesu napísaný v jazyku Java. V tomto tutoriáli si prejdeme podrobnosti obchodných procesov a pochopíme, ako môžeme využiť Flowable Java API na vytvorenie a nasadenie vzorového obchodného procesu.
2. Porozumenie obchodným procesom
Jednoducho povedané, obchodný proces je súbor úloh, ktoré po dokončení v stanovenom poradí dosiahnu stanovený cieľ. Každá úloha v obchodnom procese má jasne definované vstupy a výstupy. Tieto úlohy môžu vyžadovať ľudský zásah alebo môžu byť úplne automatizované.
OMG (Object Management Group) definovala štandard s názvom Business Process Model and Notation (BPMN) pre podniky na definovanie a komunikáciu svojich procesov. BPMN je v priemysle široko podporovaný a akceptovaný. Flowable API plne podporuje vytváranie a nasadenie definícií procesov BPMN 2.0.
3. Vytváranie definícií procesov
Predpokladajme, že máme pred publikovaním jednoduchý proces kontroly článku.
Podstatou tohto procesu je, že autori zadajú článok a redaktori ho buď prijmú, alebo odmietnu. Ak bude prijatý, článok bude publikovaný okamžite; ak je však zamietnutý, autor je informovaný prostredníctvom e-mailu:
Definície procesov vytvárame ako súbory XML pomocou štandardu XML BPMN 2.0.
Definujme náš jednoduchý proces podľa štandardu BPMN 2.0:
Teraz je tu pomerne veľa prvkov, ktoré sú štandardnými vecami XML, zatiaľ čo iné sú špecifické pre BPMN 2.0:
- The celý proces je zabalený do značky s názvom „proces“, ktorá je zase súčasťou značky s názvom „definície“
- Proces pozostáva z udalostí, tokov, úloh a brán
- Udalosť je buď začiatočná udalosť, alebo konečná udalosť
- Tok (v tomto príklade postupnosť tokov) spája ďalšie prvky, ako sú udalosti a úlohy
- Úlohy sú predmetom skutočnej práce; môžu to byť okrem iného „používateľské úlohy“ alebo „servisné úlohy“
- Úloha používateľa vyžaduje, aby ľudský používateľ interagoval s rozhraním Flowable API a prijal príslušné opatrenia
- Servisná úloha predstavuje automatickú úlohu, ktorou môže byť volanie triedy Java alebo dokonca volanie HTTP
- Brána sa vykonáva na základe atribútu „schválené“; toto sa nazýva procesná premenná, a uvidíme, ako ich nastavíme neskôr
Aj keď môžeme vytvárať súbory definícií procesov v ľubovoľnom textovom editore, nie je to vždy najpohodlnejší spôsob. Našťastie však Flowable prichádza s možnosťami používateľského rozhrania, ktoré to umožňujú pomocou doplnku Eclipse alebo webovej aplikácie. Ak namiesto toho používate IntelliJ, je k dispozícii aj doplnok IntelliJ.
4. Práca s Flowable API
Teraz, keď sme definovali náš jednoduchý proces v súbore XML podľa štandardu BPMN 2.0, potrebujeme spôsob, ako ho odoslať a spustiť. Flowable poskytuje API Process Engine na interakciu s Flowable Engines. Flowable je veľmi flexibilný a ponúka niekoľko spôsobov nasadenia tohto API.
Vzhľadom na to, že Flowable je rozhranie Java API, môžeme procesný procesor zahrnúť do akejkoľvek aplikácie Java jednoduchým zahrnutím požadovaných súborov JAR. Maven môžeme veľmi dobre využiť na správu týchto závislostí.
Flowable navyše prichádza s pribalenými API na interakciu s Flowable cez HTTP. Tieto API môžeme použiť na to, aby sme cez Flowable API robili čokoľvek inak možné.
Nakoniec Flowable má vynikajúcu podporu pre integráciu s Spring a Spring Boot! V našom výučbe využijeme integráciu Flowable a Spring Boot.
5. Vytvorenie ukážkovej aplikácie pomocou Process Engine
Poďme si teraz vytvoriť jednoduchú aplikáciu, ktorá zabalí procesný stroj z Flowable a ponúkne API založené na HTTP na interakciu s Flowable API. Na zlepšenie API môže byť na vrchole API aj webová alebo mobilná aplikácia, ale pre tento tutoriál to vynecháme.
Naše demo vytvoríme ako aplikácia Spring Boot.
5.1. Závislosti
Najprv sa pozrime na závislosti, ktoré musíme vytiahnuť z Mavenu:
org.springframework.boot spring-boot-starter-web org.flowable flowable-spring-boot-starter 6.4.1 com.h2database h2 runtime
Závislosti, ktoré požadujeme, sú k dispozícii na serveri Maven Central:
- Spring Boot Starter pre Web - toto je štandardný štartér pre Spring Boot
- Flowable Starter for Spring Boot - je to potrebné pre pružinové bootovacie motory
- H2 Database - Flowable vyžaduje na ukladanie údajov databázu a H2 je predvolená databáza v pamäti
5.2. Definícia procesu
Keď spustíme našu aplikáciu Spring Boot, pokúsi sa automaticky načítať všetky definície procesov, ktoré sú v priečinku „resources / processes“. Vytvorme preto súbor XML s definíciou procesu, ktorú sme vytvorili vyššie, s názvom „article-workflow.bpmn20.xml“, a umiestnime ho do tohto priečinka.
5.3. Konfigurácie
Ako sme si vedomí, že Spring Boot zaujíma k konfigurácii aplikácií vysoko zdatný prístup, platí to aj pre Flowable ako súčasť Spring Boot. Napríklad detekuje H2 ako jediný databázový ovládač na ceste triedy, Flowable ho automaticky nakonfiguruje na použitie.
Je zrejmé, že každý konfigurovateľný aspekt je možné nakonfigurovať vlastným spôsobom prostredníctvom vlastností aplikácie. Pre tento tutoriál sa však budeme držať predvolených nastavení!
5.4. Delegáti Javy
V našej definícii procesu sme použili niekoľko tried Java, ktoré sa majú vyvolať ako súčasť servisných úloh. Tieto triedy implementujú JavaDelegate rozhranie a sú známi ako delegáti Java v aplikácii Flowable. Teraz definujeme fiktívne triedy pre týchto delegátov Javy:
verejná trieda PublishArticleService implementuje JavaDelegate {public void execute (DelegateExecution execution) {System.out.println ("Publikovanie schváleného článku."); }}
verejná trieda SendMailService implementuje JavaDelegate {public void execute (DelegateExecution execution) {System.out.println ("Posielanie odmietacieho mailu autorovi."); }}
Je zrejmé, že ak chceme zverejniť článok alebo poslať e-mail, musíme tieto atrapy nahradiť skutočnými službami.
5.5. HTTP API
Na záver si vytvoríme niektoré koncové body na interakciu s procesorovým mechanizmom a prácu s procesom, ktorý sme definovali.
Začneme definovaním kontrolóra, ktorý odhaľuje tri koncové body:
@RestController verejná trieda ArticleWorkflowController {@Autowired súkromná služba ArticleWorkflowService; @PostMapping ("/ odoslať") public void submit (článok článku @RequestBody) {service.startProcess (článok); } @GetMapping ("/ tasks") public List getTasks (@RequestParam String Assignee) {return service.getTasks (Assignee); } @PostMapping ("/ review") kontrola verejnej neplatnosti (schválenie schválenia @RequestBody) {service.submitReview (schválenie); }}
Náš kontrolór vystavuje koncové body na odoslanie článku na kontrolu, získanie zoznamu článkov na kontrolu a nakoniec na odoslanie kontroly článku. Článok a Schválenie sú štandardné POJO, ktoré nájdete v úložisku.
V skutočnosti delegujeme väčšinu práce na ArticleWorkflowService:
@Service verejná trieda ArticleWorkflowService {@Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Transactional public void startProcess (článok článku) {Mapové premenné = nový HashMap (); variables.put ("autor", article.getAuthor ()); variables.put ("url", article.getUrl ()); runtimeService.startProcessInstanceByKey ("articleReview", premenné); } @Transactional public List getTasks (String Assignee) {List tasks = taskService.createTaskQuery () .taskCandidateGroup (Assignee) .list (); return tasks.stream () .map (task -> {Map variables = taskService.getVariables (task.getId ()); vrátiť nový článok (task.getId (), (String) variables.get ("autor"), ( Reťazec) variables.get ("url"));}) .collect (Collectors.toList ()); } @Transactional public void submitReview (schválenie schválenia) {Premenné mapy = nová HashMap (); variables.put ("schválené", schválenie.isStatus ()); taskService.complete (schválení.getId (), premenné); }}
Teraz je väčšina kódu tu dosť intuitívna, ale poďme pochopiť hlavné body:
- RuntimeService na inštanciu procesu pre konkrétne podanie
- TaskService dopytovať a aktualizovať úlohy
- Zabalenie všetkých databázových hovorov do transakcií podporovaných jarom
- Ukladanie podrobností, ako je autor a adresa URL, okrem iného do a Mapaa ukladanie pomocou inštancie procesu; tieto sú známe ako procesné premenné a môžeme k nim pristupovať v rámci definície procesu, ako sme videli skôr
Teraz sme pripravení vyskúšať náš aplikačný a procesný modul. Po spustení aplikácie môžeme jednoducho použiť zvlnenie alebo akýkoľvek klient REST, ako je Postman, na interakciu s koncovými bodmi, ktoré sme vytvorili.
6. Procesy testovania jednotky
Aplikácia Flowable podporuje rôzne verzie JUnit, vrátane JUnit 5, na vytváranie jednotkových testov pre obchodné procesy. Tekutá integrácia s pružinou má tiež vhodnú podporu. Pozrime sa na typický test jednotky pre proces na jar:
@ExtendWith (FlowableSpringExtension.class) @ExtendWith (SpringExtension.class) verejná trieda ArticleWorkflowUnitTest {@Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Test @Deployment (resources = {"procesy / article-workflow.bpmn20.xml"}) void articleApprovalTest () {premenné mapy = nový HashMap (); variables.put ("autor", "[chránený e-mailom]"); variables.put ("url", "//baeldung.com/dummy"); runtimeService.startProcessInstanceByKey ("articleReview", premenné); Úloha task = taskService.createTaskQuery (). SingleResult (); assertEquals ("Skontrolujte zadaný návod", task.getName ()); variables.put ("schválené", true); taskService.complete (task.getId (), premenné); assertEquals (0, runtimeService.createProcessInstanceQuery (). count ()); }}
To by malo do značnej miery vyzerať ako štandardný test jednotky na jar, okrem niekoľkých anotácií ako @ Nasadenie. Teraz @ Nasadenie anotáciu poskytuje Flowable na vytvorenie a odstránenie nasadenia procesu okolo testovacích metód.
7. Pochopenie nasadenia procesov
Aj keď sa v tomto tutoriále nebudeme venovať podrobnostiam nasadenia procesov, je vhodné venovať sa niektorým dôležitým aspektom.
Typicky procesy sa archivujú ako obchodný archív (BAR) a nasadia sa do aplikácie. Počas nasadenia sa v tomto archíve vyhľadávajú artefakty - ako sú definície procesov - a spracuje sa. Možno ste si všimli konvenciu súboru definície procesu končiaceho na „.Bpmn20.xml“.
Aj keď sme v našom výučbe použili predvolenú databázu H2 v pamäti, v skutočnosti ju nemožno použiť v aplikácii v reálnom svete, a to z jednoduchého dôvodu, že v pamäti si databáza nezachová žiadne údaje pri spustení a je prakticky nemožné v klastrovanom prostredí! Teda musíme použiť produkčnú relačnú databázu a poskytnúť požadované konfigurácie v aplikácii.
Aj keď samotný BPMN 2.0 nemá pojem verzovanie, Flowable vytvorí atribút verzie pre proces, ktorý je nasadený v databáze. Ak je nasadená aktualizovaná verzia rovnakého procesu, ktorá je identifikovaná atribútom „id“, vytvorí sa nový záznam s prírastkovou verziou. Keď sa pokúsime spustiť proces pomocou „id“, procesor procesu načíta najnovšiu verziu nasadenej definície procesu.
Ak na vytvorenie definície procesu použijeme jedného z dizajnérov, o ktorých sme už hovorili, už máme pre náš proces vizualizáciu. Môžeme exportovať diagram procesu ako obrázok a umiestniť ho vedľa definičného súboru procesu XML. Ak sa budeme držať štandardnej konvencie pomenovania, ktorú navrhuje Flowable, bude tento obrázok spracovaný procesorom spolu so samotným procesom. Okrem toho môžeme tento obrázok načítať aj prostredníctvom rozhraní API!
8. História prehľadávania inštancií procesu
V prípade obchodných procesov má často kľúčový význam pochopenie toho, čo sa stalo v minulosti. Možno to budeme potrebovať na účely jednoduchého ladenia alebo zložitých právnych auditov.
Flowable zaznamenáva, čo sa deje počas vykonávania procesu, a uchováva ho v databáze. Flowable navyše sprístupňuje túto históriu prostredníctvom rozhraní API na dopytovanie a analýzu. Existuje šesť entít, pod ktorými Flowable zaznamenáva tieto a Služba histórie má metódy na ich dopytovanie všetkých.
Pozrime sa na jednoduchý dotaz na načítanie hotových inštancií procesu:
HistoryService historyService = processEngine.getHistoryService (); Zoznam aktivít = historyService .createHistoricActivityInstanceQuery () .processInstanceId (processInstance.getId ()) .finished () .orderByHistoricActivityInstanceEndTime () .asc () .list ();
Ako vidíme, API na dopytovanie zaznamenaných údajov je pekne zostaviteľné. V tomto príklade sa dotazujeme na hotové inštancie procesu podľa ID a radíme ich vzostupne podľa času ukončenia.
9. Monitorovacie procesy
Monitorovanie je kľúčovým aspektom každej kritickej podnikovej aplikácie a ešte viac pre aplikáciu, ktorá spracúva obchodné procesy organizácie. Flowable má niekoľko možností, ako nám umožniť monitorovať procesy v reálnom čase.
Flowable poskytuje konkrétne MBean, ku ktorým máme prístup cez JMX, nielen na zhromažďovanie údajov na monitorovanie, ale aj na vykonávanie mnohých ďalších činností. Môžeme to integrovať s akýmkoľvek štandardným klientom JMX, vrátane jconsole, ktorá je k dispozícii popri štandardných distribúciách Java.
Používanie JMX na monitorovanie otvára veľa možností, ale je pomerne zložité a časovo náročné. Pretože však používame Spring Boot, máme šťastie!
Spring Boot ponúka koncové body aktuátora na zhromažďovanie metrík aplikácií cez HTTP. Môžeme to bez problémov integrovať do balíka nástrojov, ako sú Prometheus a Grafana, a s minimálnym úsilím vytvoriť monitorovací nástroj na úrovni výroby.
Flowable poskytuje ďalší koncový bod aktuátora, ktorý odhaľuje informácie o prebiehajúcich procesoch. To nie je také dobré ako zhromažďovanie informácií prostredníctvom JMX, ale je to rýchle, ľahké a hlavne dostatočné.
10. Záver
V tomto tutoriáli sme diskutovali o obchodných procesoch a o tom, ako ich definovať v štandarde BPMN 2.0. Potom sme diskutovali o schopnostiach Flowable process engine a API nasadiť a spustiť procesy. Videli sme, ako to integrovať do aplikácie Java, konkrétne do Spring Boot.
Ďalej sme diskutovali o ďalších dôležitých aspektoch procesov, ako sú ich nasadenie, vizualizácia a monitorovanie. Netreba dodávať, že sme práve poškriabali povrch obchodného procesu a výkonný motor, ako je Flowable. Flowable má veľmi bohaté API s dostatočnou dokumentáciou. Tento tutoriál by však mal vzbudiť náš záujem o túto tému!
Ako vždy, kód príkladov je k dispozícii na GitHub.