Ú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.


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