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: 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.

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),
  • IdentityService – zapewnia interfejs do autentykacji.
  • 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:

  • autentykacja użytkownika (w tym wypadku: kermit):
identityService.setAuthenticatedUserId("kermit");
  • interfejs do pobrania listy zadań dla określonego użytkownika:
List<Task> taskList = taskService.createTaskQuery().processInstanceId(arg0).taskAssignee(arg0).list()
  • jeśli zadanie zostało ukończone prawidłowo, możemy wywołać:
taskService.complete(arg0);
  • interfejs do przeglądania formularzy:
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:

pl/dydaktyka/bim/lab2_2014.txt · ostatnio zmienione: 2017/07/17 08:08 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0