Inżynieria
oprogramowania
XFire w akcji
Tomasz Sztelak
ebserwisy okazały się długo oczekiwaną
Aplikacja
Warstwa
odpowiedzią na potrzebę komunikacji po-
prezentacji
Wmiędzy rozproszonymi systemami tworzo-
WSDL
nymi na różnych platformach i przy użyciu różnorod- Klient Wywołanie serwisu Logika
Webserwis
serwisu (SOAP) biznesowa
nych języków programowania. Dzięki użyciu powszech-
Zarejestrowanie
serwisu
nie akceptowanych standardów bazujących na języku
Warstwa
Rejestr
Wyszukanie persystencji
UDDI
XML (SOAP, WSDL,UDDI), możliwa stała się wymia-
serwisu
na informacji oraz usług nie tylko pomiędzy aplikacja-
Rysunek 1. Architektura webserwisów
mi działającymi na platformach J2EE i Microsoft .NET,
ale także napisanymi praktycznie w dowolnym języku serwisów, wymieniając chociażby najbardziej po-
jak C++, Pascal, Cobol ,a nawet językami skryptowymi pularne:
jak Perl, Python czy PHP.
Nie bez znaczenia także dla tak szybkiego rozwo- " JAX-WS oraz JAX-RPC firmy Sun:
ju tej technologii jest fakt, iż webserwisy są luzno po- http://java.sun.com/webservices/jwsdp/index.jsp,
wiązane z aplikacją, której logikę udostępniają, tzn. ich " Axis 1.x
obecność praktycznie nie wpływa na istniejące kom- http://ws.apache.org/axis,
ponenty, umożliwiając stopniowe, fragment po frag- " XFire
mencie, integrowanie ich z istniejącą funkcjonalnością. http://xfire.codehaus.org,
Dzięki takiemu podejściu udostępnienie istniejącej logi- " WASP:
ki za pomocą webserwisów możliwe jest bez ponosze- http://www.systinet.com/products/systinet_server,
nia dużych nakładów na modyfikacje aplikacji oraz ze " WebLogic Web Services
zminimalizowanym ryzykiem niepowodzenia. http://e-docs.bea.com/wls/docs81/webserv/
Dzięki tym cechom webserwisy umożliwiają zinte-
growanie praktycznie dowolnych aplikacji, w jeden du- Jednak wybranie odpowiedniego programu spełnia-
ży rozproszony system, eliminując często konieczność jącego naszego oczekiwania, nie jest sprawą prostą.
wprowadzania niezwykle kosztownych w utrzymaniu Każdy z nich umożliwia wyeksponowanie logiki naszej
systemów pośrednich, dopasowujących metody komu- aplikacji jako webserwisu, jednak również każdy z nich
nikacji poszczególnych aplikacji. Duże korporacje zwią- posiada pewne wady, które mogą zniechęcić lub nawet
zane z internetem dość szybko dostrzegły możliwości uniemożliwić jego użycie. Na początku należy więc za-
płynące z wykorzystania webserwisów i rozpoczęły stanowić się jakie cechy powinno posiadać narzędzie
udostępnianie swoich usług z wykorzystaniem tej tech- z którym będziemy pracować:
nologii. Do takich firm zaliczają się miedzy innymi: Go-
ogle, Amazon, Ebay,Yahoo oraz Allegro. " łatwość użycia dzięki czemu skróci się czas po-
O poziomie zainteresowania wykorzystaniem tej trzebny na stworzenie aplikacji,
technologii może świadczyć fakt, iż w chwili obecnej " wysoka wydajność dzięki czemu będziemy mo-
50,000 programistów zarejestrowanych jest w progra- gli obsłużyć większą ilość użytkowników bez ko-
mie webserwisów firmy Amazon. Firma eBay może po- nieczności dokupowania kolejnych kosztownych
chwalić się natomiast 8.000 firm oraz indywidualnych serwerów,
programistów biorących udział w jej programie oraz
600 aplikacjami wykorzystującymi jej API, generujący-
mi około 40% wszystkich transakcji.
Problemy
z dostępnymi narzędziami
Przeszukując zasoby sieci internet bez trudu moż-
na znalezć narzędzia ułatwiające tworzenie web-
Autor od 2002r. tworzy aplikacje oparte na platformie
J2EE dla sektora bankowego. Jest również członkiem
zespołu tworzącego bibliotekę XFire.
Kontakt: tsztelak@gmail.com
Rysunek 2. Opis serwisu w formacie WSDL
48
www.sdjournal.org
Software Developer s Journal 3/2006
Listing 1. Struktura katalogów aplikacji
xfire
-WEB-INF/
-classes/ klasy serwisu
-META-INF/
-xfire/
-services.xml definicja serwisu
.-lib/ biblioteki wymagane przez kod
serwisu
web.xml
" spójne API zapewniające łatwiejsze utrzymanie oraz
większy komfort pracy przy nim,
" niska cena dzięki której szybciej zwrócą się koszty in-
westycji.
Niestety większość wymienionych narzędzi nie spełniania po-
wyższych wymogów. Małe i średnie firmy na ogół nie mogą po-
zwolić sobie na zakup komercyjnych rozwiązań takich jak bardzo
dobre np. WASP czy Weblogic Server. W wielu wypadkach rów-
nież wydajność tych rozwiązań pozostawia wiele do życzenia,
głownie ze względu na przetwarzanie komunikatów SOAP z wy-
korzystaniem modelu DOM, opierającego się na tworzeniu do-
kumentu będącego reprezentacją przetwarzanego XMLa, z któ-
rego dopiero w następnej kolejności tworzony jest odpowiadają-
cy danym XML obiekt logiki aplikacji. Podejście takie powoduje
poza spadkiem wydajności, również intensywne zużywanie pa-
mięci, gdyż każdy obiekt przechowywany jest w pamięci dwu-
krotnie, a drzewo przechowujące elementy dokumentu czasami
zajmuje kilkakrotnie więcej pamięci niż same dane . Z tym pro-
blemem boryka się między innymi Axis 1.x ( chociaż Axis 2 opie-
rać się będzie już na znacznie wydajniejszym modelu przetwa-
rzania XMLa Stax, umożliwiającym przetwarzanie danych stru-
mieniowo, na zasadzie iteratora) oraz JAX-RPC. Niewiele na-
rzędzi przejmuje się również łatwością użycia, wymagając czę-
Listing 2. Plik web.xml
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
XFireServlet
XFire Servlet
org.codehaus.xfire.transport.http.XFire
ConfigurableServlet
XFireServlet
/services/*
Software Developer s Journal 3/2006
Inżynieria
oprogramowania
Listing 3. Interfejs klasy implementującej funkcjonalność
Webserwis
aplikacji
Zbiór samo-opisujących się (przy pomocy języka WSDL) obiektów,
package pl.sdj.petstore;
dostarczających dane oraz usługi w niezależny od platformy spo-
public interface PetStore {
sób ( dzięki użyciu opartemu na formacie XML protokołowi SOAP),
// kup zwierzę o zadanej nazwie
udostępnionych z użyciem ustandaryzowanych protokołów komuni-
long buyPet(String name);
kacji (jak HTTP, JMS).
//sprawdz status zamówienia
String getOrderStatus(long orderId);
sto skomplikowanej konfiguracji, dodatkowych kroków w trakcie }
instalacji lub udostępniając niewygodne API, wydłużając przez
to znacznie czas potrzebny na zrozumienie narzędzia oraz stwo-
rzenie aplikacji. Architecture), dzięki czemu w ciągu bardzo krótkiego czasu
możliwe jest zrozumienie zasad jego funkcjonowania.
Dlaczego XFire? " łatwość użycia - jednym z najważniejszych czynników
XFire powstał jako odpowiedz na serie problemów, które napo- decydujących o sukcesie produktu jest czas potrzebny do
tkał autor projektu podczas prób stworzenia webserwisu przy stworzenia danej aplikacji, dlatego też jednym z najważ-
użyciu dostępnych (m.in. wymienionych wcześniej) narzędzi. Ce- niejszych celów projektu była jak największa łatwość je-
lem było stworzenie darmowego narzędzia wolnego od wspo- go użycia. Zostało to osiągnięte poprzez wprowadzenie
mnianych wad oraz zapewniającego wydajność komercyjnych prostej i spójnej architektury oraz maksymalne uproszcze-
rozwiązań, posiadającego następujące cechy: nie instalacji oraz konfiguracji (umożliwiającej jednak jed-
nocześnie wprowadzanie złożonych rozwiązań), o czym
" niska cena - XFire jest narzędziem całkowicie darmowym przekonać się na poniższym przykładzie.
rozpowszechnianym wraz z kodem zródłowym,
" wysoka wydajność - jednym z podstawowych założeń pro- Webserwis w 5 min
jektu była wysoka wydajność rozwiązania, dlatego też archi- Tworzenie strony serwerowej: Do stworzenia webserwisu po-
tektura została całkowicie oparta na przetwarzaniu XMLa trzebujemy: dowolnego serwera aplikacji (np. Tomcat 5.x: http://
przy użyciu bardzo wydajnego modelu StAX, umożliwiają- tomcat.apache.org), dystrybucji XFire ( np. xfire-all-1.0-M6.zip lub
cego inkrementalne przetwarzanie komunikatów oraz powo- nowsza, która można pobrać ze strony: http://xfire.codehaus.org/
dującego minimalne wykorzystanie pamięci. Dodatkowo do Download) oraz dowolnego IDE Javy (np. Eclipse: http://
projektu wprowadzony został własny mechanizm mapowa- www.eclipse.org). Aby zbudować nasz webserwis, należy utwo-
nia komunikatów XML na obiekty Javy (zwany Aegis), będą- rzyć odpowiednią strukturę katalogów aplikacji, tak jak przedsta-
cy jednym z najwydajniejszych rozwiązań tego typu obec- wia to Listing 1. Następnie musimy skopiować do katalogu biblio-
nie dostępnych. Najlepszym zobrazowaniem korzyści pły- tek naszej aplikacji (WEB-INF/lib) następujące pliki: xfire-all-1.0-
nących z powyższych rozwiązań, są wyniki testów wydajno- SNAPSHOT.jar, stax-api-1.0.jar, wsdl4j-1.4.jar, xerces-2.4.0.jar,
ściowych, które pokazują iż w zależności od rozmiaru komu- xml-apis.jar, jdom-1.0.jar ,annogen-0.1.0.jar, qdox-1.5.jar, xbean-
nikatu SOAP silnik XFire jest od 2 do 5 razy szybszy od naj- spring-2.0-SNAPSHOT.jar,spring-1.2.4.jar, stax-1.1.2-dev.jar
popularniejszego obecnie na rynku Axisa 1.x, Początkowa konfiguracja biblioteki XFire nie różni się zasad-
" spójne API XFire posiada bardzo przejrzystą i intuicyj- niczo od innych narzędzi tego typu, należy zdefiniować punkt do-
na, komponentową architekturę (http://xfire.codehaus.org/
Listing 4. Implementacja funkcjonalności aplikacji
Przydatne linki
package pl.sdj.petstore.impl;
import pl.sdj.petstore.PetStore;
" zbiór specyfikacji
public class PetStoreImpl implements PetStore
http://www.w3.org/2002/ws/
{
" strona domowa XFire
public String getOrderStatus(long orderId)
http://xfire.codehaus.org
" serwis poświęconych webserwisom {
http://webservices.xml.com/
// mamy tylko "mysz" w magazynie
" zbiór artykuł dotyczących webserwisów
if (orderId == "mysz".hashCode())
http://webservices.oreilly.com/
{
" serwis poświęconych webserwisom
return "zamowiony";
http://webservices.org/
}
" strona domowa organizacji zajmującej się rozwojem standar-
return "nieznany";
dów webserwisów
}
http://www.oasis-open.org
public long buyPet(String name) {
" organizacja promująca przenośność implementacji webserwisów
// zwroc hashcode jako identyfikator zlecenia
http://www.ws-i.org/
return (name == null ? -1 : name.hashCode());
" strona domowa pakietu Axis
http://ws.apache.org/axis }
50
www.sdjournal.org
Software Developer s Journal 3/2006
Webserwisy: XFire w akcji
Listing 5. Konfiguracja serwisu - plik META-INF/xfire/
Słownik terminów
services.xml
" SOAP (Simple Object Access Protocol) oparty na formacie
XML protokół umożliwiający wywoływanie zdalnych metod,
" WSDL (Web Services Description Language) - język opisu
PetStore
właściwości webserwisu,
http://www.sdj.pl
" UDDI (Universal Description, Discovery and Integration) de-
pl.sdj.petstore.PetStore
finiuje sposób rejestrowania oraz odnajdywania webserwisów,
pl.sdj.petstore.impl.PetStoreImpl
" StAX (Streaming API for XML) metoda przetwarzania da-
nych XML polegająca na inkrementalnym pobieraniu ich z
parsera (ang. Pull-parsing),
" DOM (Document Object Model) metoda przetwarzania da-
nych XML polegająca na obrabianiu drzewa węzłów zbudo-
wanego na podstawie tych danych.
stępu (w postaci servletu), który będzie odpowiedzialny za prze-
chwytywania żądań klientów i przekazywanie ich do właściwych
klas. W tym celu musimy stworzyć plik web.xml naszej aplikacji w katalogu META-INF/xfire o zawartości przedstawionej na Li-
o zawartości przedstawionej na Listingu 2. stingu 5, w którym poszczególne znaczniki mają następujące
Od tego mementu wszystkie żądania odnoszące się do znaczenie:
adresów rozpoczynających się w przypadku serwera Tom-
cat (przy założeniu iż serwer pracuje na domyślnym porcie, " name jest nazwą pod jaką serwis będzie dostępny (np.
a nasza aplikacji skonfigurowana pod nazwą XFire) od http:// http://localhost:8080/xfire/services/PetStore ),
localhost:8080/xfire/services, będą traktowane jako żądania " namespace przestrzeń nazw serwisu,
webserwisu i przekazywane do serwletu XFire. " serviceClass klasa interfejsu definiująca metody serwisu,
Następnie musimy utworzyć klasy implementujące funk- " implementationClass klasa implementująca serwis,
cjonalność naszej aplikacji, w postaci interfejsu (Listing 3)
oraz jego implementacji (Listing 4). Po zbudowaniu naszej aplikacji i zainstalowaniu na serwe-
Kolejnym krokiem procesu konfiguracji jest wskazanie, rze, mamy już w pełni działający webserwis. Aby upew-
które klasy naszej aplikacji powinny być udostępnione jako nić się że wszystko działa poprawnie w oknie przeglądar-
webserwisy. W tym celu należy utworzyć plik services.xml ki wpisujemy następujący adres http://localhost:8080/xfire/
Listing 6. Struktura pliku konfiguracyjnego
wykona dodatkowe czynności w trakcie tworzenie obiektu
xfire.codehaus.org/JSR+181+Service) -->
..
wpisaniu w przeglądarce adresu serwisu zakończonego
?wsdl . -->
value