Introduksjon til Activiti med våren

1. Oversikt

For å si det enkelt, Activiti er en arbeidsflyt- og forretningsprosessstyringsplattform.

Vi kan komme raskt i gang ved å lage en ProcessEngineConfiguration (vanligvis basert på en konfigurasjonsfil). Fra dette kan vi få en ProcessEngine - og gjennom Prosessmotor, vi kan utføre arbeidsflyt- og BPM-operasjoner.

API gir forskjellige tjenester som kan brukes til å få tilgang til og administrere prosesser. Disse tjenestene kan gi oss informasjon om prosesshistorikken, hva som kjøres for øyeblikket og prosessene som er distribuert, men som ikke kjører ennå.

Tjenestene kan også brukes til å definere prosessstrukturen og manipulere tilstanden til prosessen, dvs. kjøre, suspendere, avbryte osv.

Hvis du ikke har noen API på nytt, kan du sjekke ut vår Introduksjon til Activiti API med Java. I denne artikkelen vil vi diskutere hvordan vi kan sette opp Activiti API i en Spring Boot-applikasjon.

2. Oppsett med vårstøvel

La oss se hvordan vi kan konfigurere Activiti som en Spring Boot Maven-applikasjon og begynne å bruke den.

2.1. Førstegangs oppsett

Som vanlig må vi legge til avhengighet av maven:

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

Den siste stabile versjonen av API-en finner du her. Det fungerer med Spring Boot opp gjennom v1.5.4. Det fungerer ikke med v2.0.0.M1 ennå.

Vi kan også generere et Spring Boot-prosjekt ved hjelp av //start.spring.io og velge Activiti som en avhengighet.

Bare ved å legge til denne avhengigheten og @EnableAutoConfiguration merknad til Spring Boot Application, vil det gjøre det første oppsettet:

  • Opprett datakilde (API-en krever en database for å opprette ProcessEngine)
  • Opprett og avslør ProcessEngine bønne
  • Opprett og avslør Activiti-tjenestebønnene
  • Lag vårjobbutføreren

2.2. Opprette og kjøre en prosess

La oss konstruere et eksempel på å opprette og kjøre en forretningsprosess.

For å definere en prosess må vi opprette en BPMN-fil. For dette kan vi bruke //activiti.alfresco.com/activiti-app/editor til å lage en prosessdefinisjon.

Så er det bare å laste ned BPMN-filen. Vi må legge denne filen i src / hoved / ressurser / prosesser mappe. Som standard vil Spring Boot se i denne mappen for å distribuere prosessdefinisjonen.

Vi oppretter en demoprosess som inneholder én brukeroppgave:

Ansvarlig for brukeroppgaven er angitt som initiativtaker til prosessen. BPMN-filen for denne prosessdefinisjonen ser ut som:

Nå oppretter vi en REST-kontroller for å håndtere forespørsler om å starte denne prosessen:

@Autowired privat RuntimeService runtimeService; @GetMapping ("/ start-process") public String startProcess () {runtimeService.startProcessInstanceByKey ("my-process"); returner "Prosessen startet. Antall nåværende" + "prosessinstanser =" + runtimeService.createProcessInstanceQuery (). count (); }

Her, runtimeService.startProcessInstanceByKey (“min prosess”) starter utførelsen av prosessen hvis nøkkel er “Min prosess”. runtimeService.createProcessInstanceQuery (). count () vil gi oss antall prosessforekomster.

Hver gang vi treffer veien “/ Start-prosess”, en ny ProcessInstance vil bli opprettet, og vi vil se en økning i antallet av nåværende prosesser.

En JUnit-testtilfelle viser oss denne oppførselen:

@Test offentlig ugyldighet givenProcess_whenStartProcess_thenIncreaseInProcessInstanceCount () kaster unntak {String responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-prosess")). Og Retur (). GetResponse (). GetContent; assertEquals ("Prosessen startet. Antall nåværende" + "prosessforekomster = 1", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-prosess")) .andReturn (). getResponse (). getContentAsString (); assertEquals ("Prosessen startet. Antall nåværende" + "prosessinstanser = 2", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-prosess")). og Retur (). getResponse (). getContentAsString (); assertEquals ("Prosessen startet. Antall nåværende" + "prosessinstanser = 3", responseBody); } 

3. Spiller med prosesser

Nå som vi har en pågående prosess i Activiti ved hjelp av Spring Boot, la oss utvide eksemplet ovenfor for å demonstrere hvordan vi kan få tilgang til og manipulere prosessen.

3.1. Få listen over Oppgaver for en gitt ProcessInstance

Vi har to brukeroppgaver EN og B. Når vi starter en prosess, vil den vente på den første oppgaven EN som skal fullføres og deretter utføre oppgaven B. La oss lage en behandlingsmetode som godtar forespørsler om å se oppgavene knyttet til en gitt prosessInstans.

Objektene, som Oppgave, kan ikke sendes som et svar direkte, og derfor må vi lage et tilpasset objekt og konvertere Oppgave til vårt tilpassede objekt. Vi vil kalle denne klassen TaskRepresentasjon:

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

Handlermetoden vil se ut som:

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

Her, taskService.createTaskQuery (). processInstanceId (processInstanceId) .list () bruker TaskService og får oss listen over oppgaver knyttet til det gitte processInstanceId. Vi kan se at når vi begynner å kjøre prosessen vi opprettet, vil vi få oppgaven EN ved å gjøre en forespørsel til metoden vi nettopp definerte:

@Test offentlig ugyldighet givenProcess_whenProcessInstance_thenReceivedRunningTask () kaster unntak {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ start-prosess")) .andReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .list () .get (0); StrengresponsBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ get-Tasks /" + pi.getId ())). Og Retur () .getResponse () .getContentAsString (); ObjectMapper mapper = ny ObjectMapper (); Listeoppgaver = Arrays.asList (mapper .readValue (responseBody, TaskRepresentation []. Class)); assertEquals (1, tasks.size ()); assertEquals ("A", Tasks.get (0) .getName ()); }

3.2. Fullføre en Oppgave

Nå skal vi se hva som skjer når vi fullfører oppgaven EN. Vi oppretter en behandlingsmetode som vil håndtere forespørsler om å fullføre oppgaven EN for det gitte prosessInstans:

@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 () oppretter et spørsmål om oppgavetjenesten og gir oss oppgaven til det gitte prosessInstans. Dette er Brukeroppgave A. Neste linje taskService.complete (task.getId) fullfører denne oppgaven.

Derfor har nå prosessen nådd slutten og RuntimeService inneholder ikke noe ProsessStoffer. Vi kan se dette ved hjelp av JUnit test case:

@Test offentlig ugyldig givenProcess_whenCompleteTaskA_thenNoProcessInstance () kaster unntak {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ start-prosess")) .andReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .list () .get (0); this.mockMvc.perform (MockMvcRequestBuilders.get ("/ complete-task-A /" + pi.getId ())). ogReturn () .getResponse () .getContentAsString (); Listeliste = runtimeService.createProcessInstanceQuery (). Liste (); assertEquals (0, list.size ()); }

Slik kan vi bruke Activiti-tjenester med prosesser.

4. Konklusjon

I denne artikkelen gikk vi gjennom oversikten over bruk av Activiti API med Spring Boot. Mer informasjon om API-en finner du i brukerhåndboken. Vi så også hvordan du oppretter en prosess og utfører forskjellige operasjoner på den ved hjelp av Activiti-tjenester.

Spring Boot gjør det enkelt å bruke, ettersom vi ikke trenger å bekymre oss for å opprette databasen, distribuere prosessene eller lage ProcessEngine.

Husk integrasjonen av Activiti med Spring Boot er fortsatt i eksperimentell fase, og den støttes ikke av Spring Boot 2 ennå.

Som alltid kan implementering av alle eksemplene vi så finnes på GitHub.


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