2007.01_Business Process Execution Language_[Aplikacje Biznesowe].pdf

(500 KB) Pobierz
441066273 UNPDF
Aplikacje
biznesowe
Piotr Skrobisz
Business Process
Execution Language
Materiały do artykułu
zamieszczone zostały
na płycie CD 1
i wymagania klientów, wymuszają na przed-
siębiorstwach ciągłe udoskonalanie i zmia-
nę procesów biznesowych. Powoduje to dodawanie
coraz to nowszych aplikacji i rozbudowę istniejących
systemów. W irmach o niskiej komputeryzacji budo-
wa nowych systemów wspierających jej działalność,
jak CRM ( Customer Relationship Management ), czy
ERP ( Enterprise Resource Planning ), przynosi duży
zwrot z inwestycji. Jednak przy dużej liczbie wdro-
żonych aplikacji, zwrot z coraz to nowszych projek-
tów maleje. Szefowie działów IT muszą borykać się
z napiętymi planami, ograniczonymi budżetami, ro-
snącą złożonością systemów informatycznych, ryzy-
kiem ich rozbudowy i coraz trudniejszą replikacją da-
nych pomiędzy niekompatybilnymi systemami.
Odpowiedzią na te problemy jest architektura zo-
rientowana na serwisy (ang. Service Oriented Archi-
tecture ), w skrócie SOA. Dzięki niej możliwe jest bu-
dowanie nowych wielofunkcyjnych aplikacji poprzez
agregację funkcjonalności już istniejących systemów.
Odbywa się to w sposób 2-fazowy. Najpierw udostęp-
niane są serwisy, które eksponują usługi już istnieją-
cych systemów. Następnie wiele serwisów jest łączo-
nych i komponowanych w jeden proces biznesowy.
Przykłady zastosowań
Oracle BPEL Process Manager’a
• State Children’s Health Insurance Program (SCHIP).
Amerykańska irma Policy Studies, Inc. wykorzystała
technologię BPEL do budowy systemu typu worklow,
wspierającego przetwarzania wniosków rejestracji do
amerykańskiego programu ubezpieczeń SCHIP;
• Dostawca elektryczności – integracja aplikacji w od-
działach. Firma WIPRO użyła technologii BPEL do
usprawnienia komunikacji pomiędzy oddziałami jed-
nego z dużych dostawców elektryczności. Każdy z lo-
kalnych oddziałów posiadał swoją własną aplikację do
obsługi procesów biznesowych. Tak duża heteroge-
niczność wymusiła zastosowanie architektury SOA;
• Corrections Corporation Of America (CCA) – inte-
gracja aplikacji dla systemu więziennictwa. BPEL
został wykorzystany przez irmę BIAS do zaimple-
mentowania wymiany danych pomiędzy systemami
dwóch amerykańskich irm z sektora więziennictwa
– CCA i Hamilton County Jail Systems (CJIS);
• Health Canada – kontrola wydawania i niszcze-
nia leków. W Kanadzie BPEL znalazł zastosowa-
nie przy automatyzacji procesu kontroli wydawania
i niszczenia leków. Budowa systemu wymagała in-
tegracji z wieloma państwowymi wydziałami i agen-
cjami oraz instytucjami międzynarodowymi;
• Lufthansa Flight Training (LFT) – system CRM.
Spółka LFT, należąca do Lufthansa AG, wykorzy-
stała BPEL do budowy łatwo modyikowalnego sys-
temu CRM zintegrowanego z SAP Financials i inny-
mi wykorzystywanymi w irmie aplikacjami;
• Washington Group International (WGI) – system
ERP. WGI dostarcza usług z najróżniejszych sek-
torów przemysłu, jak budownictwo, górnictwo,
transport, czy energetyka. Działalność takiej irmy
wspierana jest przez ogromną liczbę najróżniejsze-
go oprogramowania i serwerów. Przy tak heteroge-
nicznym środowisku BPEL okazał się idealną tech-
nologią do budowy systemu ERP.
SOA i BPEL
SOA było rozwiązaniem znanym już w ubiegłym dzie-
sięcioleciu. Jednakże rynek cierpiał na brak ustanda-
ryzowanego sposobu integracji systemów. Obecnie
coraz większą popularnością cieszy się Business Pro-
cess Execution Language for Web Services (BPEL lub
BPEL4WS). Jest to język, który służy do deiniowania
i wykonywania procesów biznesowych z wykorzysta-
niem web serwisów, za pomocą których wyekspono-
wane są serwisy podsystemów. Budowa procesu biz-
nesowego polega na łączeniu i koordynowaniu wielu
web serwisów w jednym przepływie.
BPEL łączy cechy dwóch starszych języków
służących do opisu przepływów pracy (ang. work-
low ). Pierwszym z nich jest WSFL ( Web Service
Flow Language ), stworzony przez IBM i oparty na
teorii grafów skierowanych. Drugim jest dziecko Mi-
crosoftu, XLANG, który wykorzystywał ideę sche-
matów blokowych.
Pierwsza wersja BPEL-a pojawiła się w sierpniu
2002 roku. Przyciągnęła ona uwagę wielu irm, któ-
re przyłączyły się do współpracy. Zaowocowało to
w marcu 2003 roku stworzeniem wersji 1.1, któ-
ra miesiąc później została przekazana do organiza-
cji standaryzacyjnej OASIS ( Organization for the Ad-
vancement of Structured Information Standards ).
Autor pracuje w irmie Oracle Corporation w dziale Mobi-
le, Wireless and Voice Solutions, gdzie zajmuje się pro-
jektowaniem systemów informatycznych. Jest również
doktorantem w Instytucie Badań Systemowych PAN.
Kontakt z autorem: piotr.skrobisz@oracle.com
Podstawy języka
Deinicja procesu biznesowego w języku BPEL pole-
ga na określeniu porządku wywoływanych web ser-
wisów. Czy mają być one wywoływane sekwencyj-
36
www.sdjournal.org Software Developer’s Journal 1/2007
N ieustannie zmieniające się warunki rynkowe
441066273.026.png 441066273.027.png 441066273.028.png
Business Process Execution Language
nie, czy też równolegle. Możliwe jest określenie operacji warun-
kowych, pętli, czy też obsługa wyjątków. Język pozwala na de-
iniowanie zmiennych, kopiowanie i przypisywanie ich wartości.
Dzięki temu możliwe jest przekazywanie danych pomiędzy web
serwisami i gromadzenie ich w trakcie realizacji procesu.
Składnia języka opiera się na XML-u, a z racji tego, że pro-
ces operuje na web serwisach, wykorzystywane są lub mogą
być między innymi takie standardy, jak SOAP, WSDL, UDDI,
WS-Addressing, WS-ReliableMessaging, WS-Security, WS-
Coordination, WS-Transaction. Należy zauważyć, że proces
BPEL-owy sam w sobie jest web serwisem i może być wyko-
rzystywany przez inne procesy, jako podproces. Proces biz-
nesowy składa się z czynności. Do podstawowych należą na-
stępujące elementy:
<pick> - umożliwia wybór jednej z wielu alternatywnych
ścieżek na podstawie zdeiniowanych zdarzeń;
<catch> i <catchAll> - pozwalają na przechwytywanie i ob-
sługę wyjątków podobnie, jak w Javie w przypadku kon-
strukcji try-catch.
Do bardzo ważnych elementów języka należą dodatkowo:
<scope> - pozwala na wyodrębnianie logicznych bloków
w całym procesie. Taki blok może posiadać lokalne zmien-
ne niewidoczne poza nim, obsługę wyjątków dla czynno-
ści w nim zawartych oraz obsługę rekompensacji w przy-
padku wycofywania transakcji;
<partnerLink> - wskaźnik na wykorzystywane web serwisy;
<variable> - deinicja zmiennej.
<invoke> - wywołanie web serwisu;
<receive> - oczekiwanie na wywołanie procesu przez
klienta i odebranie od niego wiadomości;
<reply> - zwrócenie odpowiedzi w przypadku synchronicz-
nego wywołania procesu;
<assign> - operacje na wartościach zmiennych;
<wait> - uśpienie procesu, na określony czas;
<throw> - wyrzucenie wyjątku, analogicznie jak w Javie;
<terminate> - zakończenie procesu na przykład w wyniku
błędu lub awarii;
<compensete> - wywołanie czynności rekompensujących
(ang. compansation ) w przypadku potrzeby wycofania
transakcji.
Budowa przykładowego
procesu biznesowego
Najlepszym sposobem nauki jest praktyka, dlatego w niniejszym
artykule zbudujemy prosty proces BPEL-owy do obsługi zamó-
wień książek. Aplikacja klienta (dalej dla uproszczenia nazywana
klientem) przy wywołaniu procesu będzie przekazywać informa-
cje takie jak: tytuł książki, autorzy, ilość egzemplarzy, numer kar-
ty kredytowej, datę jej ważności, imię i nazwisko zamawiające-
go oraz adres, dokąd książka ma być wysłana. Zadaniem nasze-
go systemu, będzie weryikacja podanej karty kredytowej, odpy-
tanie równolegle dwóch księgarni o cenę danej książki, wybra-
nie księgarni, gdzie cena książki jest najniższa, a następnie jej
zakup. Na końcu proces przekaże żądanie dostarczenia pacz-
ki do podsystemu, zajmującego się dostawą. Będzie go symulo-
wał inny proces BPEL-owy. Do budowy naszego systemu wyko-
rzystamy wcześniej przygotowane web serwisy, symulujące sys-
temy zewnętrzne, z którymi się zintegrujemy (operator kart kre-
dytowych oraz dwie księgarnie). Rysunek 1 przedstawia sche-
mat procesu, którego budową się zajmiemy. Do konstrukcji na-
szego procesu wykorzystamy Oracle JDeveloper 10g w wersji
10.1.3.1.0, a do jego uruchomienia Oracle BPEL Process Mana-
ger 10.1.3.1.0. Oba programy można ściągnąć za darmo z nastę-
pującej strony: http://www.oracle.com/technology/software/tech/
Analogicznie, jak w tradycyjnych językach programowania,
tak również w BPEL-u nie obyłoby się bez elementów od-
powiedzialnych za kontrolę przepływu. Do dyspozycji mamy
między innymi:
<switch> - deiniuje instrukcje warunkowe;
<while> - pętla;
<sequence> - oznacza, że zawarty w niej zbiór czynności
ma być wykonany sekwencyjnie;
<low> - pozwala na wykonywanie czynności równolegle;
�����������������������������������
�����
���������
�����������
���������
������
����������
���������
������
�������
������������
�������������
���
�������
�������������
����������
�����
���������
�������
�����������
����
������
���������
�������
������
���������
�����
������
�������
������������
�������������
���
�������
�������������
Rysunek 1. Schemat procesu do obsługi zamówień książek
Software Developer’s Journal 1/2007
www.sdjournal.org
37
441066273.029.png 441066273.001.png 441066273.002.png 441066273.003.png 441066273.004.png 441066273.005.png 441066273.006.png
 
Aplikacje
biznesowe
Rysunek 2. Nowy asynchroniczny proces BPEL-owy
zwisko właściciela. W przypadku problemów z kartą wy-
rzucany jest wyjątek:
void checkCreditCard(String cardNo, Date validTo,
String name)
throws CreditCardException
BookStore1WS – usługa pierwszej księgarni. Posiada dwie
metody. Pierwsza zwraca cenę książki. Jako parametry
wejściowe przyjmowany jest tytuł i autorzy. Druga metoda
służy do zakupu książki. Na wejściu przyjmuje tytuł, auto-
rów, numer karty, datę jej ważności, imię i nazwisko zama-
wiającego oraz ilość egzemplarzy:
double requestForQuote(String title, String authors)
int orderBook(String title, String authors,
String creditCard,
Date validTo,String name, int quantity)
BookStore2WS – usługa drugiej księgarni. Posiada analo-
giczne metody. Różnią się one jedynie nazwami dla zróż-
nicowania naszego przypadku:
double RFQ(String title, String authors)
int buyBook(String title, String authors, String creditCard,
Date validTo, String name, int quantity)
webservices/index.html. Instalacja nie powinna nastręczyć więk-
szych trudności. W przypadku JDeveloper’a sprowadza się do
jego rozpakowania. BPEL PM instaluje się przez uruchomienie
programu setup.exe . Do naszych celów wystarczy wybranie opcji
deweloperskiej. W dalszej części artykułu założymy, że został on
zainstalowany na domyślnym porcie 9700. W pierwszej kolejno-
ści przystąpimy do zainstalowania wyżej wspomnianych web
serwisów, a następnie zbudujemy cały proces.
Opis tworzenia web serwisów wykracza poza ten artykuł,
dlatego wymagana jest podstawowa znajomość tej techno-
logii. Czytelnik może również skorzystać z gotowych źródeł
umieszczonych na płycie dołączonej do magazynu.
Jednym ze sposobów umieszczenia web serwisów w konte-
nerze J2EE (wykorzystamy kontener OC4J dostarczany z Orac-
le BPEL PM) jest wykorzystanie JDevelopera. W tym celu wybie-
ramy z File->New->General->Applications->Application . Po po-
daniu nazwy i katalogu w oknie dialogowym klikamy na przycisk
Ok . W następnym oknie rezygnujemy ze stworzenia nowego pro-
jektu. Do wybranego katalogu kopiujemy z płyty cały projekt za-
wierający web serwisy – katalog ExternalWS . Dodajemy go ko-
rzystając z menu File->Open i wybierając plik ExternalWS.jpr .
Przygotowanie web serwisów
Zgodnie z wcześniejszą deklaracją przy budowie naszego
procesu biznesowego skorzystamy z trzech web serwisów.
Do celów edukacyjnych wystarczy by były to jedynie proste
klasy Javy symulujące systemy zewnętrzne. Będą one udo-
stępniały następujące funkcjonalności:
CreditCardCheckWS – posiada tylko jedną metodę do
weryikacji karty kredytowej. Jako parametry wejściowe
przyjmuje numer karty, datę jej ważności oraz imię i na-
Listing 1. Nowy asynchroniczny proces BPEL-owy
< ?xml version = "1.0" encoding = "UTF-8" ? >
< process name= "OrderBook"
targetNamespace= "http://xmlns.oracle.com/OrderBook"
xmlns= "http://schemas.xmlsoap.org/ws/2003/03/
business-process/"
xmlns:client= "http://xmlns.oracle.com/OrderBook"
xmlns:ora= "http://schemas.oracle.com/xpath/extension"
xmlns:orcl= "http://www.oracle.com/XSL/Transform/java/
oracle.tip.pc.services.functions.ExtFunc"
xmlns:xp20= "http://www.oracle.com/XSL/Transform/java/
oracle.tip.pc.services.functions.Xpath20"
xmlns:ldap= "http://schemas.oracle.com/xpath/
extension/ldap"
xmlns:bpelx= "http://schemas.oracle.com/bpel/extension"
xmlns:bpws= "http://schemas.xmlsoap.org/ws/
2003/03/business-process/" >
< partnerLinks >
< partnerLink name= "client"
partnerLinkType= "client:OrderBook"
myRole= "OrderBookProvider"
partnerRole= "OrderBookRequester" / >
< /partnerLinks >
< variables >
< variable name= "inputVariable"
messageType= "client:OrderBookRequestMessage" / >
< variable name= "outputVariable"
messageType= "client:OrderBookResponseMessage" / >
< /variables >
< sequence name= "main" >
< receive name= "receiveInput"
partnerLink= "client"
portType= "client:OrderBook"
operation= "initiate"
variable= "inputVariable"
createInstance= "yes" / >
< invoke name= "callbackClient"
partnerLink= "client"
portType= "client:OrderBookCallback"
operation= "onResult"
inputVariable= "outputVariable" / >
< /sequence >
< /process >
38
www.sdjournal.org Software Developer’s Journal 1/2007
441066273.007.png 441066273.008.png 441066273.009.png 441066273.010.png 441066273.011.png 441066273.012.png 441066273.013.png 441066273.014.png
 
Business Process Execution Language
W kolejnym kroku tworzymy połączenie z kontenerem
J2EE. Klikamy prawym klawiszem myszy w zakładce Connec-
tions na folderze Application Server i wybieramy New Appli-
cation Server Connection . Jako typ serwera aplikacji pozosta-
wiamy opcję Autonomiczny OC4J 10g 10.1.3.
W celu umieszczenia web serwisów należy w zakład-
ce Applications Navigator kliknąć prawym klawiszem myszy
na pliku WebServices.deploy i wybrać Deploy To oraz nazwę
wcześniej zdeiniowanego połączenia. Jeśli wszystko się po-
wiodło, to web serwisy powinny być dostępne z poziomu prze-
glądarki, a w szczególności ich opisy WSDL:
http://localhost:9700/external/CreditCardCheckWSSoapHt-
tpPort?wsdl;
http://localhost:9700/external/BookStore1WSSoapHttpPort
?wsdl;
http://localhost:9700/external/BookStore2WSSoapHttpPor-
t?wsdl.
Rysunek 3. Wywołanie web serwisu z obsługą wyjątku
Oczywiście możliwe jest umieszczenie ich na dowolnym ser-
werze aplikacyjnym, jak również stworzenie własnych web
serwisów, niekoniecznie zaimplementowanych w Javie, do
czego serdecznie zachęcam.
wybieramy F ile->New->General->Projects->BPEL Process Pro-
ject . Podajemy nazwę procesu, np. OrderBook i jako typ proce-
su pozostawiamy Asynchronous BPEL Process . Zatwierdzamy
wszystko naciskając przycisk Finish . Generator stworzył nowy
proces, który w zakładce Diagram powinien wyglądać tak, jak na
Rysunku 2. Zwróćmy uwagę na pliki, jakie wygenerował kreator:
Stworzenie nowego projektu BPEL
Mając już gotowe web serwisy możemy przystąpić do ich inte-
gracji budując asynchroniczny proces. Do tego celu użyjemy kre-
atora, który wygeneruje cały szkielet projektu BPEL-owego: plik
źródłowy procesu, interfejs WSDL, deskryptor oraz skrypt Ant-
owy do kompilacji i umieszczania procesu na serwerze. Z menu
OrderBook.bpel – źródło procesu;
OrderBook.wsdl – opis interfejsu procesu, parametry wej-
ściowe i wyjściowe. Dzięki temu możliwe jest wywoływa-
nie procesu z poziomu innych procesów i aplikacji;
OrderBook.xsd – plik XML Schema , który deiniuje dane
wejściowe i wyjściowe dla procesu. Jest on importowany
w OrderBook.wsdl ;
build.xml i build.properties – pliki Ant-owe do kompilacji
i umieszczania procesu na serwerze.
Listing 2. Deinicja parametrów wejściowych i
wyjściowych procesu
< schema attributeFormDefault= "unqualiied"
elementFormDefault= "qualiied"
targetNamespace= "http://xmlns.oracle.com/OrderBook"
xmlns= "http://www.w3.org/2001/XMLSchema" >
< element name= "OrderBookProcessRequest" >
< complexType >
< sequence >
< element name= "title" type= "string" / >
< element name= "authors" type= "string" / >
< element name= "quantity" type= "int" / >
< element name= "creditCardNo" type= "string" / >
< element name= "validTo" type= "dateTime" / >
< element name= "name" type= "string" / >
< element name= "address" type= "string" / >
< /sequence >
< /complexType >
< /element >
< element name= "OrderBookProcessResponse" >
< complexType >
< sequence >
< element name= "result" type= "string" / >
< /sequence >
< /complexType >
< /element >
< /schema >
Jeśli wybierzemy plik OrderBook.bpel i przejdziemy do zakład-
ki Source , będziemy mieli możliwość zobaczenia źródła procesu.
Powinien być podobny do tego z Listingu 1. Na razie proces nic
nie robi, poza odebraniem danych wejściowych od klienta ( <rece-
ive> ), który go wywołuje, oraz wywołaniem klienta i przekazaniu
mu odpowiedzi ( <invoke> ). Te dwa wywołania są korelowane auto-
matycznie dzięki wykorzystaniu standardu WS- Addressing . Klient
zdeiniowany jest w elemencie <partnerLink> w sekcji <partner-
Links> . Tu też będą pojawiać się połączenia do wykorzystywa-
nych web serwisów. W elemencie <variables> umieszczone są
dwie zmienne, przechowujące odpowiednio dane wejściowe i wyj-
ściowe. Przed przystąpieniem do komponowania procesu musi-
my określić jakie dane będzie on otrzymywał i zwracał. Dla nasze-
go prostego przykładu, jako parametry wejściowe wystarczą: tytuł,
autorzy, ilość egzemplarzy, numer karty kredytowej, data jej waż-
ności, imię i nazwisko, adres. Po zakończeniu proces będzie zwra-
cał string z informacją, że książka została wysłana. Informacje te
deiniuje się w pliku XML Schema, w naszym przypadku w Order-
Book.xsd . Należy go zmienić tak, jak pokazano to na Listingu 2.
Wywołanie web serwisu
Zgodnie z Rysunkiem 1 pierwszym krokiem w naszym procesie
jest weryikacja karty kredytowej. Sprowadza się on do wywoła-
Software Developer’s Journal 1/2007
www.sdjournal.org
39
441066273.015.png 441066273.016.png
Aplikacje
biznesowe
Te same kroki powtarzamy dla daty ważności oraz imienia
i nazwiska. W ten sposób zdeiniowaliśmy wywołanie web ser-
wisu weryikującego kartę kredytową, a tym samym skonstru-
owaliśmy pierwszy krok naszego procesu biznesowego. Efekt
powinien być zbliżony do przedstawionego na Listingu 3.
Rysunek 4. Test procesu BPEL-owego w konsoli
administracyjnej
Obsługa wyjątków
Wywoływany web serwis może wyrzucać wyjątki. Podob-
nie do języków programowania takich jak Java, BPEL umoż-
liwia ich obsługę. W naszym przypadku metoda checkCre-
ditCard , może wyrzucić wyjątek CreditCardException przy
braku pomyślnej weryikacji karty. Gdy taka sytuacja na-
stąpi zakończymy cały proces biznesowy. Obsługę wyjąt-
ków można dodawać dla elementów Scope . W tym celu wy-
bieramy w nim ikonkę Add Catch Branch . Powoduje to poja-
wienie się elementu <faultHandlers> . Klikamy na jego repre-
zentację graiczną i w oknie dialogowym naciskamy ikonkę
Browse Faults . Wybieramy Partner Links->CreditCardChec-
kWS->Imported WSDL->CreditCardCheckWSSoapHttpPort-
>CreditCardException.
Do zakończenia procesu służy komponent Terminate . Wy-
starczy go przeciągnąć na obszar elementu <faultHandlers> .
Po tych operacjach nasz proces powinien przypominać ten
przedstawiony na Rysunku 3.
nia web serwisu CreditCardCheckWS . Całe wywołanie umieści-
my w nowym elemencie <scope> , co pozwoli na logiczne wyod-
rębnienie tego kroku, jak również późniejszą obsługę wyjątków.
W tym celu z zakładki Component Palette przeciągamy kompo-
nent Scope i umieszczamy go pomiędzy już istniejącymi czynno-
ściami receiveInput i callbackClient . Rozwijamy komponent Sco-
pe naciskając znaczek plusa. Teraz możemy w nim umieszczać
inne elementy. Przed deiniowaniem wywołania web serwisu mu-
simy stworzyć dla niego wskaźnik. Robi się to przez przeciągnię-
cie komponentu PartnerLink na pole Services . W oknie dialogo-
wym podajemy lokalizację opisu WSDL web serwisu (np. http://
localhost:9700/external/CreditCardCheckWSSoapHttpPort?ws
dl ) i naciskamy ikonkę Parse WSDL File . Zatwierdzamy próbę
stworzenia pliku WSDL z opisem typu Partner Link’a. Jako Part-
ner Role wybieramy z listy jedyną opcję, CreditCardCheckWS_
Role . Zamykamy okno naciskając przycisk Ok .
Teraz jesteśmy gotowi do zdeiniowania wywołania web ser-
wisu. W tym celu przeciągamy komponent Invoke i umieszczamy
go w elemencie Scope . Następnie przeciągamy ikonkę strzałki
do uprzednio stworzonego ParnterLink’a. W oknie dialogowym
zmieniamy nazwę i upewniamy się, że wybraną operacją web
serwisu jest ta, która służy do weryikacji karty. Następnie two-
rzymy zmienną wejściową i wyjściową, klikając na ikonki Auto-
matically Create Input Variable . Możemy zaznaczyć opcje Local
Variable , aby zmienne były widoczne jedynie w zakresie elemen-
tu Scope . Zatwierdzamy zmiany, naciskając przycisk Ok . Do tak
zdeiniowanego wywołania musimy jeszcze przekazać wartości
– numer karty kredytowej, datę jej ważności oraz imię i nazwi-
sko. Przekopiujemy je ze zmiennej wejściowej procesu do zmien-
nej wejściowej elementu Invoke . Dokonuje się tego poprzez uży-
cie komponentu Assign . Umieszczamy go przed elementem In-
voke . Klikamy na niego dwa razy. W oknie dialogowym wybiera-
my opcję Create->Copy operation . W części From wybieramy ze
zmiennej wejściowej procesu numer karty. Powinniśmy uzyskać
wyrażenie XPath (wyświetlane na dole okna) podobne do tego:
Listing 3. Wywołanie web serwisu CreditCardCheckWS
< scope name= "checkingCreditCard" >< variables >
< variable name= "checkCreditCard_Input"
messageType= "ns1:CreditCardCheckWS_checkCreditCard" / >
< variable name= "checkCreditCard_Output"
messageType=
"ns1:CreditCardCheckWS_checkCreditCardResponse" / >
< /variables >< sequence name= "Sequence_1" >
< assign name= "Assign_CardNo" >< copy >
< from variable= "inputVariable" part= "payload"
query= "/client:OrderBookProcessRequest/
client:creditCardNo" / >
< to variable= "checkCreditCard_Input" part= "parameters"
query= "/ns2:checkCreditCardElement/ns2:cardNo" / >
< /copy >< copy >
< from variable= "inputVariable" part= "payload"
query= "/client:OrderBookProcessRequest/client:validTo" / >
< to variable= "checkCreditCard_Input" part= "parameters"
query= "/ns2:checkCreditCardElement/ns2:validTo" / >
< /copy >< copy >
< from variable= "inputVariable" part= "payload"
query= "/client:OrderBookProcessRequest/client:name" / >
< to variable= "checkCreditCard_Input" part= "parameters"
query= "/ns2:checkCreditCardElement/ns2:name" / >
< /copy >< /assign >
< invoke name= "checkCreditCard"
partnerLink= "CreditCardCheckWS"
portType= "ns1:CreditCardCheckWS"
operation= "checkCreditCard"
inputVariable= "checkCreditCard_Input"
outputVariable= "checkCreditCard_Output" / >
< /sequence >
< /scope >
/client:OrderBookProcessRequest/client:creditCardNo
Analogicznie w sekcji To konstruujemy wyrażenie dla zmien-
nej wejściowej dla elementu Invoke :
/ns2:checkCreditCardElement/ns2:cardNo
40
www.sdjournal.org Software Developer’s Journal 1/2007
441066273.017.png 441066273.018.png 441066273.019.png 441066273.020.png 441066273.021.png 441066273.022.png 441066273.023.png 441066273.024.png 441066273.025.png
 
Zgłoś jeśli naruszono regulamin