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.
W przypadku, gdy brakowałoby odpowiedniej wtyczki m2e w środowisku eclipse,
proszę ją doinstalować ze strony: wtyczkę m2e (Maven Integration for Eclipse) w wersji 1.4.1.
Gdyby brakowało slf4j, można doinstalować je z innego repozytorium, np. http://www.fuin.org/p2-repository/.
Po instalacji należy zrestartować eclipse'a.
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.
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 repositoryService = activitiRule.getRepositoryService(); RuntimeService runtimeService = activitiRule.getRuntimeService(); IdentityService identityService = activitiRule.getIdentityService(); TaskService taskService = activitiRule.getTaskService(); FormService formService = activitiRule.getFormService();
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.
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:
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: