Útmutató az Activiti Java használatához

1. Áttekintés

Az Activiti API egy munkafolyamat- és üzleti folyamatkezelő rendszer. Meghatározhatunk benne egy folyamatot, végrehajthatjuk és különböző módon manipulálhatjuk az API által nyújtott szolgáltatások felhasználásával. Ehhez JDK 7+ szükséges.

Az API használatával történő fejlesztés bármely IDE-ben elvégezhető, de az Activiti Designer használatához Eclipse-re van szükségünk.

A BPMN 2.0 szabvány segítségével meghatározhatunk benne egy folyamatot. Van egy másik, kevésbé népszerű módszer - a Java osztályok használata StartEvent, EndEvent, UserTask, SequenceFlowstb.

Ha folyamatot akarunk futtatni, vagy bármelyik szolgáltatáshoz hozzáférünk, létre kell hoznunk a ProcessEngineConfiguration.

Megkaphatjuk a ProcessEngine felhasználásával ProcessEngineConfiguration, bizonyos szempontból, amelyet ebben a cikkben tovább tárgyalunk. Keresztüla ProcessEngine elvégezhetjük a Workflow és a BPMN műveleteket.

2. Maven-függőségek

Az API használatához fel kell vennünk az Activiti-függőséget:

 org.activiti activiti-engine 

3. A. Létrehozása ProcessEngine

ProcessEngine az Activiti rendszerben általában XML fájl segítségével konfigurálható, activiti.cfg.xml. Példa erre a konfigurációs fájlra:

Most megszerezhetjük a ProcessEngine használni a ProcessEngines osztály:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine ();

Ez az állítás egy activiti.cfg.xml fájlt az osztályútvonalon, és szerkessze a ProcessEngine a fájlban található konfiguráció alapján.

A konfigurációs fájl mintakódja azt mutatja, hogy ez csak egy Spring-alapú konfiguráció. De ez nem azt jelenti, hogy az Activitit csak tavaszi környezetben használhatjuk. A Spring képességeit csak belsőleg használják fel a ProcessEngine.

Írjunk egy JUnit tesztesetet, amely létrehozza a ProcessEngine a fenti konfigurációs fájl használatával:

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

4. Activiti Process Engine API és szolgáltatások

Az API-val való interakció belépési pontja a ProcessEngine. Keresztül ProcessEngine, hozzáférhetünk különféle szolgáltatásokhoz, amelyek munkafolyamat / BPMN módszereket biztosítanak. A ProcessEngine és az összes szolgáltatási objektum menetes.

A következő webhelyről származik: //www.activiti.org/userguide/images/api.services.png

A ProcessEngines osztály megkeresi a activiti.cfg.xml és activiti-context.xml fájlokat. Mint korábban említettük, az összes activiti.cfg.xml fájlok, a ProcessEngine tipikus módon jönnek létre.

Mivel az összes activiti-context.xml fájlokat, ez tavaszi módon jön létre - létrehozom a tavaszi alkalmazás kontextust, és megszerzem a ProcessEngine attól. A folyamat végrehajtása során az összes lépést meglátogatja a BPMN fájlban meghatározott sorrendben.

A folyamat végrehajtása során az összes lépést meglátogatja a BPMN fájlban meghatározott sorrendben.

4.1. A folyamat meghatározása és a kapcsolódó kifejezések

A ProcessDefinition üzleti folyamatot képvisel. A folyamat különböző lépéseinek felépítésének és viselkedésének meghatározására szolgál. A folyamatdefiníció telepítése azt jelenti, hogy a folyamatdefiníciót be kell tölteni az Activiti adatbázisba.

A folyamatdefiníciókat többnyire a BPMN 2.0 szabvány határozza meg. Java kód segítségével is meghatározhatók. Az ebben a szakaszban meghatározott összes kifejezés Java osztályként is elérhető.

Amint elkezdjük futtatni a folyamatdefiníciót, folyamatnak nevezhetjük

A ProcessInstance az egyik végrehajtása ProcessDefinition.

A StartEvent minden üzleti folyamathoz kapcsolódik. Jelzi a folyamat belépési pontját. Hasonlóképpen létezik egy EndEvent amely a folyamat végét jelzi. Meghatározhatjuk ezeknek az eseményeknek a feltételeit.

A kezdet és a vég közötti összes lépésre (vagy elemre) hivatkozunk Feladatok. Feladatok különféle típusúak lehetnek. A leggyakrabban használt feladatok UserTasks és ServiceTasks.

UserTasksamint a neve is mutatja, olyanok, hogy ezeket a felhasználónak manuálisan kell végrehajtania.

ServiceTasksmásrészt kóddarabbal vannak konfigurálva. Amikor a végrehajtás eléri őket, a kódblokkjuk végrehajtásra kerül.

SequenceFlows csatlakoztassa a Feladatok. Meghatározhatjuk a SequenceFlows az összekapcsolandó forrás- és célelemek alapján. Ismét meghatározhatunk feltételeket a SequenceFlows hogy feltételes utakat hozzunk létre a folyamat során.

4.2. Szolgáltatások

Röviden megbeszéljük az Activiti által nyújtott szolgáltatásokat:

  • RepositoryService segít a folyamatdefiníciók telepítésének manipulálásában. Ez a szolgáltatás a folyamatdefinícióval kapcsolatos statikus adatokkal foglalkozik
  • RuntimeService kezeli a ProcessInstances (jelenleg futó folyamatok), valamint a folyamatváltozók
  • TaskService nyomon követi a UserTasks. A Feladatok amelyeket a felhasználónak manuálisan kell végrehajtania, az Activiti API alapját képezik. Létrehozhatunk egy feladatot, igényelhetünk és kitölthetünk egy feladatot, manipulálhatjuk a feladat megbízottját stb
  • FormService opcionális szolgáltatás. Az API használható anélkül, hogy feláldozná annak bármely tulajdonságát. A folyamat kezdő és feladat űrlapjának meghatározására szolgál.
  • IdentityService kezeli a Felhasználók és Csoportok
  • HistoryService nyomon követi az Activiti Engine történetét. Különböző történelemszinteket is beállíthatunk.
  • ManagementService a metaadatokhoz kapcsolódik, és általában nem szükséges az alkalmazás létrehozásakor
  • DynamicBpmnService segít abban, hogy bármit megváltoztassunk egy folyamatban anélkül, hogy átcsoportosítanánk

5. Munka az Activiti Services szolgáltatással

Ha meg szeretné tudni, hogyan működhetünk együtt a különböző szolgáltatásokkal és futtathatunk egy folyamatot, vegyünk egy példát az „Alkalmazotti üdülési kérelem” folyamatára:

A BPMN 2.0 fájl, VacationRequest.bpmn20.xml, ennek a folyamatnak a kezdő eseménye a következő:

Hasonlóképpen, az első felhasználói feladat, amelyet a „management” felhasználói csoporthoz rendeltek, így fog kinézni:

 $ {workerName} $ {numberOfDays} napot szeretne nyaralni (Motiváció: $ {oka}). menedzsment 

A ... val ServiceTask, meg kell határoznunk a végrehajtandó kódrészletet. Ez a kóddarab Java osztályként van:

A feltételes áramlást a „ConditionExpression” címke a „Sequelflow”:

Itt, vakáció jóváhagyva az a formProperty a UserTask fent látható.

Amint a diagramon láthatjuk, ez egy nagyon egyszerű folyamat. Az alkalmazott nyaralási kérelmet nyújt be, megadva a napok számát és a vakáció kezdetének dátumát. A kérés a menedzserhez kerül. Jóváhagyhatják / elutasíthatják a kérelmet.

Jóváhagyás esetén meg van határozva egy szolgáltatási feladat a megerősítő e-mail küldésére. Elutasítás esetén az alkalmazott választhatja a kérelem módosítását és újraküldését, vagy nem tehet semmit.

A szolgáltatási feladatokat valamilyen végrehajtandó kóddal látják el (itt, Java osztályként). Megadtuk az osztályt SendEmailServiceTask.java.

Az ilyen típusú osztályoknak ki kell terjeszteniük a JavaDelegate. Ezenkívül felül kell írnunk azt végrehajtani () módszer, amelyet akkor hajtanak végre, amikor a folyamat végrehajtása eléri ezt a lépést.

5.1. Folyamat bevezetése

Ahhoz, hogy a folyamatunkat az Activiti Engine megismertesse, telepítenünk kell a folyamatot. Programosan megtehetjük a RepositoryService. Írjunk egy JUnit tesztet ennek bemutatására:

@Test public void givenBPMN_whenDeployProcess_thenDeployed () {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine (); RepositoryService repositoryService = processEngine.getRepositoryService (); repositoryService.createDeployment () .addClasspathResource ("org / activiti / test / vacationRequest.bpmn20.xml") .deploy (); Hosszú szám = repositoryService.createProcessDefinitionQuery (). Count (); assertEquals ("1", count.toString ()); }

A telepítés azt jelenti, hogy a motor elemzi a BPMN fájlt, és valami futtathatóvá alakítja. Ezenkívül minden telepítéshez hozzáadódik egy rekord a Tároló táblához.

Ezért később lekérdezhetjük a Adattár szolgáltatás a telepített folyamatok megszerzéséhez; a ProcessDefinitions.

5.2. Kezdő a ProcessInstance

Telepítése után a ProcessDefinition az Activiti Engine-hez létrehozásával futtathatjuk a folyamatot ProcessInstances. A ProcessDefinition tervrajz, és a ProcessInstance futásidejű végrehajtása.

Egyetlen ProcessDefinition, több is lehet ProcessInstances.

Az összes kapcsolódó részlet a ProcessInstances keresztül érhető el RuntimeService.

Példánkban a start eseménynél meg kell adnunk a nyaralási napok számát, a kezdési dátumot és az okot. A folyamatváltozókat használni fogjuk, és továbbadjuk a ProcessInstance.

Írjunk egy JUnit tesztesetet, hogy jobb ötletet kapjunk:

@Test public void givenDeployedProcess_whenStartProcessInstance_thenRunning () {// a folyamatdefiníció telepítése Map változók = new HashMap> (); variables.put ("alkalmazottNév", "John"); variables.put ("numberOfDays", 4); variables.put ("nyaralásMotiváció", "Szükségem van egy kis szünetre!"); RuntimeService runtimeService = processEngine.getRuntimeService (); ProcessInstance processInstance = runtimeService .startProcessInstanceByKey ("vacationRequest", változók); Hosszú számlálás = runtimeService.createProcessInstanceQuery (). Count (); assertEquals ("1", count.toString ()); }

Egy folyamatdefiníció több példánya különbözik a folyamatváltozóktól.

A folyamatpéldány elindításának többféle módja van. Itt a folyamat kulcsát használjuk. A folyamatpéldány elindítása után a. Lekérdezésével megszerezhetjük az információkat RuntimeService.

5.3. Feladatok befejezése

Amikor a folyamatpéldányunk elindul, az első lépés a felhasználói csoporthoz rendelt felhasználói feladat „Menedzsment”.

Előfordulhat, hogy a felhasználónak van egy beérkező üzenete, amelyen fel kell tüntetni a feladatok listáját. Most, ha folytatni akarjuk a folyamat végrehajtását, a felhasználónak be kell fejeznie ezt a feladatot. Az Activiti Engine esetében ezt a feladat elvégzésének hívják.

Lekérdezhetjük a TaskService, a feladatobjektum megszerzéséhez, majd teljesítéséhez.

A kód, amelyet ehhez meg kell írnunk, a következőképpen néz ki:

@Test public void givenProcessInstance_whenCompleteTask_thenGotNextTask () {// telepítse a folyamatot és indítsa el a folyamatpéldányt TaskService taskService = processEngine.getTaskService (); Lista feladatok = taskService.createTaskQuery () .taskCandidateGroup ("management"). List (); Feladat feladat = feladatok.get (0); Map taskVariables = new HashMap (); taskVariables.put ("vacationApproved", "false"); taskVariables.put ("megjegyzések", "Szűk határidőnk van!"); taskService.complete (task.getId (), taskVariables); Feladat currentTask = taskService.createTaskQuery () .taskName ("Nyaralási kérelem módosítása"). SingleResult (); assertNotNull (currentTask); }

Vegye figyelembe, hogy a teljes() a metódusa TaskService a szükséges folyamatváltozókat is beveszi. Átadjuk a menedzser válaszát.

Ezt követően a folyamatmotor folytatja a következő lépéssel. Itt a következő lépés megkérdezi az alkalmazottat, hogy a nyaralási kérelmet újra elküldik-e vagy sem.

Szóval, a mi ProcessInstance most erre vár UserTask, amelynek neve van „Nyaralás módosítása kérés".

5.4. Egy folyamat felfüggesztése és aktiválása

Felfüggeszthetjük a ProcessDefinition és a ProcessInstance. Ha felfüggesztjük a ProcessDefinition, felfüggesztve nem hozhatunk létre róla példányt. Ezt megtehetjük a RepositoryService:

@Test (várható = ActivitiException.class) public void givenDeployedProcess_whenSuspend_thenNoProcessInstance () {// telepítse a folyamatdefiníciós tárolótService.suspendProcessDefinitionByKey ("vacationRequest"); runtimeService.startProcessInstanceByKey ("vacationRequest"); } 

Az újbóli aktiváláshoz csak meg kell hívnunk az egyiket repositoryService.activateProcessDefinitionXXX mód.

Hasonlóképpen felfüggeszthetjük a ProcessInstance, használni a RuntimeService.

6. Következtetés

Ebben a cikkben láttuk, hogyan használhatnánk az Activiti-t a Java-val. Készítettünk egy mintát ProcessEngineCofiguration fájl, amely segít a ProcessEngine.

Használatával eljutottunk az API által nyújtott különféle szolgáltatásokhoz. Ezek a szolgáltatások segítenek nekünk kezelni és nyomon követni ProcessDefinitions, ProcessInstances, UserTasksstb.

Mint mindig, a cikkben látott példák kódja a GitHubon található.