6. část: Implementace procesu v BPEL

Petr Vašíček, IBA CZ

V tomto díle si nejprve představíme backendovou část aplikace, která obsahuje funkcionalitu pro práci s objednávkami. Ukážeme si pro představu diagram tříd a rozhraní webové služby, kterou tento modul poskytuje. Uvedeme instrukce pro stažení a deploy backendového modulu na aplikační server, abychom webovou službu mohli využít z business procesu.

Ve druhé části rozdělíme BPMN proces založení objednávky do několika úseků, které následně převedeme do jazyka BPEL. Nebudeme se zabývat přílišnými detaily při implementaci procesu ani si uvádět návod jak přesně tento konkrétní proces v prostředí NetBeans „naklikat“, místo toho nastíníme obecný postup při tvorbě BPEL dokumentu z BPMN modelu, jak vše napojit na webové služby a úspěšně nasadit a spustit v aplikačním serveru. BPEL modul i kompozitní aplikaci samozřejmě nabídneme ke stažení, abyste si mohli příklad vyzkoušet v praxi.

Tento díl je již hodně o IT, BPEL a programování v Java EE. Podle ohlasů na předchozí díly se dá očekávat, že mu část čtenářů nebude rozumět (hlavně vyhranění „procesáři“), takže nevěšte hlavu a berte to jako ilustraci toho, co se v IT musí udělat, než se BPMN „omalovánce“ vdechne život.

Objednávkový modul

Backendová část naší aplikace bude implementována pomocí Enterprise Java Beans 3.0, tedy standardu pro vývoj distribuovaných aplikací v jazyce Java. V projektu budeme pracovat se čtyřmi entitními beany (v praxi databázovými tabulkami). Nyní si uvedeme o jaké půjde a jaké vlastnosti (sloupce tabulky) budou kromě identifikátoru (primárního klíče) mít:

  • UserEntity – uživatel systému; u něj budeme z důvodu jednoduchost evidovat pouze jeho jméno a množinu jeho rolí, ve skutečném systému by byla řada vlastností samozřejmě daleko širší.
  • RoleEntity – uživatelská role; má název (např. „Technické oddělení“), unikátní textový identifikátor („tech“) a množinu uživatelů, jež do této role spadají. Každý uživatel může mít žádnou, jednu nebo více těchto rolí.
  • ItemEntity – položka katalogu; vedeme u ní název a cenu. U ceny budeme pro zjednodušení počítat, že jde vždy o jednu měnu, v našem případě koruny.
  • OrderEntity – objednávka; budeme u ní evidovat položku ke které se vztahuje a její kvantitu, datum založení, stav (nová, schválená, zamítnutá), uživatele, který ji objednal a roli, která v daném okamžiku rozhoduje o schválení. Jedna objednávka bude v našem případě pouze na jednu položku s možností vzít více kusů (tedy kvantita větší než 1).

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 1: Diagram tříd objednávkového modulu

Při určení rozhraní webové služby, kterou bude modul poskytovat můžeme vycházet z potřeb business procesu a webové aplikace. Když se podíváme na BPMN diagram vidíme tři typy akcí jež proces volá na backendu – uložení objednávky, nastavení role k posuzování objednávky a označení stavu objednávky. Kromě těchto tří metod budeme ve webové službě potřebovat implementovat i metody pro webovou aplikaci – získání informací o uživateli, položce a objednávce, získání seznamu všech uživatelů, položek a objednávek a seznam objednávek podle zakladatele a schvalovatele. Místo entit bude modul vracet tzv. data transfer objekty (DTO), jenž budou mít veškeré vlastnosti, které budeme u entit ve webové aplikaci potřebovat. V rozhraní webové služby se tedy budou nacházet následující operace:

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 2: Rozhraní webové služby objednávkového modulu

Nyní si popíšeme, jak provést deploy modulu na aplikační server. Nejprve si stáhněte z této adresy distribuční Java archív OrderingModule.jar. Pro jeho nasazení na server nejprve server spusťte z prostředí NetBeans aplikační server Glassfish (Services -> Servers -> Glassfish V2 -> Start). Následně otevřete administrační konzoli serveru (na adrese http:/localhost:4848/, přihlašovací údaje admin / adminadmin), na pravé straně vyberte z nabídky Applications -> EJB Modules a v hlavní části webové stránky zvolte „Deploy“. V části „Location“ vyberte umístění staženého Java archívu a zvolte „OK“.

V současné chvíli by již měly být v databázi připravené tabulky pro jednotlivé entity. V záložce Services v prostředí NetBeans vyberte „Databases“, nalezněte databázi s názvem sample (název zdroje „jdbc:derby://localhost:1527/sample“ a z kontextového menu zvolte „Connect...“. V záložce „Tables“ můžete zkontrolovat existenci tabulek ITEMENTITY, ORDERENTITY, ROLEENTITY, USERENTITY, a USERENTITY_ROLEENTITY. Nyní ještě potřebujeme naplnit tabulku rolí, uživatelů a položek testovacími údaji. Stáhněte si z této adresy sql skript pro naplnění těchto tabulek. Po kliknutí pravým tlačítkem na databázi sample vyberte „Execute Command...“, do textového pole vložte obsah staženého souboru create.sql a spusťte příkaz ikonkou se zelenou šipkou v pravé horní části obrazovky. Po provedení příkazu by měly být tabulky naplněny, což můžete zkontrolovat zvolením „View Data...“ v kontextových nabídkách jednotlivých tabulek.

Jako poslední zkontrolujeme správné nasazení webové služby modulu. Otevřeme v prohlížeči adresu http://localhost:8080/OrderWSService/OrderWS?wsdl a měli bychom uvidět definici webové služby ve formátu XML, včetně definice všech operací, které jsme si uvedli výše. Nyní je tedy ze strany backendového modulu vše připraveno a můžeme začít s implementací samotného procesu.

Implementace procesu

Jako předlohu pro tvorbu BPEL dokumentu si vezmeme proces namodelovaný pomocí notace BPMN ze 4. dílu. Rozdělíme si jej do tří částí, které budeme postupně převádět do implementační formy. První úsek jsme již částečně naimplementovali minule, pouze jsme vynechali vazbu na webovou službu backendu. Proces bude mít celkem tři vstupy, to znamená, že webová služba, která bude představovat rozhraní procesu, bude mít tři operace – vytvoření objednávky (createOrder), rozhodnutí technického oddělení (techDecide) a rozhodnutí finančního ředitele (findirDecide).



Ilustrace 3: BPMN proces rozdělený na jednotlivé části

Po vytvoření BPEL modulu a BPEL procesu v něm je třeba vytvořit WSDL soubor, jež slouží k popisu webové služby procesu a který bude definovat zmíněné tři operace, dále pak XSD soubor, jenž popisuje použité datové typy. Postup tvorby těchto souborů si uvádět nebudeme, budou ale k dispozici hotové spolu s celým projektem. Nyní již zbývá pouze naimportovat WSDL a XSD soubor k webové službě backendu. Z kontextové nabídky BPEL projektu vybereme New -> Other a pak z kategorie XML zvolíme External WSDL Document(s) a stiskneme tlačítko „Next“. Do textového boxu zkopírujeme adresu, na které se nachází definice webové služby objednávkového modulu, tedy http://localhost:8080/OrderWSService/OrderWS?wsdl a stiskneme „Finish“.

Nyní již máme v projektu všechny potřebné soubory a k začátku implementace procesu nám chybí pouze vytvořit v BPEL dokumentu odkazy na obě použité webové služby, tedy partner linky. Otevřeme tedy (příp. vytvoříme) soubor startOrder.bpel a do okna, které se otevře, přetáhneme oba WSDL soubory, tedy startOrder.wsdl a OrderWS.wsdl. První partner link můžeme pojmenovat například „Interface“ (rozhraní procesu) a druhý „OrderModule“ (webová služba objednávkového modulu).

První část

První část je v obrázku ohraničen červenou čárou. Proces je odstartován přijetím požadavku na vytvoření objednávky, tedy v BPMN objekt Start Message Event. V BPELu je alternativou k tomuto objektu aktivita Receive, tu tedy umístíme na začátek procesu a navážeme ji na operaci createOrder v partner linku Interface. Následně musí proces provést dvě aktivity – vytvořit objednávku (uložit ji do databáze) a nastavit jako schvalovatele technické oddělení. Tyto aktivity, tedy vyvolání webových služeb, lze v BPELu realizovat pomocí objektu Invoke. První task (nazveme jej „Create“) zavolá operaci createOrder v partner linku OrderModule a předá ji data, která zaslal uživatel. Druhá pak volá operaci setApprover a té předá unikátní textový identifikátor dané role, tedy v našem případě „tech“. Nakonec vrátíme uživateli odpověď, jež obsahuje ID nově vytvořené objednávky. To provedeme pomocí BPEL aktivity Reply. Pro manipulaci s proměnnými využijeme dvou aktivit typu AssignAssignOrderDetails a AssigntTechApprover. Jak vypadá první část lze vidět na následujícím obrázku:

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 4: První část BPEL procesu

Druhá část

V druhé části procesu zpracujeme rozhodnutí technického oddělení a na jeho základě označíme objednávku za schválenou či zamítnutou. Rozhodování finančního ředitele si necháme až do poslední části. V BPMN modelu je na začátku druhého úseku objekt typu Message Intermediate Event, který mapujeme do aktivity Receive (pojmenujeme „ReceiveTechDecision“) a spojíme jí s operací techDecide v partner linku Interface. To znamená, že pokud webový klient zavolá tuto operaci a proces čeká v aktivitě ReceiveTechDecision, tak bude přijata zaslaná zpráva (obsahující identifikátor objednávky a rozhodnutí technického oddělení) a proces bude pokračovat dále.

Nyní budeme chtít uživateli vrátit zprávu (operace techDecide je typu request – response), to učiníme opět pomocí aktivity Reply a obsahem této zprávy bude pouze pravdivostní hodnota „true“. Dále následuje v BPMN diagramu Data-based Exclusive Decision, tedy rozhodnutí na základě dat, jež je v BPELu zastoupeno aktivitou If. Tu tedy vložíme do procesu a pomocí BPEL mapperu (editor pro přiřazení proměnných) navolíme podmínku pro první větev rozhodování. Můžeme využít vizuálních prvků a pomocí nich navolit podmínku „ReceiveTechDecision.type = approve“ tak, jak je to vidět na následujícím obrázku:

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 5: Rozhodnutí technického oddělení

Pokud tedy technické oddělení objednávku schválilo, proces projde první větví, v opačném případě druhou. Podle toho musíme označit objednávku za schválenou či zamítnutou. Do první větve tedy umístíme aktivitu AssignApproved a do druhé AssignDeclined, ve kterých přiřadíme příslušný konečný stav objednávky. V BPMN diagramu máme označení objednávky za schválenou či zamítnutou ve dvou aktivitách, po nichž následuje konec procesu (End Event). Při převodu do BPELu můžeme buďto ponechat obě aktivity zvlášť (jedna Invoke aktivita v každé větvi), nebo je sloučit do jedné (jeden Invoke po sloučení větví), s tím, že v jednotlivých větvích přiřadíme příznak schválení či zamítnutí do vstupní zprávy volané operace webové služby backendu SetOrderState. My zvolíme druhou možnost a pod sloučení větví přidáme Invoke aktivitu SetFinalOrderState, která zavolá příslušnou operaci v objednávkovém modulu a nechá změnit stav objednávky podle předchozího určení. Druhá část je tedy hotova, pokračování implementovaného procesu opět můžete vidět na obrázku.

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 6: Druhá část BPEL procesu

Třetí část

Nyní by byl proces kompletní, pokud bychom chtěli, aby o objednávce rozhodovalo pouze technické oddělení. Proces tedy upravíme tak, aby v určitém případě musel rozhodovat i finanční ředitel. Poslední část procesu je v BPMN modelu ohraničena zelenou čárou. Prvním elementem je rozhodování podle částky, což už víme, že je v BPELu realizováno pomocí aktivity If. Nejprve ovšem musíme cenu objednávky zjistit. Jelikož je v objednávce pouze jeden druh zboží, získáme informace o něm včetně ceny zavoláním operace GetItemDTO ve webové službě backendu. Tato operace nám vrátí cenu objednané položky, kterou znásobíme objednanou kvantitou (tu zadal uživatel při vytváření objednávky) a tak získáme celkovou cenu objednávky. Vyvolání zmíněné operace i rozhodovací prvek vložíme do té větve, která značí případ, kdy objednávka byla schválena technickým oddělením (ve druhé větvi ponecháme pouze aktivitu AssignDeclined). Celkovou cenu objednávky porovnáme s částkou 40.000, čímž se nám proces rozdělí do dvou větví – když je částka větší a když je stejná nebo menší. Následující obrázek ukazuje, jak vypadá výraz, podle kterého se vyhodnocuje rozhodnutí o ceně objednávky:

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 7: Rozhodnutí podle ceny objednávky

Zbytek procesu si již popíšeme stručně, jelikož rozhodnutí finančního ředitele je obdobou předchozího rozhodnutí technického oddělení. Nejprve tedy nastavíme objednávku k posouzení vyvoláním operace setApprover a čekáme na přijetí rozhodnutí v Receive aktivitě na operaci findirDecide. Následně provedeme obdobné rozhodnutí podle schválení či zamítnutí objednávky, jako v předchozím případě. Pozor si musíme dát na to, aby v každém z možných průchodů procesem (celkem jsou čtyři) byl správně určen konečný stav objednávky. Následující obrázek ukazuje kompletní proces implementovaný v jazyce BPEL tak, jak jej umožňuje vizualizovat BPEL designer v prostředí NetBeans IDE. Kompletní projekt, který obsahuje veškeré potřebné soubory, si můžete stáhnout z této adresy.

Kliknutím obrázek zvětšíte v novém okně.

Ilustrace 8: Kompletní BPEL proces

V příštím díle

Příště si ukážeme, jak implementovaný proces otestovat a jaké možnosti skýtá jeho ladění (debugging). Dále představíme webovou aplikaci, pomocí které může uživatel s procesem interagovat. Projdeme si také různé scénáře životního cyklu objednávky a vysvětlíme si, jaké události při nich v procesu probíhají.

12 Comments:

Anonymní said...

Jediné štěstí, že jste, pane Vašíčku, publikoval tento článek na víkend. To se nedá za míň než 3 dny ani pořádně přečíst, natož vyzkoušet. Uvidím, zda pochopím, nebo radši zůstanu u omalovánek.

Anonymní said...

Chtěla jsem si celý příklad načíst jako hotový, ale bohužel jsem nepochopila jak. Prosím, prosím, naveďte...

Anonymní said...

Taky jsem to nějak zvládnul a chodí to. Je pravda, že jsem postupoval krok po kroku ale moc nevím, co k čemu bylo dobré.

Možná by bývalo stačilo dát nějaké vzorové definice služeb a ukázat, jak se z BPEL volají na nějaké vyšší přehledové úrovni.

Anonymní said...

Jak probíhá orchestrace služeb z BPEL si ukážeme lépe v příštím díle při procházení jednotlivých scénářů.

Anonymní said...

Pro kompletní načtení hotového příkladu:
1. Z prostředí NetBeans spustit server Glassfish a otevřít administrační konzoli (viz. návod v článku).
2. Z adresy http://www.ibacz.eu/Serial-o-BPM-6-dil stáhnout OrderingModule.jar a podle návodu v článku provést jeho deploy na server.
3. Ze stejné adresy stáhnout create.sql a opět podle instrukcí spustit dotazy nad databází jdbc:derby://localhost:1527/sample.
4. Stáhnout poslední soubor, OrderingBPEL.zip, rozbalit jej do libovolného adresáře a otevřít jako projekt z prostředí NetBeans.
5. Pro deploy procesu na server je třeba jej vložit do kompozitní aplikace, návod je v minulém díle a bude ještě znovu příště.

Anonymní said...

Děkuji velice za návod, už se zdařilo.

Anonymní said...

Trochu off topic...nemá někdo zkušenost z SW nástrojem ADONIS ve světě má skvělé reference
http://www.boc-group.com/index.jsp?file=WP_acea73610c440f35.12da40.f2bea02b8b.-7fe4&lg=en

a cenově se jeví více než dobře.
Předem díky
Jarek

Anonymní said...

Community edition je navíc úplně zdarma. Tady na portále je recenze. Já s ním dělám už delší dobu a pokud ho porovnám s Arisem, má lepší analytické možnosti (přesněji co mám v adonisu rovnou dostupné, k tomu musím v arisu naprogramovat skript).

Anonymní said...

to kan :
díky za info asi ještě zkusím kontaktovat firmu, která s tímto nástrojem pracuje zda-li by nebyla možnost exkurze:-)

Anonymní said...

Tak co - nebude už další díl? (A nejlépe nějaký mírně lehčí:)

Anonymní said...

Možná jedna kacířská myšlenka do tohoto seriálu...není pro firmy, které chtějí začít s procesním řízením tento seriál pekelnou pastí?..z mých nemnohých zkušeností, ale hlavně dle zkušeností špičkových odborníků pro které je transformace firem denní chleba, bych si dokázal představit impementaci procesního řízení i s nástroji Visio + excel + outlook. Podle mne by SW měl být pouze nástroj nikoliv cíl...nebo se mýlím?

Anonymní said...

Použitím pouze Vision/Excel/Outlook by jste se příbližil maximálne k BPMS 1.0. Zatím co my zde řešíme BPMS 2.0. Velice pěkně jsou rozdíly zmíněny v přednášce V. Kalendy.

Zjednodušeně řečeno, v BPMS 1.0 jste sice schopni proces modelovat, ale již né tak dobře uchopit - monitorovat a následně optimalizovat, což je alpha a omega BPM.

ISSN 1802-5676  | Copyright © 2003-2008 BPS Business Process Services