====== Lab. 1: Podstawy pracy z Activiti ====== ===== Signavio Process Editor ===== Proszę założyć konto na platformie Signavio: [[https://academic.signavio.com/p/register?link=ebe7cf4ad8d54e32a639e74d1c011d37|Registration for the Signavio BPM Academic Initiative]] zaznaczając opcję:\\ //I agree that anonymized versions of all models I create using this platform can be made available for research purposes.// Aby zalogować się do edytora należy na stronie [[http://www.signavio.com/bpm-academic-initiative/|Signavio BPM Academic Initiative]] wybrać **Academic Login**. [[http://www.manning.com/rademakers2/|{{ http://www.manning.com/rademakers2/rademakers2_cover150.jpg}}]] ===== Activiti BPM Platform ===== Materiały pomocnicze do laboratorium: * [[http://www.activiti.org/userguide/|Activiti User Guide]] * książka [[http://www.manning.com/rademakers2/|Activiti in Action]] Na potrzeby dzisiejszych zajęć na komputerach powinien być uruchomiony JBoss, na którym działa Activiti: /etc/init.d/jboss [start|stop] Proszę uruchomić w przeglądarce aplikację Activiti Explorer: http://localhost:8080/activiti-explorer, a następnie zalogować się na konto: login: kermit hasło: kermit Można także korzystać z wersji serwerowej: http://192.168.1.145:8080/activiti-explorer/ui/ Po zalogowaniu, na górnym pasku powinno widnieć menu złożone z 4 ikon. Służą one do administracji odpowiednio: * //Tasks// -- zadaniami, * //Processes// -- procesami, * //Reports// -- raportami, * //Manage// -- innymi kwestiami, np. użytkownikami, grupami, czy zarządzaniem bazą danych lub wdrożeniami procesów. ==== Założenie kont ==== W zakładce Groups (menu Manage) obejrzyj istniejące grupy użytkowników. Jako użytkownika administratora będziemy póki co używać użytkownika ''kermit'', natomiast przyda nam się użytkownik nie będący administratorem. Utwórz nowego użytkownika. Pamiętaj, aby nadać unikalny identyfikator. ==== Stworzenie nowego modelu procesu ==== Aby zapoznać się z działaniem aplikacji przygotujemy bardzo uproszczony model procesu ofertowania. Z menu proszę wybrać zakładkę **Processes**. Powinny pojawić się 3 zakładki: - //My instances// -- do obserwowania istniejących instancji procesu, - //Deployed process definitions// -- do uruchamiania procesów wdrożonych na platformie Activiti, - //Model workspace// -- do tworzenia nowych modeli oraz wdrażania lub edycji istniejących modeli procesów. W zakładce //Model workspace// klikamy przycisk //New model// i tworzymy nowy model procesu przy użyciu Activiti Modelera. Proszę nadać swojemu modelowi nazwę oraz opis. W otwartym oknie aplikacji **Activiti Modeler** proszę ustawić atrybuty procesu (z prawej strony okna). Istotnymi elementami są tutaj identyfikator procesu (//Process identifier//) i nazwa procesu (//Name//), dzięki którym odróżnimy nasz proces od innych naszych procesów czy procesów innych użytkowników. Proszę uzupełnić również pole autora procesu (//Process author//). ==== Modelowanie prostego procesu ==== Przeciągając z lewego menu element //Start event// rozpoczniemy modelowanie fragmentu docelowego procesu. Na początek zamodelujemy bardzo uproszczony proces, jak poniżej:\\ {{ :pl:dydaktyka:bim:lab1:proces1-diagram.png |}} Tak jak w przypadku procesu, tak samo dla elementów BPMNa po prawej stronie ustawiamy atrybuty. * Dla elementu //Start event//: * //Documentation//: Start proceeding with an offer. * //Initiator//: initiator (w tej zmiennej będzie trzymany użytkownik, który zainicjował proces) * //Name//: Offer received * //Form properties// - klikamy na ... i w nowym oknie ustawiamy wg poniższego screenshotu:\\ {{ :pl:dydaktyka:bim:lab1::form-properties.png |}} * Dla zadania //Specify offer//: * //Documentation//: Please add available specification for an offer as attachments. * //Assignments//: mamy 3 możliwości\\ * ''assignee'' -- przypisać zadanie konkretnemu użytkownikowi, * ''candidateUsers'' -- przypisać zadanie tak, by dowolny z kilku użytkowników mógł je wykonać, * ''candidateGroups'' -- przypisać zadanie tak, by dowolny użytkownik należący do przypisanej grupy mógł je wykonać.\\ W naszym wypadku ustawiamy tylko zmiennej ''assignee'' wartość ''${initiator}'' -- oznacza to, że jako wykonawcę zadania wskazujemy osobę, która uruchomiła proces. Ponadto dla tego zadania ustawiamy również //Form properties//: * //Specifications details// (id: ''specDetails'') - poziom szczegółowości specyfikacji przedmiotu zamówienia (póki co ustawiamy jako boolean), w dalszej części będziemy chcieli tę zmienną przerobić na typ enum (accurate, sufficient, insufficient). * //Person responsible// (id: ''responsible'') - osoba przyporządkowana do analizy formalnej wniosku (odpowiadająca za przeprowadzenie analizy); tutaj nastąpi przyporządkowanie takiej osoby i przypisanie jej do zmiennej. Póki co do przetestowania takiego prostego procesu rezygnujemy z dalszych elementów procesu. Tymczasem zamarkujmy jedno z końcowych zadań: //Approve offer//, w którym ustawiamy jedynie wykonawcę -- osobę, która została przyporządkowana do przeprowadzenia analizy formalnej (proszę użyć identyfikatora zdefiniowanej zmiennej). ==== Uruchomienie prostego procesu ==== Zapisujemy model i wyłączamy **Activiti Modeler**. Przechodzimy do **Activiti Explorera**. W zakładce //Model workspace// wybieramy nasz proces z menu i z listy //Model action// wybieramy **Deploy**. Powinno przenieść nas do zakładki //Deployments// (w **Manage**), gdzie wybieramy nasz process (klikając na jego nazwę) w sekcji //Process Definitions//\\ {{ :pl:dydaktyka:bim:lab1::proces1-deploy.png |}} Po wdrożeniu, z zakładki //Deployed process definitions// możemy uruchomić nasz proces przyciskiem **Start process**. Powinien otworzyć się formularz:\\ {{ :pl:dydaktyka:bim:lab1:proces1-run1-form.png |}} Uzupełniamy formularz dowolnymi danymi i klikamy **Start process**. Jeśli wszystko się powiodło, w zakładce **Processes** -> //My instances// powinniśmy widzieć instancję naszego procesu, Ponieważ pierwsze zadanie zostało przypisane do nas (użytkownika, który uruchomił proces), klikamy ikonę **Tasks** i przechodzimy zakładki //Inbox//, gdzie powinno czekać na nas zadanie //Specify offer//. Uzupełniamy pole //Responsible// nazwą innego __istniejącego__ użytkownika (np. ''fozzie'' lub zdefiniowanego wcześniej użytkownika), możemy również zaznaczyć checkbox //Specifications details//. Następnie klikamy **Complete task**. Teraz klikamy ikonę **Processes** i przechodzimy do zakładki //My instances//, aby obejrzeć diagram, listę zadań i zmienne naszego procesu. Ponieważ zadanie //Approve offer// czeka na innego użytkownika, logujemy się na konto podanego użytkownika (jeśli był to użytkownik ''fozzie'', jego hasło to: ''fozzie''), po czym kończymy zadanie //Approve offer//. Wracamy na nasze konto i sprawdzamy, czy w zakładce //My instances// zniknął nasz proces. Historyczne dane naszego procesu są zapisane w bazie danych, której szybki podgląd mamy dostępny w zakładce //Database// (po kliknięciu w ikonę **Manage**). Proszę odszukać tabelę ''ACT_HI_PROCINST'' i znaleźć tam swój proces. Ponieważ w laboratorium nasza instalacja Activiti z Activiti Modelerem nie ma skonfigurowanego trwałego zapisu modeli, zapiszemy nasz model u siebie na dysku. W tym celu z menu //Deployments// wybieramy //Show all// i odszukujemy nasz proces. Proszę zapisać na dysku plik swojego procesu (plik z rozszerzeniem **.bpmn20.xml**) i obejrzeć jego składnię. Zwróć uwagę na atrybuty tagu ''process'', a także dodatkowe atrybuty innych elementów procesu używane typowo przez Activiti. ==== Rozbudowa modelu ==== Wracamy do zakładki //Model workspace//, by rozbudować nasz model o bramę. W zależności od poziom szczegółowości specyfikacji oferty, w przypadku, gdy jest ona niewystarczająco szczegółowa, będziemy chcieli prosić oferent o przesłanie dodatkowych informacji. Aby rozbudować nasz model wybieramy odpowiedni model, po czym klikamy //Edit model//. Proszę rozbudować model do postaci jak na poniższym diagramie:\\ {{:pl:dydaktyka:bim:lab1:process3-diagram.png?800|}} Istotnym elementem modelu jest użycie odpowiednich warunków na przepływach po bramie XOR (w zależności od wartości zmiennej ''specDetails''). Sprawdź w [[http://www.activiti.org/userguide/index.html|Activiti User Guide]], w jaki sposób zdefiniować odpowiednie warunki dla tej bramy. ===== Dalsza rozbudowa modelu ===== === Timer Boundary Event === Nasz podproces składa się z dwóch zadań, polegających na tym, że kontaktujemy się z klientem mailowo oraz dodatkowo dzwonimy do niego, by poinformować o przesłanym mailu. W bardzo szczegółowej wersji powinniśmy jeszcze mieć odpowiednie zadanie z oczekiwaniem na odpowiedź od klienta -- dla uproszczenia przyjmijmy, że gdy klient uszczegółowił wystarczająco przez telefon informacje, to użytkownik kończy zadanie "Call customer", w innym wypadku nie kończy tego zadania do czasu, aż nie uzyska wystarczających informacji. W standardowym przypadku, gdy minie deadline na składanie ofert, podproces powinien automatycznie zakończyć się i zakończyć cały proces. W tym celu rozbudujemy proces przy użyciu ''Timer Boundary Event'': {{ :pl:dydaktyka:bim:lab1:process5-eclipse-example.png?800 |}} Element ''Timer Boundary Event'' ma następujące atrybuty: * ''cancelActiviti'' -- w naszym przypadku należy ustawić **''true''**, by podproces został przerwany w momnecie wywołania zdarzenia, * ''timeDate'' -- ustawia konkretną datę (w formacie [[wp>ISO 8601]]), kiedy odpalić zdarzenie, np. 2012-12-06T17:00:00 * ''timeDuration'' -- ustawia okres czasu, który musi minąć aż zdarzenie zostanie wyzwolone, np. dla 3 dni: P3D * ''timeCycle'' -- ustawia powtarzające się interwały czasu, by wyzwalać zdarzenie periodycznie, np. 5 powtórzeń, z których każde trwa godzinę: R5/PT1H Aby móc przetestować proces i nie czekać zbyt długo na efekty proponuję ustawić ''timeDuration'' na 2 minuty. Proszę przetestować działanie swojego modelu, obejrzeć diagram instancji procesu w czasie oczekiwania (powinien wyglądać podobnie do modelu widocznego na poniższym diagramie): {{ :pl:dydaktyka:bim:lab1:process5-run-example.png?800 |}} W tym momencie w zakładce **Manage** -> **Jobs** powinien pojawić się nowy ''Timer job''. W razie potrzeby istnieje tu możliwość ręcznego wyzwolenia zdarzenia przyciskiem **Execute**: {{ :pl:dydaktyka:bim:lab1:timer-job.png |}} === Mail task === Jedno z zadań w podprocesie powinno wysyłać mail do klienta. \\ W pełnym procesie wcześniej należałoby pobrać dodatkowe dane do przesłania maila \\ np. jakich szczegółów chcielibyśmy się dowiedzieć,\\ natomiast u nas na razie zamarkujemy działanie tego zadania. Nie mamy skonfigurowanego serwera poczty, ale możemy zaadresować maila na adres lokalny, \\ np.: ''student@AML-Lab-316.geist.agh.edu.pl''.\\ Po przesłaniu maila możemy sprawdzić w terminalu poleceniem ''mail'', czy mamy go na skrzynce. Proszę w treści maila umieścić dane trzymane w jakiejś zmiennej instancji procesu.