Introduktion til Activiti med forår

1. Oversigt

Kort fortalt, Activiti er en workflow- og Business Process Management-platform.

Vi kan komme i gang hurtigt ved at oprette en ProcessEngineConfiguration (typisk baseret på en konfigurationsfil). Fra dette kan vi få en ProcessEngine - og gennem ProcessEngine, vi kan udføre workflow og BPM-operationer.

API'en tilbyder forskellige tjenester, der kan bruges til at få adgang til og administrere processer. Disse tjenester kan give os information om processens historie, hvad der i øjeblikket kører og de processer, der er implementeret, men ikke kører endnu.

Tjenesterne kan også bruges til at definere processtrukturen og manipulere status for processen, dvs. køre, suspendere, annullere osv.

Hvis du er ny i API'en, skal du tjekke vores Introduktion til Activiti API med Java. I denne artikel vil vi diskutere, hvordan vi kan konfigurere Activiti API i en Spring Boot-applikation.

2. Opsætning med Spring Boot

Lad os se, hvordan vi kan konfigurere Activiti som et Spring Boot Maven-program og begynde at bruge det.

2.1. Første opsætning

Som sædvanligt er vi nødt til at tilføje maven-afhængighed:

 org.activiti activiti-spring-boot-starter-basic 

Den seneste stabile version af API'en kan findes her. Det fungerer med Spring Boot op gennem v1.5.4. Det fungerer ikke med v2.0.0.M1 endnu.

Vi kan også generere et Spring Boot-projekt ved hjælp af //start.spring.io og vælge Activiti som en afhængighed.

Bare ved at tilføje denne afhængighed og @EnableAutoConfiguration kommentar til Spring Boot-applikationen, den udfører den oprindelige opsætning:

  • Opret datakilde (API'en kræver en database for at oprette ProcessEngine)
  • Opret og udsæt ProcessEngine bønne
  • Opret og udsæt Activiti-tjenestebønnerne
  • Opret Spring Job Executor

2.2. Oprettelse og kørsel af en proces

Lad os konstruere et eksempel på oprettelse og kørsel af en forretningsproces.

For at definere en proces skal vi oprette en BPMN-fil. Til dette kan vi bruge //activiti.alfresco.com/activiti-app/editor til at oprette en procesdefinition.

Derefter skal du bare downloade BPMN-filen. Vi bliver nødt til at placere denne fil i src / main / ressourcer / processer folder. Spring Boot ser som standard i denne mappe for at implementere procesdefinitionen.

Vi opretter en demoproces, der indeholder én brugeropgave:

Modtager af brugeropgaven er indstillet som initiativtager til processen. BPMN-filen til denne procesdefinition ligner:

Nu opretter vi en REST-controller til at håndtere anmodninger om at starte denne proces:

@Autowired privat RuntimeService runtimeService; @GetMapping ("/ start-proces") offentlig String startProcess () {runtimeService.startProcessInstanceByKey ("min-proces"); returner "Processen startet. Antal aktuelt kørende" + "procesinstanser =" + runtimeService.createProcessInstanceQuery (). count (); }

Her, runtimeService.startProcessInstanceByKey (“min proces”) starter udførelsen af ​​den proces, hvis nøgle er “Min proces”. runtimeService.createProcessInstanceQuery (). count () vil give os antallet af procesforekomster.

Hver gang vi rammer stien “/ Start-proces”, en ny ProcessInstance vil blive oprettet, og vi vil se en forøgelse i antallet af de aktuelt kørende processer.

En JUnit test case viser os denne adfærd:

@Test offentlig ugyldighed givenProcess_whenStartProcess_thenIncreaseInProcessInstanceCount () kaster undtagelse {String responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-proces")). Og Retur (). GetResponse (). GetContent; assertEquals ("Processen er startet. Antal i øjeblikket kørende" + "procesinstanser = 1", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-proces")). og Retur (). getResponse (). getContentAsString (); assertEquals ("Processen er startet. Antal i øjeblikket kørende" + "procesinstanser = 2", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-proces")). og Retur (). getResponse (). getContentAsString (); assertEquals ("Processen startet. Antal kørende" + "procesinstanser = 3", responseBody); } 

3. Spiller med processer

Nu hvor vi har en kørende proces i Activiti ved hjælp af Spring Boot, lad os udvide ovenstående eksempel for at demonstrere, hvordan vi kan få adgang til og manipulere processen.

3.1. Få listen over Opgaver for en given ProcessInstance

Vi har to brugeropgaver EN og B. Når vi starter en proces, venter den på den første opgave EN skal udfyldes og derefter udføre opgaven B. Lad os oprette en behandlingsmetode, der accepterer anmodninger om at få vist de opgaver, der er relateret til en given procesInstans.

Objekterne, ligesom Opgave, kan ikke sendes som et svar direkte, og derfor er vi nødt til at oprette et brugerdefineret objekt og konvertere Opgave til vores brugerdefinerede objekt. Vi kalder denne klasse TaskRepræsentation:

klasse TaskRepresentation {privat streng-id; privat strengnavn; privat streng procesInstanceId; // standardkonstruktører}

Handlermetoden vil se ud:

@GetMapping ("/ get-task / {processInstanceId}") offentlig liste getTasks (@PathVariable String processInstanceId) {List usertasks = taskService.createTaskQuery () .processInstanceId (processInstanceId) .list (); returner usertasks.stream () .map (opgave -> ny TaskRepresentation (task.getId (), task.getName (), task.getProcessInstanceId ())) .collect (Collectors.toList ()); } 

Her, taskService.createTaskQuery (). processInstanceId (processInstanceId) .liste () anvendelser TaskService og får os listen over opgaver relateret til det givne processInstanceId. Vi kan se, at når vi begynder at køre den proces, vi oprettede, får vi opgaven EN ved at stille en anmodning til den metode, vi lige har defineret:

@Test offentlig ugyldighed givenProcess_whenProcessInstance_thenReceivedRunningTask () kaster undtagelse {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ start-proces")) .andReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .liste () .get (0); String responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ get-Tasks /" + pi.getId ())). Og Retur () .getResponse () .getContentAsString (); ObjectMapper-kortlægger = ny ObjectMapper (); Listeopgaver = Arrays.asList (mapper .readValue (responsBody, TaskRepresentation []. Klasse)); assertEquals (1, task.size ()); assertEquals ("A", task.get (0) .getName ()); }

3.2. Afslutning af en Opgave

Nu vil vi se, hvad der sker, når vi fuldfører opgaven EN. Vi opretter en behandlingsmetode, der håndterer anmodninger om at fuldføre opgaven EN for det givne procesInstans:

@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 () opretter en forespørgsel om opgavetjenesten og giver os opgaven for det givne procesInstans. Dette er Brugeropgave A. Den næste linje taskService.complete (task.getId) fuldfører denne opgave.

Derfor er nu processen nået slutningen og RuntimeService indeholder ikke noget ProcessStoffer. Vi kan se dette ved hjælp af JUnit test case:

@Test offentlig ugyldighed givenProcess_whenCompleteTaskA_thenNoProcessInstance () kaster undtagelse {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ start-proces")) .andReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .liste () .get (0); this.mockMvc.perform (MockMvcRequestBuilders.get ("/ complete-task-A /" + pi.getId ())). og Retur () .getResponse () .getContentAsString (); Liste liste = runtimeService.createProcessInstanceQuery (). Liste (); assertEquals (0, list.size ()); }

Sådan kan vi bruge Activiti-tjenester til at arbejde med processer.

4. Konklusion

I denne artikel gennemgik vi oversigten over brugen af ​​Activiti API med Spring Boot. Flere oplysninger om API'en findes i brugervejledningen. Vi så også, hvordan man opretter en proces og udfører forskellige operationer på den ved hjælp af Activiti-tjenester.

Spring Boot gør det nemt at bruge, da vi ikke behøver at bekymre os om at oprette databasen, implementere processerne eller oprette ProcessEngine.

Husk integrationen af ​​Activiti med Spring Boot er stadig i den eksperimentelle fase, og den understøttes endnu ikke af Spring Boot 2.

Som altid kan implementering af alle de eksempler, vi så, findes på GitHub.


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