Vodič za Activiti s Javom

1. Pregled

Activiti API je sustav rada i upravljanja poslovnim procesima. U njemu možemo definirati proces, izvršiti ga i manipulirati na različite načine koristeći usluge koje pruža API. Potreban je JDK 7+.

Razvoj pomoću API-ja može se izvesti u bilo kojem IDE-u, ali za upotrebu Activiti Designera potreban nam je Eclipse.

Proces u njemu možemo definirati pomoću BPMN 2.0 standarda. Postoji još jedan, manje popularan način - korištenje Java klasa poput StartEvent, EndEvent, UserTask, Slijed Protokitd.

Ako želimo pokrenuti postupak ili pristupiti bilo kojoj od usluga, moramo stvoriti ProcessEngineConfiguration.

Možemo dobiti ProcessEngine koristeći ProcessEngineConfiguration, na neki način, o čemu ćemo dalje raspravljati u ovom članku. Krozthe ProcessEngine možemo izvoditi operacije tijeka posla i BPMN.

2. Ovisnosti Mavena

Da bismo koristili ovaj API, moramo uključiti ovisnost Activiti:

 org.activiti activiti-engine 

3. Stvaranje a ProcessEngine

ProcessEngine u programu Activiti, obično se konfigurira pomoću XML datoteke, activiti.cfg.xml. Primjer ove konfiguracijske datoteke je:

Sada možemo dobiti ProcessEngine koristiti ProcessEngines razred:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine ();

Ova će izjava tražiti activiti.cfg.xml datoteku u stazi razreda i konstruirajte ProcessEngine na temelju konfiguracije u datoteci.

Uzorak koda za konfiguracijsku datoteku pokazuje da je to samo proljetna konfiguracija. Ali, to ne znači da Activiti možemo koristiti samo u proljetnom okruženju. Mogućnosti Springa samo se interno koriste za stvaranje ProcessEngine.

Napišimo JUnit test koji će stvoriti ProcessEngine pomoću gore prikazane konfiguracijske datoteke:

@Test javna praznina danaXMLConfig_whenGetDefault_thenGotProcessEngine () {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine (); assertNotNull (processEngine); assertEquals ("root", processEngine.getProcessEngineConfiguration () .getJdbcUsername ()); } 

4. API i usluge Activiti Process Engine

Ulazna točka interakcije s API-jem je ProcessEngine. Kroz ProcessEngine, možemo pristupiti raznim uslugama koje pružaju metode tijeka posla / BPMN. The ProcessEngine a svi su uslužni objekti zaštićeni nitima.

Preuzeto s //www.activiti.org/userguide/images/api.services.png

The ProcessEngines klasa će pretražiti activiti.cfg.xml i activiti-context.xml datoteke. Kao što je ranije spomenuto, za sve activiti.cfg.xml datoteke, ProcessEngine stvorit će se na tipičan način.

Dok, za sve activiti-context.xml datoteke, stvorit će se na proljetni način - stvorit ću kontekst proljetne aplikacije i dobit ću ProcessEngine iz toga. Tijekom izvršavanja postupka, svi koraci će se posjetiti redoslijedom definiranim u BPMN datoteci.

Tijekom izvršavanja postupka, svi koraci će se posjetiti redoslijedom definiranim u BPMN datoteci.

4.1. Definicija procesa i srodni pojmovi

A Definicija procesa predstavlja poslovni proces. Koristi se za definiranje strukture i ponašanja različitih koraka u procesu. Razmještanje definicije procesa znači učitavanje definicije procesa u bazu podataka Activiti.

Definicije procesa uglavnom su definirane standardom BPMN 2.0. Također ih je moguće definirati pomoću Java koda. Svi pojmovi definirani u ovom odjeljku dostupni su i kao Java klase.

Jednom kad započnemo izvoditi definiciju procesa, ona se može nazvati procesom

A ProcessInstance je jedno izvršenje a Definicija procesa.

A StartEvent povezan je sa svakim poslovnim procesom. Označava ulaznu točku procesa. Slično tome, postoji EndEvent što ukazuje na kraj postupka. Možemo definirati uvjete nad tim događajima.

Svi koraci (ili elementi) između početka i kraja nazivaju se Zadaci. Zadaci mogu biti raznih vrsta. Najčešće korišteni zadaci su Korisničke zadatke i Uslužne zadatke.

Korisničke zadatke, kao što i samo ime govori, takvi su da ih korisnik treba provesti ručno.

Uslužne zadatke, s druge strane, konfigurirani su s dijelom koda. Kad god izvršenje stigne do njih, izvršit će se njihov blok koda.

Slijed Protok spojiti Zadaci. Možemo definirati Slijed Protok izvornim i ciljnim elementima koje će povezati. Opet, možemo definirati i uvjete preko Slijed Protok za stvaranje uvjetnih putova u procesu.

4.2. Usluge

Ukratko ćemo razmotriti usluge koje pruža Activiti:

  • RepositoryService pomaže nam u manipuliranju postavljanjem definicija procesa. Ova se usluga bavi statičkim podacima povezanim s definicijom procesa
  • RuntimeService upravlja ProcessInsistance (trenutno pokrenuti procesi) kao i procesne varijable
  • TaskService prati Korisničke zadatke. The Zadaci koje korisnik treba izvršiti ručno, u osnovi su Activiti API-ja. Pomoću ove usluge možemo stvoriti zadatak, zatražiti i dovršiti zadatak, manipulirati primateljem zadatka itd
  • FormService je neobavezna usluga. API se može koristiti bez njega i bez žrtvovanja bilo koje njegove značajke. Koristi se za definiranje početnog oblika i obrasca zadatka u procesu.
  • IdentityService upravlja Korisnici i Grupe
  • HistoryService prati povijest Activiti Engine. Također možemo postaviti različite razine povijesti.
  • ManagementService povezan je s metapodacima i obično nije potreban prilikom izrade aplikacije
  • DynamicBpmnService pomaže nam da promijenimo bilo što u procesu bez ponovnog raspoređivanja

5. Rad s uslugama Activiti

Da bismo naučili kako možemo raditi s različitim uslugama i pokrenuti postupak, uzmimo primjer postupka za „Zahtjev za godišnji odmor“:

Datoteka BPMN 2.0, VacationRequest.bpmn20.xml, za ovaj će proces početni događaj biti definiran kao:

Slično tome, prvi korisnički zadatak, dodijeljen korisničkoj grupi "upravljanje", izgledat će ovako:

 $ {workerName} želi uzeti dan odmora ($ {numberOfDays}) (motivacija: $ {razlog}). upravljanje 

Uz ServiceTask, moramo definirati komad koda koji se izvršava. Ovaj dio koda imamo kao Java klasu:

Uvjetni tok prikazat će se dodavanjem znaka "UvjetExpression" oznaka u “SequenceFlow”:

Ovdje, odmorOdobreno je formProperty od UserTask prikazano gore.

Kao što vidimo na dijagramu, to je vrlo jednostavan postupak. Zaposlenik podnosi zahtjev za godišnji odmor, navodeći broj dana i datum početka odmora. Zahtjev ide upravitelju. Oni mogu odobriti / odbiti zahtjev.

Ako se odobri, definiran je uslužni zadatak za slanje e-pošte s potvrdom. Ako se ne odobri, zaposlenik može ili promijeniti ili ponovno poslati zahtjev ili ne učiniti ništa.

Servisni zadaci dobivaju se nekim dijelom koda za izvršenje (ovdje kao Java klasa). Održali smo nastavu SendEmailServiceTask.java.

Ove bi se vrste nastave trebale proširiti JavaDelegate. Također, moramo ga nadvladati izvršiti() metoda, koja će se izvesti kada izvršavanje procesa dosegne ovaj korak.

5.1. Uvođenje procesa

Da bi naš proces bio poznat Activiti Engineu, moramo ga implementirati. To možemo učiniti programski koristeći RepositoryService. Napišimo JUnit test koji će pokazati ovo:

@Test javna praznina danaBPMN_whenDeployProcess_thenDeployed () {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine (); RepositoryService repositoryService = processEngine.getRepositoryService (); repositoryService.createDeployment () .addClasspathResource ("org / activiti / test / vacationRequest.bpmn20.xml") .deploy (); Dugo brojanje = repositoryService.createProcessDefinitionQuery (). Count (); assertEquals ("1", count.toString ()); }

Implementacija znači da će stroj analizirati BPMN datoteku i pretvoriti je u nešto izvršno. Također, zapis će se dodati u tablicu Repozitorija za svako postavljanje.

Stoga nakon toga možemo postaviti upit Spremište usluga za dobivanje implementiranih procesa; the Definicije procesa.

5.2. Pokretanje a ProcessInstance

Nakon raspoređivanja Definicija procesa na Activiti Engine, možemo izvršiti postupak stvaranjem ProcessInsistance. The Definicija procesa je nacrt, a ProcessInstance je njegovo izvršavanje tijekom izvođenja.

Za samca Definicija procesa, može biti više ProcessInsistance.

Svi detalji vezani za ProcessInsistance može se pristupiti putem RuntimeService.

U našem primjeru, na početnom događaju, moramo navesti broj dana odmora, datum početka i razlog. Koristit ćemo varijable procesa i prosljeđivati ​​ih tijekom stvaranja ProcessInstance.

Napišimo JUnit test slučaj da bismo dobili bolju ideju:

@Test javna praznina givenDeployedProcess_whenStartProcessInstance_thenRunning () {// postavljanje definicije procesa Varijable mape = new HashMap> (); variables.put ("ime zaposlenika", "Ivan"); variables.put ("numberOfDays", 4); variables.put ("vacationMotivation", "Trebam pauzu!"); RuntimeService runtimeService = processEngine.getRuntimeService (); ProcessInstance processInstance = runtimeService .startProcessInstanceByKey ("requestRequest", varijable); Dugo brojanje = runtimeService.createProcessInstanceQuery (). Count (); assertEquals ("1", count.toString ()); }

Višestruki primjerci jedne definicije procesa razlikovat će se prema procesnim varijablama.

Postoji više načina za pokretanje instance procesa. Ovdje koristimo ključ postupka. Nakon pokretanja instance procesa, informacije o njemu možemo dobiti upitom RuntimeService.

5.3. Izvršenje zadataka

Kad se naša instanca procesa počne izvoditi, prvi korak je korisnički zadatak, dodijeljen grupi korisnika "upravljanje".

Korisnik može imati ulaznu poštu koja će imati popis zadataka koje treba obaviti. Sada, ako želimo nastaviti izvršenje postupka, korisnik mora završiti ovaj zadatak. Za Activiti Engine to se naziva "izvršavanje zadatka".

Možemo postaviti upit TaskService, da biste dobili objekt zadatka i zatim ga dovršili.

Kôd koji za to trebamo napisati izgleda ovako:

@Test javna praznina givenProcessInstance_whenCompleteTask_thenGotNextTask () {// implementacija procesa i pokretanje instance procesa TaskService taskService = processEngine.getTaskService (); Popis zadataka = taskService.createTaskQuery () .taskCandidateGroup ("upravljanje"). List (); Zadatak zadatka = tasks.get (0); Mapiraj taskVariables = novi HashMap (); taskVariables.put ("vacationApproved", "false"); taskVariables.put ("komentari", "Uskoro imamo rok!"); taskService.complete (task.getId (), taskVariables); Zadatak currentTask = taskService.createTaskQuery () .taskName ("Izmijeni zahtjev za odmor"). SingleResult (); assertNotNull (currentTask); }

Imajte na umu da dovršiti () metoda TaskService također uzima potrebne procesne varijable. Prosljeđujemo odgovor upravitelja.

Nakon toga, procesni mehanizam nastavit će se na sljedeći korak. Evo, sljedeći korak pita zaposlenika hoće li se zahtjev za odmor ponovno poslati ili ne.

Dakle, naša ProcessInstance sada čeka na ovo UserTask, koja ima ime “Izmijeni odmor zahtjev".

5.4. Obustavljanje i aktiviranje procesa

Možemo suspendirati a Definicija procesa a također a ProcessInstance. Ako suspendiramo a Definicija procesa, ne možemo ga stvoriti dok je suspendiran. To možemo učiniti pomoću RepositoryService:

@Test (očekuje se = ActivitiException.class) javna praznina givenDeployedProcess_whenSuspend_thenNoProcessInstance () {// postavljanje definicije procesa repositoryService.suspendProcessDefinitionByKey ("requestRequest"); runtimeService.startProcessInstanceByKey ("zahtjev za odmor"); } 

Da bismo ga ponovno aktivirali, samo moramo nazvati jednog od repositoryService.activateProcessDefinitionXXX metode.

Slično tome, možemo suspendirati a ProcessInstance, koristiti RuntimeService.

6. Zaključak

U ovom smo članku vidjeli kako možemo koristiti Activiti s Javom. Stvorili smo uzorak ProcessEngineCofiguration datoteku koja nam pomaže stvoriti ProcessEngine.

Koristeći ga, pristupili smo raznim uslugama koje pruža API. Te usluge pomažu nam u upravljanju i praćenju Definicije procesa, ProcessInsistance, Korisničke zadatkeitd.

Kao i uvijek, kod za primjere koje smo vidjeli u članku leži na GitHubu.