Sprievodca po Activiti pomocou Javy

1. Prehľad

Activiti API je pracovný tok a systém riadenia podnikových procesov. Môžeme v ňom definovať proces, vykonať ho a rôznymi spôsobmi s ním manipulovať pomocou služieb poskytovaných API. Vyžaduje JDK 7+.

Vývoj pomocou API je možné vykonať v akomkoľvek IDE, ale na použitie produktu Activiti Designer potrebujeme Eclipse.

Môžeme v ňom definovať proces pomocou štandardu BPMN 2.0. Existuje iný, menej populárny spôsob - používanie tried Java, ako je StartEvent, EndEvent, UserTask, SequenceFlow, atď.

Ak chceme spustiť proces alebo získať prístup k niektorej zo služieb, musíme vytvoriť a ProcessEngineConfiguration.

Môžeme dostať ProcessEngine použitím ProcessEngineConfiguration, v niektorých ohľadoch, o ktorých si ďalej povieme v tomto článku. Skrzthe ProcessEngine môžeme vykonávať operácie Workflow a BPMN.

2. Maven závislosti

Aby sme mohli používať toto API, musíme zahrnúť závislosť Activiti:

 org.activiti activiti-engine 

3. Vytvorenie a ProcessEngine

ProcessEngine v Activiti sa zvyčajne konfiguruje pomocou súboru XML, activiti.cfg.xml. Príklad tohto konfiguračného súboru je:

Teraz môžeme získať ProcessEngine pomocou ProcessEngines trieda:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine ();

Toto vyhlásenie bude hľadať activiti.cfg.xml súbor v ceste triedy a zostrojte a ProcessEngine na základe konfigurácie v súbore.

Vzorový kód konfiguračného súboru ukazuje, že ide iba o jarnú konfiguráciu. To však neznamená, že Activiti môžeme používať iba v jarnom prostredí. Schopnosti jari sa práve interne používajú na vytvorenie ProcessEngine.

Poďme napísať testovací prípad JUnit, ktorý vytvorí ProcessEngine pomocou vyššie uvedeného konfiguračného súboru:

@ Test public void givenXMLConfig_whenGetDefault_thenGotProcessEngine () {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine (); assertNotNull (processEngine); assertEquals ("root", processEngine.getProcessEngineConfiguration () .getJdbcUsername ()); } 

4. Activiti Process Engine API a služby

Vstupným bodom interakcie s API je ProcessEngine. Cez ProcessEngine, môžeme pristupovať k rôznym službám, ktoré poskytujú metódy pracovného toku / BPMN. The ProcessEngine a všetky servisné objekty sú chránené vláknami.

Prevzaté z //www.activiti.org/userguide/images/api.services.png

The ProcessEngines trieda vyhľadá activiti.cfg.xml a activiti-context.xml súbory. Ako už bolo spomenuté vyššie, pre všetky activiti.cfg.xml súbory, ProcessEngine sa vytvorí typickým spôsobom.

Keďže pre všetky activiti-context.xml súbory, bude to vytvorené jarným spôsobom - vytvorím Spring Application Context a získam ProcessEngine odtiaľto. Počas vykonávania procesu budú všetky kroky navštívené v poradí, ktoré je definované v súbore BPMN.

Počas vykonávania procesu budú všetky kroky navštívené v poradí, ktoré je definované v súbore BPMN.

4.1. Definícia procesu a súvisiace pojmy

A ProcessDefinition predstavuje obchodný proces. Používa sa na definovanie štruktúry a správania rôznych krokov v procese. Nasadenie definície procesu znamená načítanie definície procesu do databázy Activiti.

Definície procesov sú väčšinou definované štandardom BPMN 2.0. Je tiež možné ich definovať pomocou kódu Java. Všetky pojmy definované v tejto časti sú k dispozícii aj ako triedy Java.

Hneď ako spustíme definíciu procesu, možno ju označiť ako proces

A ProcessInstance je jedna exekúcia a ProcessDefinition.

A StartEvent je spojená s každým obchodným procesom. Označuje vstupný bod procesu. Podobne existuje EndEvent čo naznačuje koniec procesu. Môžeme definovať podmienky týkajúce sa týchto udalostí.

Všetky kroky (alebo prvky) medzi začiatkom a koncom sa označujú ako Úlohy. Úlohy môžu byť rôzneho typu. Najčastejšie používané úlohy sú UserTasks a Servisné úlohy.

UserTasks, ako už názov napovedá, sú také, že ich užívateľ musí vykonať manuálne.

Servisné úlohy, na druhej strane, sú konfigurované s časťou kódu. Kedykoľvek sa k nim prevedenie dostane, vykoná sa ich blok kódu.

SequenceFlows pripojte Úlohy. Môžeme definovať SequenceFlows zdrojovými a cieľovými prvkami, ktoré spoja. Opäť môžeme tiež definovať podmienky nad SequenceFlows vytvoriť v procese podmienené cesty.

4.2. Služby

Stručne prediskutujeme služby poskytované spoločnosťou Activiti:

  • RepositoryService pomáha nám manipulovať s nasadením definícií procesov. Táto služba sa zaoberá statickými údajmi súvisiacimi s definíciou procesu
  • RuntimeService spravuje Procesné látky (v súčasnosti prebiehajúce procesy), ako aj procesné premenné
  • TaskService sleduje UserTasks. The Úlohy ktoré musí používateľ vykonať manuálne, sú jadrom API Activiti. Pomocou tejto služby môžeme vytvoriť úlohu, nárokovať si a dokončiť úlohu, manipulovať s postupníkom úlohy atď
  • FormService je voliteľná služba. API je možné používať aj bez neho a bez obetovania akýchkoľvek jeho funkcií. Používa sa na definovanie počiatočného formulára a formulára úlohy v procese.
  • IdentityService spravuje Používatelia a Skupiny
  • Služba histórie sleduje históriu Activiti Engine. Môžeme tiež nastaviť rôzne úrovne histórie.
  • ManagementService súvisí s metadátami a zvyčajne sa nevyžaduje pri vytváraní aplikácie
  • DynamicBpmnService pomáha nám zmeniť čokoľvek v procese bez jeho opätovného nasadenia

5. Práca so službami Activiti

Ak sa chceme dozvedieť, ako môžeme pracovať s rôznymi službami a spustiť proces, vezmime si príklad postupu pre „Žiadosť o dovolenku zamestnanca“:

Súbor BPMN 2.0, VacationRequest.bpmn20.xml, pre tento proces bude mať počiatočná udalosť definovaná ako:

Podobne bude prvá používateľská úloha priradená k skupine používateľov „správa“ vyzerať takto:

 $ {employeeName} by si chcel vziať $ {numberOfDays} deň (dní) na dovolenku (Motivácia: $ {reason}). zvládanie 

Vďaka ServiceTask, musíme definovať časť kódu, ktorá sa má vykonať. Tento kúsok kódu máme ako trieda Java:

Podmienený tok bude zobrazený pridaním „ConditionExpression“ značka v „SequenceFlow“:

Tu, dovolenka Schválené je formProperty z UserTask zobrazené vyššie.

Ako vidíme na diagrame, je to veľmi jednoduchý proces. Zamestnanec podá žiadosť o dovolenku, v ktorej uvedie počet dní a dátum začiatku dovolenky. Žiadosť ide pre manažéra. Môžu žiadosť schváliť / zamietnuť.

Ak bude schválená, je tu definovaná servisná úloha na odoslanie potvrdzovacieho emailu. Ak bude zamestnanec zamietnutý, môže sa rozhodnúť, že požiadavku upraví a znovu odošle, alebo neurobí nič.

Servisné úlohy sú vybavené časťou kódu na vykonanie (tu ako trieda Java). Dali sme triedu SendEmailServiceTask.java.

Tieto typy tried by mali rozširovať JavaDelegate. Musíme tiež prepísať jeho vykonať () metóda, ktorá sa vykoná, keď vykonanie procesu dosiahne tento krok.

5.1. Nasadenie procesu

Aby sme náš proces oznámili Activiti Engine, musíme ho nasadiť. Môžeme to urobiť programovo pomocou RepositoryService. Napíšme test JUnit, ktorý to ukáže:

@Test public void givenBPMN_whenDeployProcess_thenDeployed () {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine (); RepositoryService repositoryService = processEngine.getRepositoryService (); repositoryService.createDeployment () .addClasspathResource ("org / activiti / test / vacationRequest.bpmn20.xml") .deploy (); Dlhý počet = repositoryService.createProcessDefinitionQuery (). Count (); assertEquals ("1", count.toString ()); }

Nasadenie znamená, že motor analyzuje súbor BPMN a prevedie ho na niečo spustiteľné. Pre každé nasadenie bude do tabuľky úložiska tiež pridaný záznam.

Preto potom môžeme dopytovať Úložisko služba na získanie nasadených procesov; the ProcessDefinitions.

5.2. Počnúc a ProcessInstance

Po nasadení ProcessDefinition pre Activiti Engine, môžeme tento proces vykonať vytvorením Procesné látky. The ProcessDefinition je plán a ProcessInstance je jeho runtime vykonanie.

Za slobodna ProcessDefinition, môže ich byť viac Procesné látky.

Všetky podrobnosti týkajúce sa Procesné látky je prístupný cez internet RuntimeService.

V našom príklade musíme na udalosti začiatku zadať počet dní dovolenky, dátum začatia a dôvod. Použijeme procesné premenné a odovzdáme ich pri vytváraní ProcessInstance.

Napíšeme testovací prípad JUnit, aby sme získali lepšiu predstavu:

@Test public void givenDeployedProcess_whenStartProcessInstance_thenRunning () {// nasadiť definíciu procesu Premenné mapy = nová HashMap> (); variables.put ("employeeName", "John"); variables.put ("numberOfDays", 4); variables.put ("vacationMotivation", "Potrebujem prestávku!"); RuntimeService runtimeService = processEngine.getRuntimeService (); ProcessInstance processInstance = runtimeService .startProcessInstanceByKey ("vacationRequest", premenné); Dlhý počet = runtimeService.createProcessInstanceQuery (). Count (); assertEquals ("1", count.toString ()); }

Viaceré inštancie jednej definície procesu sa budú líšiť podľa procesných premenných.

Existuje niekoľko spôsobov, ako spustiť inštanciu procesu. Tu používame kľúč procesu. Po spustení inštancie procesu môžeme získať o nej informácie dotazom RuntimeService.

5.3. Dokončenie úloh

Keď sa spustí naša inštancia procesu, prvým krokom je úloha používateľa, ktorá je priradená k skupine používateľov "zvládanie".

Používateľ môže mať priečinok doručenej pošty, ktorý by obsahoval zoznam úloh, ktoré majú vykonať. Teraz, ak chceme pokračovať vo vykonávaní procesu, musí užívateľ túto úlohu dokončiť. Pre Activiti Engine sa to volá „dokončenie úlohy“.

Môžeme sa spýtať na TaskService, získať objekt úlohy a potom ju dokončiť.

Kód, ktorý pre to musíme napísať, vyzerá takto:

@Test public void givenProcessInstance_whenCompleteTask_thenGotNextTask () {// nasadiť proces a spustiť inštanciu procesu TaskService taskService = processEngine.getTaskService (); Zoznam úloh = taskService.createTaskQuery () .taskCandidateGroup ("management"). List (); Úloha task = tasks.get (0); Map taskVariables = new HashMap (); taskVariables.put ("vacationApproved", "false"); taskVariables.put ("komentáre", "Máme stanovený termín!"); taskService.complete (task.getId (), taskVariables); Úloha currentTask = taskService.createTaskQuery () .taskName ("Upraviť požiadavku na dovolenku"). SingleResult (); assertNotNull (currentTask); }

Všimnite si, že kompletný () metóda TaskService tiež prijíma požadované procesné premenné. Odovzdávame odpoveď od manažéra.

Potom bude procesný motor pokračovať k ďalšiemu kroku. V ďalšom kroku sa zamestnanec opýta, či má byť žiadosť o dovolenku opätovne odoslaná alebo nie.

Takže náš ProcessInstance teraz na to čaká UserTask, ktorý má meno „Upraviť dovolenku žiadosť “.

5.4. Pozastavenie a aktivácia procesu

Môžeme pozastaviť a ProcessDefinition a tiež a ProcessInstance. Ak pozastavíme a ProcessDefinition, nemôžeme vytvoriť inštanciu, ktorá je pozastavená. Môžeme to urobiť pomocou RepositoryService:

@Test (očakáva sa = ActivitiException.class) public void givenDeployedProcess_whenSuspend_thenNoProcessInstance () {// nasadiť definíciu procesu repositoryService.suspendProcessDefinitionByKey ("vacationRequest"); runtimeService.startProcessInstanceByKey ("vacationRequest"); } 

Ak ju chcete znova aktivovať, stačí zavolať niektorému z používateľov repositoryService.activateProcessDefinitionXXX metódy.

Podobne môžeme pozastaviť a ProcessInstance, pomocou RuntimeService.

6. Záver

V tomto článku sme videli, ako by sme mohli používať Activiti s Javou. Vytvorili sme ukážku ProcessEngineCofiguration súbor, ktorý nám pomáha vytvoriť súbor ProcessEngine.

Pomocou neho sme pristupovali k rôznym službám poskytovaným API. Tieto služby nám pomáhajú spravovať a sledovať ich ProcessDefinitions, Procesné látky, UserTasks, atď.

Ako vždy, kód príkladov, ktorý sme videli v článku, leží na GitHub.


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