|
|
pl:dydaktyka:bim:lab2_2014 [2015/12/02 12:32] kkluza [Instalacja wtyczki m2e] |
pl:dydaktyka:bim:lab2_2014 [2019/06/27 15:50] |
====== 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 ===== | |
| |
W przypadku, gdy brakowałoby odpowiedniej wtyczki m2e w środowisku eclipse, \\ | |
proszę ją doinstalować ze strony: [[http://download.eclipse.org/technology/m2e/releases|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. | |
| |
===== Utworzenie projektu i modelu ===== | |
| |
Proszę w eclipsie stworzyć nowy projekt: | |
**New -> Project...**, następnie **Activiti -> Activiti Project**. | |
| |
W związku z tym, że wtyczka była dla starej wersji Activiti, | |
a my będziemy używali najnowszej wersji, \\ | |
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/''.\\ | |
Następnie skonwertuj projekt: **Configure -> Convert to Maven 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 ===== | |
| |
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. | |
| |
Używając [[http://activiti.org/javadocs/org/activiti/engine/test/ActivitiRule.html|ActivitiRule]] | |
mamy dostęp do odpowiednich serwisów zapewniających interfejsy do różnych funkcjonalności: | |
* **[[http://www.activiti.org/javadocs/org/activiti/engine/RepositoryService.html|RepositoryService]]** -- zapewnia funkcjonalność do wdrażania, wykonywania zapytań, czy usuwania procesów, | |
* **[[http://www.activiti.org/javadocs/org/activiti/engine/RuntimeService.html|RuntimeService]]** -- zapewnia interfejs do uruchamiania i wykonywania zapytań do instancji procesów (również ich zmiennych), | |
* **[[http://www.activiti.org/javadocs/org/activiti/engine/IdentityService.html|IdentityService]]** -- zapewnia interfejs do autentykacji. | |
* **[[http://activiti.org/javadocs/org/activiti/engine/TaskService.html|TaskService]]** -- zapewnia interfejs do zarządzania zadaniami. | |
* **[[http://activiti.org/javadocs/org/activiti/engine/FormService.html|FormService]]** -- zapewnia interfejs do zarządzania formularzami. | |
| |
<code java> | |
RepositoryService repositoryService = activitiRule.getRepositoryService(); | |
RuntimeService runtimeService = activitiRule.getRuntimeService(); | |
IdentityService identityService = activitiRule.getIdentityService(); | |
TaskService taskService = activitiRule.getTaskService(); | |
FormService formService = activitiRule.getFormService(); | |
</code> | |
| |
| |
===== 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). | |
| |
{{:pl:dydaktyka:bim:lab2:process5-eclipse-example.png?800|}} | |
| |
Przydatne fragmenty kodu: | |
| |
* autentykacja użytkownika (w tym wypadku: kermit): | |
<code java> | |
identityService.setAuthenticatedUserId("kermit"); | |
</code> | |
* interfejs do pobrania listy zadań dla określonego użytkownika: | |
<code java> | |
List<Task> taskList = taskService.createTaskQuery().processInstanceId(arg0).taskAssignee(arg0).list() | |
</code> | |
* jeśli zadanie zostało ukończone prawidłowo, możemy wywołać: | |
<code> | |
taskService.complete(arg0); | |
</code> | |
* interfejs do przeglądania formularzy: | |
<code java> | |
FormService formService = processEngine.getFormService(); | |
TaskFormData taskFormData = formService.getTaskFormData(taskList.get(0).getId()); | |
List<FormProperty> formList = taskFormData.getFormProperties(); | |
</code> | |
| |
Więcej informacji dostarczy [[http://activiti.org/javadocs/|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: | |
<code java> ProcessEngine processEngine = pc.buildProcessEngine(); </code> | |
i następnie tak jak poprzednio mieć dostęp do odpowiednich serwisów zapewniających interfejsy do różnych funkcjonalności: | |
| |
<code java 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()); | |
} | |
} | |
</code> | |
| |
Proszę zapoznać się z [[http://activiti.org/javadocs/|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: [[http://activiti.org/javadocs/org/activiti/engine/RuntimeService.html#setVariable%28java.lang.String,%20java.lang.String,%20java.lang.Object%29|RuntimeService.setVariable]]). | |
| |
Przykład działania takiej aplikacji: | |
| |
{{:pl:dydaktyka:bim:lab2:eclipse-execution-example.png|}} | |
| |