Uvod u Flowable

1. Pregled

Tekući je motor poslovnog procesa napisan na Javi. U ovom ćemo uputstvu proći kroz detalje poslovnih procesa i shvatiti kako možemo iskoristiti protočni Java API za stvaranje i implementaciju uzorka poslovnog procesa.

2. Razumijevanje poslovnih procesa

Jednostavno rečeno, Poslovni proces je skup zadataka koji jednom dovršen u definiranom redoslijedu postiže definirani cilj. Svaki zadatak u poslovnom procesu ima jasno definirane ulaze i izlaze. Ovi zadaci mogu zahtijevati ljudsku intervenciju ili mogu biti potpuno automatizirani.

OMG (Object Management Group) definirao je standard pod nazivom Model i oznaka poslovnog procesa (BPMN) za tvrtke da definiraju i komuniciraju svoje procese. BPMN je postao široko podržavan i prihvaćen u industriji. Tekući API u potpunosti podržava stvaranje i primjenu definicija procesa BPMN 2.0.

3. Izrada definicija procesa

Pretpostavimo da imamo jednostavan postupak za pregled članka prije objavljivanja.

Suština ovog postupka je da autori pošalju članak, a urednici ga ili prihvate ili odbiju. Ako se prihvati, članak se objavljuje odmah; međutim, ako je odbijen, autor je obaviješten putem e-pošte:

Definicije procesa izrađujemo kao XML datoteke koristeći BPMN 2.0 XML standard.

Definirajmo naš jednostavan postupak prema BPMN 2.0 standardu:

Sada ovdje postoji popriličan broj elemenata koji su standardne XML stvari, dok su drugi specifični za BPMN 2.0:

  • The cijeli proces je umotan u oznaku nazvanu "proces", što je pak dio oznake koja se naziva "definicije"
  • Proces se sastoji od događaja, tijekova, zadataka i pristupnika
  • Događaj je ili početni ili završni događaj
  • Tok (u ovom primjeru tok slijeda) povezuje ostale elemente poput događaja i zadataka
  • Zadaci su tamo gdje se obavlja stvarni posao; to između ostalog mogu biti "korisnički zadaci" ili "uslužni zadaci"
  • Korisnički zadatak zahtijeva od ljudskog korisnika interakciju s protočnim API-jem i poduzimanje radnji
  • Uslužni zadatak predstavlja automatski zadatak, koji može biti poziv Java klasi ili čak HTTP poziv
  • Pristupnik se izvršava na temelju atributa "odobreno"; ovo je poznato kao procesna varijabla, a kasnije ćemo vidjeti kako ih postaviti

Iako možemo stvoriti datoteke s definicijom procesa u bilo kojem uređivaču teksta, to nije uvijek najprikladniji način. Srećom, Flowable također dolazi s opcijama korisničkog sučelja da to učini pomoću dodatka Eclipse ili web aplikacije. Ako umjesto toga koristite IntelliJ, dostupan je i dodatak IntelliJ.

4. Rad s protočnim API-jem

Sad kad smo definirali naš jednostavan postupak u XML datoteci prema BPMN 2.0 standardu, trebamo način da ga pošaljemo i pokrenemo. Flowable pruža API procesnog mehanizma za interakciju s protočnim motorima. Flowable je vrlo fleksibilan i nudi nekoliko načina za primjenu ovog API-ja.

S obzirom na to da je Flowable Java API, procesni mehanizam možemo uključiti u bilo koji Java program jednostavnim uključivanjem potrebnih JAR datoteka. Možemo vrlo dobro iskoristiti Maven za upravljanje tim ovisnostima.

Štoviše, Flowable dolazi s priloženim API-jevima za interakciju s Flowable putem HTTP-a. Te API-je možemo koristiti da bismo učinili sve što je inače moguće putem protočnog API-ja.

Konačno, Flowable ima izvrsnu podršku za integraciju s Spring i Spring Boot! U našem ćemo uputstvu koristiti integraciju Flowable i Spring Boot.

5. Izrada demo aplikacije s procesnim mehanizmom

Stvorimo sada jednostavnu aplikaciju koja omotava procesni mehanizam iz Flowable-a i nudi API zasnovan na HTTP-u za interakciju s Flowable API-jem. Na vrhu API-ja može postojati web ili mobilna aplikacija koja će poboljšati iskustvo, ali preskočit ćemo za ovo uputstvo.

Izradit ćemo našu demonstraciju kao aplikaciju Spring Boot.

5.1. Ovisnosti

Prvo, pogledajmo ovisnosti koje trebamo povući iz Mavena:

 org.springframework.boot spring-boot-starter-web org.flowable flowable-spring-boot-starter 6.4.1 com.h2database h2 runtime 

Sve ovisnosti koje trebamo dostupne su u Maven Central:

  • Spring Boot Starter za web - ovo je standardni pokretač za Spring Boot
  • Tekući pokretač za proljetne čizme - to je potrebno za proljetne pokretne motore
  • H2 baza podataka - protočna zahtijeva bazu podataka za pohranu podataka, a H2 je zadana baza podataka u memoriji

5.2. Definicija procesa

Kada pokrenemo našu aplikaciju Spring Boot, on pokušava automatski učitati sve definicije procesa prisutne u mapi "resursi / procesi". Stoga, kreirajmo XML datoteku s gore definiranom procesnom definicijom s nazivom "article-workflow.bpmn20.xml" i stavimo je u tu mapu.

5.3. Konfiguracije

Kao što smo svjesni da Spring Boot zauzima vrlo promišljen pristup konfiguraciji aplikacije, to vrijedi i za Flowable kao dio Spring Boot-a. Na primjer, otkrivajući H2 kao jedini pokretač baze podataka na putu predavanja, Flowable ga automatski konfigurira za upotrebu.

Očito je da se svaki aspekt koji se može konfigurirati može konfigurirati na prilagođeni način putem svojstava aplikacije. Međutim, za ovaj se vodič pridržavat ćemo zadanih vrijednosti!

5.4. Java delegati

U našoj definiciji procesa koristili smo nekoliko Java klasa koje bi trebale biti pozvane kao dijelovi servisnih zadataka. Ove klase provode JavaDelegate sučelje i poznati su kao Java delegati u protočnom. Sada ćemo definirati lažne klase za ove Java delegate:

javna klasa PublishArticleService implementira JavaDelegate {javno void izvršenje (izvršavanje DelegateExecution) {System.out.println ("Objavljivanje odobrenog članka."); }}
javna klasa SendMailService implementira JavaDelegate {javno void izvršenje (izvršavanje DelegateExecution) {System.out.println ("Slanje pošte s odbijenicom autoru."); }}

Očito je da ove lažne klase moramo zamijeniti stvarnim uslugama da bismo objavili članak ili poslali e-poštu.

5.5. HTTP API-ji

Na kraju, kreirajmo neke krajnje točke za interakciju s procesnim mehanizmom i rad s procesom koji smo definirali.

Započet ćemo s definiranjem kontrolera koji izlaže tri krajnje točke:

@RestController javna klasa ArticleWorkflowController {@Autowired privatna usluga ArticleWorkflowService; @PostMapping ("/ submit") javna void prijava (članak @RequestBody Article) {service.startProcess (članak); } @GetMapping ("/ zadaci") javni popis getTasks (@RequestParam String asignee) {return service.getTasks (assignee); } @PostMapping ("/ review") javni pregled praznina (odobrenje odobrenja @RequestBody) {service.submitReview (odobrenje); }}

Naš kontrolor izlaže krajnje točke za podnošenje članka na pregled, dohvaćanje popisa članaka za pregled i na kraju za podnošenje pregleda za članak. Članak i Odobrenje su standardni POJO-ovi koji se mogu naći u spremištu.

Zapravo prenosimo većinu posla na ArticleWorkflowService:

@Service javna klasa ArticleWorkflowService {@Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Transational public void startProcess (članak) {Varijable mape = new HashMap (); variables.put ("autor", article.getAuthor ()); variables.put ("url", article.getUrl ()); runtimeService.startProcessInstanceByKey ("articleReview", varijable); } @Transactional public List getTasks (String assignee) {List tasks = taskService.createTaskQuery () .taskCandidateGroup (assignee) .list (); vratiti zadataka.stream () .map (zadatak -> {Mape varijabli = taskService.getVariables (task.getId ()); vratiti novi Article (task.getId (), (String) variables.get ("autor"), ( String) variables.get ("url"));}) .collect (Collectors.toList ()); } @Transactional public void submitReview (odobrenje odobrenja) {Varijable mape = new HashMap (); variables.put ("odobreno", odobrenje.isStatus ()); taskService.complete (odobrenje.getId (), varijable); }}

Sad je većina kodova prilično intuitivna, ali shvatimo istaknute točke:

  • RuntimeService za pokretanje postupka za određenu prijavu
  • TaskService za postavljanje upita i ažuriranje zadataka
  • Omotavanje svih poziva baze podataka u transakcijama koje podržava Spring
  • Pohranjivanje pojedinosti poput autora i URL-a, između ostalog, u a Karta, i spremanje s instancom procesa; to su poznate kao procesne varijable i možemo im pristupiti u okviru definicije procesa, kao što smo vidjeli ranije

Sada smo spremni testirati našu aplikaciju i procesni mehanizam. Jednom kad pokrenemo aplikaciju, možemo je jednostavno koristiti kovrča ili bilo koji REST klijent poput Postmana radi interakcije s krajnjim točkama koje smo stvorili.

6. Procesi jediničnog ispitivanja

Flowable podržava različite verzije JUnit-a, uključujući JUnit 5, za stvaranje jedinstvenih testova za poslovne procese. Tekuća integracija s Springom ima prikladnu podršku i za to. Pogledajmo tipični jedinični test procesa u proljeće:

@ExtendWith (FlowableSpringExtension.class) @ExtendWith (SpringExtension.class) javna klasa ArticleWorkflowUnitTest {@Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Test @Deployment (resources = {"procesi / article-workflow.bpmn20.xml"}) void articleApprovalTest () {Varijable mape = novi HashMap (); variables.put ("autor", "[e-pošta zaštićena]"); varijable.put ("url", "//baeldung.com/dummy"); runtimeService.startProcessInstanceByKey ("articleReview", varijable); Zadatak zadatka = taskService.createTaskQuery (). SingleResult (); assertEquals ("Pregled dostavljenog vodiča", task.getName ()); variables.put ("odobreno", točno); taskService.complete (task.getId (), varijable); assertEquals (0, runtimeService.createProcessInstanceQuery (). count ()); }}

Ovo bi u velikoj mjeri trebalo izgledati kao standardni jedinični test u proljeće, osim nekoliko napomena poput @ Razmještanje. Sada, @ Razmještanje bilješku pruža Flowable za stvaranje i brisanje implementacije procesa oko metoda ispitivanja.

7. Razumijevanje implementacije procesa

Iako u ovom uputstvu nećemo pokriti detalje implementacije procesa, vrijedi pokriti neke aspekte koji su važni.

Tipično, procesi se arhiviraju kao poslovna arhiva (BAR) i raspoređuju u aplikaciji. Tijekom postavljanja, ova se arhiva skenira radi pronalaženja artefakata - poput definicija procesa - i obrađuje. Možda ste primijetili dogovor datoteke definicije procesa koja završava s “.Bpmn20.xml”.

Iako smo u našem tutorialu koristili zadanu in-memory bazu podataka H2, to se zapravo ne može koristiti u stvarnoj aplikaciji, iz jednostavnog razloga što in-memory baza podataka neće zadržati nikakve podatke tijekom pokretanja i praktično je nemoguće koristiti u klaster okruženju! Stoga, moramo koristiti proizvodnu relacijsku bazu podataka i pružiti potrebne konfiguracije u aplikaciji.

Iako sam BPMN 2.0 nema pojma izrade verzija, Flowable stvara atribut verzije za proces koji je postavljen u bazu podataka. Ako se instalira ažurirana verzija istog postupka, identificirana atributom "id", kreira se novi unos s verzijom koja se povećava. Kada pokušavamo započeti proces pomoću "id", procesorski mehanizam dohvaća najnoviju verziju postavljene definicije procesa.

Ako koristimo jednog od dizajnera o kojem smo ranije razgovarali za izradu definicije procesa, već imamo vizualizaciju našeg procesa. Dijagram procesa možemo izvesti kao sliku i postaviti ga uz datoteku definicije XML procesa. Ako se pridržavamo standardne konvencije imenovanja koju je predložio Flowable, ovu će sliku obrađivati ​​procesni mehanizam zajedno sa samim procesom. Štoviše, ovu sliku možemo dohvatiti i putem API-ja!

8. Pregledavanje povijesti instanci procesa

U slučaju poslovnih procesa često je ključno razumjeti što se dogodilo u prošlosti. Ovo će nam možda trebati za jednostavno uklanjanje pogrešaka ili složenu pravnu reviziju.

Tekuće bilježi što se događa tijekom izvršenja procesa i čuva u bazi podataka. Štoviše, Flowable ovu povijest čini dostupnom putem API-ja za upite i analizu. Postoji šest entiteta pod kojima Flowable bilježi ove i HistoryService ima metode da ih sve upita.

Pogledajmo jednostavan upit za dohvaćanje gotovih instanci procesa:

HistoryService historyService = processEngine.getHistoryService (); Popis aktivnosti = historyService .createHistoricActivityInstanceQuery () .processInstanceId (processInstance.getId ()) .finished () .orderByHistoricActivityInstanceEndTime () .asc () .list ();

Kao što vidimo, API za upit snimljenih podataka prilično je složen. U ovom primjeru ispitujemo gotove instance procesa prema ID-u i poredavamo ih uzlaznim redoslijedom prema vremenu završetka.

9. Praćenje procesa

Nadgledanje je ključni aspekt bilo koje kritične tvrtke, a još više za aplikaciju koja rukuje poslovnim procesima organizacije. Flowable ima nekoliko opcija koje nam omogućuju praćenje procesa u stvarnom vremenu.

Flowable pruža određene MBeans kojima možemo pristupiti putem JMX-a, ne samo da bi prikupljao podatke za praćenje, već i obavljao mnoge druge aktivnosti. To možemo integrirati sa bilo kojim standardnim JMX klijentom, uključujući jconsole, koji je prisutan uz standardne Java distribucije.

Korištenje JMX-a za nadzor otvara puno mogućnosti, ali je relativno složeno i dugotrajno. Međutim, budući da koristimo Spring Boot, imamo sreće!

Spring Boot nudi Actuator Endpoints za prikupljanje mjernih podataka aplikacije preko HTTP-a. To možemo besprijekorno integrirati s nizom alata poput Prometheusa i Grafane kako bismo stvorili alat za nadzor proizvodnog razreda uz minimalan napor.

Flowable pruža dodatnu krajnju točku aktuatora izlažući informacije o pokrenutim procesima. Ovo nije tako dobro kao prikupljanje informacija putem JMX-a, ali je brzo, jednostavno i, što je najvažnije, dovoljno.

10. Zaključak

U ovom smo priručniku raspravljali o poslovnim procesima i kako ih definirati u BPMN 2.0 standardu. Zatim smo razgovarali o mogućnostima protočnog procesnog mehanizma i API-ima za postavljanje i izvršavanje procesa. Vidjeli smo kako to integrirati u Java aplikaciju, posebno u Spring Boot.

Nastavljajući dalje, razgovarali smo o drugim važnim aspektima procesa poput njihove primjene, vizualizacije i praćenja. Nepotrebno je reći da smo upravo ogrebali površinu poslovnog procesa i snažnog motora poput Flowablea. Flowable ima vrlo bogat API s dovoljno dostupne dokumentacije. Međutim, ovaj bi tutorial trebao pobuditi naš interes za tu temu!

Kao i uvijek, kod za primjere dostupan je na GitHub-u.


$config[zx-auto] not found$config[zx-overlay] not found