Lab 2: Podstawy pracy z Activiti Designerem
Webowy Activiti Modeler ma spore ograniczenia.
Więcej możliwości daje projektantom procesów eclipsowy Activiti Designer,
w którym można specyfikować dodatkowe właściwości elementów.
W związku z tym dziś przeniesiemy nasz model do Eclipsa,
a ponadto przygotujemy dla niego jUnit test.
Instalacja wtyczki m2e
Utworzenie projektu i modelu
Proszę w eclipsie stworzyć nowy projekt:
New → Project…, następnie Activiti → Activiti Project.
Dodajemy do projektu w: src/main/resources/java
pusty diagram Activiti (New→Other…, Activiti → Activiti Diagram).
Proszę teraz zamodelować jakiś najprostszy proces.
Testowanie modelu
Następnie skonwertuj projekt: Configure → Convert to Maven Project
Prawym klawiszem na diagramie w drzewie projektu wybieramy:
Activiti→Generate unit test.
W src/test/java/org/activiti/designer/test
powinien pojawić się nasz JUnit test.
Proszę uruchomić JUnit test i sprawdzić, czy test przeszedł poprawnie.
Gdyby test nie przeszedł poprawnie, bo np. nie wszystkie biblioteki udało się załadować:
Proszę dostosować odpowiednią wersję Activiti do uruchomionej na komputerze.
W tym celu należy zmieniamy w pliku pom.xml
wersję Actviti na 5.XX (gdzie XX to odpowiednia wersja).
Obejrzyj również plik konfiguracyjny opisujący tryb działania Activiti
activiti.cfg.xml
, powinien być w katalogu: src/main/resources/
.
Używając ActivitiRule
mamy dostęp do odpowiednich serwisów zapewniających interfejsy do różnych funkcjonalności:
RepositoryService – zapewnia funkcjonalność do wdrażania, wykonywania zapytań, czy usuwania procesów,
RuntimeService – zapewnia interfejs do uruchamiania i wykonywania zapytań do instancji procesów (również ich zmiennych),
-
TaskService – zapewnia interfejs do zarządzania zadaniami.
FormService – zapewnia interfejs do zarządzania formularzami.
RepositoryService repositoryService = activitiRule.getRepositoryService();
RuntimeService runtimeService = activitiRule.getRuntimeService();
IdentityService identityService = activitiRule.getIdentityService();
TaskService taskService = activitiRule.getTaskService();
FormService formService = activitiRule.getFormService();
Rozszerzenie testu
Przy użyciu interfejsu dostępnego poprzez TaskService
oraz FormService
proszę przetestować model z poprzednich zajęć (jak poniżej, ew. bez zdarzenia czasowego) dla dwóch scenariuszy (wybór każdej ze ścieżek po bramie XOR).
Przydatne fragmenty kodu:
identityService.setAuthenticatedUserId("kermit");
List<Task> taskList = taskService.createTaskQuery().processInstanceId(arg0).taskAssignee(arg0).list()
taskService.complete(arg0);
FormService formService = processEngine.getFormService();
TaskFormData taskFormData = formService.getTaskFormData(taskList.get(0).getId());
List<FormProperty> formList = taskFormData.getFormProperties();
Więcej informacji dostarczy Activiti API.
Uruchamianie modelu
Na bazie kodu używanego w testach możemy również napisać prosty program, który uruchomi silnik procesowy dla określonego procesu.
W samodzielnej aplikacji można utworzyć silnik procesowy przy użyciu:
ProcessEngine processEngine = pc.buildProcessEngine();
i następnie tak jak poprzednio mieć dostęp do odpowiednich serwisów zapewniających interfejsy do różnych funkcjonalności:
- OfferProcessingExecution.java
import java.util.*;
import org.activiti.engine.*;
import org.activiti.engine.runtime.ProcessInstance;
public class OfferProcessingExecution {
public static void main(String [] args)
{
ProcessEngineConfiguration pc = ProcessEngineConfiguration
.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = pc.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
RuntimeService runtimeService = processEngine.getRuntimeService();
IdentityService identityService = processEngine.getIdentityService();
repositoryService.createDeployment()
.addClasspathResource("diagrams/nazwa.bpmn20.xml") /* nazwa pliku */
.deploy();
Map<String, Object> variableMap = new HashMap<String, Object>();
variableMap.put("descriptionType", "short");
...
identityService.setAuthenticatedUserId("kermit");
ProcessInstance processInstance = /* podac id procesu z diagramu */
runtimeService.startProcessInstanceByKey("process-id", variableMap);
System.out.println("process instance id: " + processInstance.getId());
}
}
Proszę zapoznać się z Activiti Engine API i rozbudować aplikację do obsługi procesu.
Jedną z możliwości jest np. uruchomienie naszego procesu z ustawionymi parametrami, jak w jUnit teście, ale w trakcie działania w konsoli w odpowiednim momencie zapytanie o zmienną Specifications details
, następnie ustawienie tej wartości jako zmiennej procesu (do ustawienia wartości można użyć funkcji: RuntimeService.setVariable).
Przykład działania takiej aplikacji: