Úvod do Activiti s jarou
1. Prehľad
Jednoducho povedané, Activiti je platforma pre pracovný tok a riadenie podnikových procesov.
Môžeme začať rýchlo vytvorením a ProcessEngineConfiguration (zvyčajne založené na konfiguračnom súbore). Z toho môžeme získať a ProcessEngine - a prostredníctvom ProcessEngine, môžeme vykonávať operácie pracovného toku a BPM.
API poskytuje rôzne služby, ktoré možno použiť na prístup a správu procesov. Tieto služby nám môžu poskytnúť informácie o histórii procesov, o tom, čo momentálne beží, a o procesoch, ktoré sú nasadené, ale ešte nie sú spustené.
Služby možno tiež použiť na definovanie štruktúry procesu a manipuláciu so stavom procesu, t. J. Spustenie, pozastavenie, zrušenie atď.
Ak ste v rozhraní API nováčikom, pozrite si naše Úvod do rozhrania Activiti API s jazykom Java. V tomto článku si ukážeme, ako môžeme nastaviť Activiti API v rámci aplikácie Spring Boot.
2. Nastavenie pomocou Spring Boot
Pozrime sa, ako môžeme Activiti nastaviť ako aplikáciu Spring Boot Maven a začať ju používať.
2.1. Pôvodné nastavenie
Ako obvykle, musíme pridať závislosť maven:
org.activiti activiti-spring-boot-starter-basic
Najnovšiu stabilnú verziu API nájdete tu. Funguje s Spring Boot až v1.5.4. S v2.0.0.M1 to zatiaľ nefunguje.
Môžeme tiež vygenerovať projekt Spring Boot pomocou //start.spring.io a ako závislosť zvoliť Activiti.
Iba pridaním tejto závislosti a @EnableAutoConfiguration anotácie k aplikácii Spring Boot, vykoná sa počiatočné nastavenie:
- Vytvoriť zdroj údajov (API vyžaduje na vytvorenie databázy databázu ProcessEngine)
- Vytvorte a vystavte ProcessEngine fazuľa
- Vytvorte a vystavte fazuľa služieb Activiti
- Vytvorte vykonávateľa jarnej práce
2.2. Vytvorenie a spustenie procesu
Vytvorme si príklad vytvorenia a spustenia obchodného procesu.
Na definovanie procesu budeme musieť vytvoriť súbor BPMN. Na tento účel môžeme použiť //activiti.alfresco.com/activiti-app/editor na vytvorenie definície procesu.
Potom si stačí stiahnuť súbor BPMN. Budeme musieť vložiť tento súbor do src / main / resources / procesy priečinok. V predvolenom nastavení bude Spring Boot hľadať v tomto priečinku, aby nasadil definíciu procesu.
Vytvoríme ukážkový proces obsahujúci jednu úlohu používateľa:
Postupca používateľskej úlohy je nastavený ako iniciátor procesu. Súbor BPMN pre túto definíciu procesu vyzerá takto:
Teraz vytvoríme radič REST na vybavenie žiadostí o začatie tohto procesu:
@Autowired private RuntimeService runtimeService; @GetMapping ("/ start-process") public String startProcess () {runtimeService.startProcessInstanceByKey ("my-process"); návrat "Proces spustený. Počet momentálne spustených" + "inštancií procesu =" + runtimeService.createProcessInstanceQuery (). count (); }
Tu, runtimeService.startProcessInstanceByKey („môj proces“) zaháji vykonávanie procesu, ktorého kľúč je „Môj proces“. runtimeService.createProcessInstanceQuery (). count () získate počet inštancií procesu.
Zakaždým, keď sme narazili na cestu „/ Štart-proces“, nový ProcessInstance sa vytvorí a uvidíme prírastok v počte aktuálne spustených procesov.
Testovací prípad JUnit nám ukazuje toto správanie:
@Test public void givenProcess_whenStartProcess_thenIncreaseInProcessInstanceCount () vyvolá výnimku {String responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn (). GetResponse (). GetContentAs assertEquals ("Proces spustený. Počet momentálne spustených" + "inštancií procesu = 1", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn (). getResponse (). getContentAsString (); assertEquals ("Proces spustený. Počet momentálne spustených" + "inštancií procesu = 2", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn (). getResponse (). getContentAsString (); assertEquals ("Proces spustený. Počet momentálne spustených" + "inštancií procesu = 3", responseBody); }
3. Hra s procesmi
Teraz, keď máme v Activiti spustený proces využívajúci Spring Boot, rozšírime vyššie uvedený príklad a ukážeme, ako môžeme k procesu pristupovať a manipulovať s ním.
3.1. Získajte zoznam Úlohy za dané ProcessInstance
Máme dve používateľské úlohy A a B. Keď začneme proces, bude čakať na prvú úlohu A dokončí a potom vykoná úlohu B. Vytvorme metódu obsluhy, ktorá prijíma požiadavky na zobrazenie úloh súvisiacich s daným processInstance.
Predmety, ako Úloha, nemožno poslať ako odpoveď priamo, a preto musíme vytvoriť vlastný objekt a konvertovať Úloha k nášmu vlastnému objektu. Zavoláme túto triedu Reprezentácia úloh:
trieda TaskRepresentation {private String id; súkromné meno reťazca; private String processInstanceId; // štandardné konštruktory}
Metóda obsluhy bude vyzerať takto:
@GetMapping ("/ get-tasks / {processInstanceId}") verejný zoznam getTasks (@PathVariable String processInstanceId) {List usertasks = taskService.createTaskQuery () .processInstanceId (processInstanceId) .list (); vrátiť usertasks.stream () .map (task -> new TaskRepresentation (task.getId (), task.getName (), task.getProcessInstanceId ())) .collect (Collectors.toList ()); }
Tu, taskService.createTaskQuery (). processInstanceId (processInstanceId) .list () používa TaskService a dostane nám zoznam úloh súvisiacich s daným processInstanceId. Vidíme, že keď začneme proces, ktorý sme vytvorili, úlohu dostaneme A zadaním požiadavky na metódu, ktorú sme práve definovali:
@Test public void givenProcess_whenProcessInstance_thenReceivedRunningTask () vyvolá výnimku {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .list () .get (0); Reťazec responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ get-tasks /" + pi.getId ())) .andReturn () .getResponse () .getContentAsString (); ObjectMapper mapovač = nový ObjectMapper (); Zoznam úloh = Arrays.asList (mapper .readValue (responseBody, TaskRepresentation []. Trieda)); assertEquals (1, tasks.size ()); assertEquals ("A", tasks.get (0) .getName ()); }
3.2. Dokončenie a Úloha
Teraz uvidíme, čo sa stane, keď splníme úlohu A. Vytvoríme metódu obsluhy, ktorá bude vybavovať požiadavky na dokončenie úlohy A za dané processInstance:
@GetMapping ("/ complete-task-A / {processInstanceId}") public void completeTaskA (@PathVariable String processInstanceId) {Task task = taskService.createTaskQuery () .processInstanceId (processInstanceId) .singleResult (); taskService.complete (task.getId ()); }
taskService.createTaskQuery (). processInstanceId (processInstanceId) .singleResult () vytvorí dotaz na službu úloh a zadá nám úlohu danej úlohy processInstance. To je UserTask A. Ďalší riadok taskService.complete (task.getId) dokončí túto úlohu.
Preto teraz proces dosiahol koniec a RuntimeService neobsahuje ziadne Procesné látky. Môžeme to vidieť pomocou testovacieho prípadu JUnit:
@Test public void givenProcess_whenCompleteTaskA_thenNoProcessInstance () vyvolá výnimku {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .list () .get (0); this.mockMvc.perform (MockMvcRequestBuilders.get ("/ complete-task-A /" + pi.getId ())) .andReturn () .getResponse () .getContentAsString (); Zoznam zoznam = runtimeService.createProcessInstanceQuery (). List (); assertEquals (0, list.size ()); }
Takto môžeme využívať služby Activiti pracujúce s procesmi.
4. Záver
V tomto článku sme si prešli prehľadom používania rozhrania Activiti API s Spring Boot. Viac informácií o API nájdete v užívateľskej príručke. Tiež sme videli, ako vytvoriť proces a vykonať na ňom rôzne operácie pomocou služieb Activiti.
Spring Boot je jednoduché použitie, pretože sa nemusíme starať o vytvorenie databázy, nasadenie procesov alebo vytvorenie ProcessEngine.
Majte na pamäti, že integrácia Activiti s Spring Boot je stále v experimentálnej fáze a zatiaľ ju Spring Boot 2 nepodporuje.
Ako vždy, implementáciu všetkých príkladov, ktoré sme videli, nájdete na GitHub.