laboratorium 2
Transkrypt
laboratorium 2
AUI Laboratorium 2. Architektury Usług Internetowych Laboratorium 2. Usługi sieciowe Wstęp Celem laboratorium jest zapoznanie się z modelem usług sieciowych na przykładzie prostego serwera Apache Axis2. Apache Axis2 Apache Axis2 jest silnikiem usług sieciowych opartym na technologiach Web Services / SOAP / WSDL. Silnik dostępny jest w dwóch wersjach: jako samodzielny serwer oraz jako aplikacja webowa która może być uruchomiona w kontenerze servletów. Instalacja i uruchomienie Axis2 Aby zainstalować samodzielny serwer należy ściągnąć odpowiednią paczkę ze strony http://axis.apache.org/axis2/java/core/, a następnie rozpakować ją w dowolnym katalogu. Uruchomienie środowiskowych: serwera może wymagać ustawieniach poniższych • JAVA_HOME – wskazuje na katalog instalacyjny JDK w systemie, • AXIS2_HOME – wskazuje na katalog domowy serwera. zmiennych W celu uruchomienia serwera należy wykonać jedno z poniższych poleceń: • %AXIS2_HOME%\bin\axis2server.bat (Windows), • $AXIS2_HOME/bin/axis2server.sh (Unix). Domyślnie wszystkie uruchomione usługi będą dostępne pod adresem http://localhost:8080/axis2/services/. Należy zwrócić uwagę aby w czasie uruchamiania serwera, żadne inne serwery aplikacji nie były uruchomione (GlassFish, Apache Tomcat). Budowanie i uruchamianie usługi Apache Ant jest narzędziem pozwalającym na zautomatyzowanie procesu budowania projektu. Pozwala na definiowanie celów związanych m.in. z kompilacją kodów źródłowych, generowaniem dokumentacji, wdrażaniem aplikacji, itd. Konfiguracja procesu budowania projektu odbywa się poprzez definiowanie celów w pliku build.xml. Dokładniejsze informacje można znaleźć na stronie http://ant.apache.org/. © 2010 - 2012 Michał Wójcik 1 AUI Laboratorium 2. Standardowo każdy projekt stworzony w środowisku NetBeans IDE jest budowany przez Apache Ant i zawiera wygenerowany plik build.xml, który początkowemu użytkownikowi może wydać się zbyt skomplikowany. Przykład załączony do tej instrukcji opiera się o prostym pliku build.xml o następującej strukturze: <?xml version="1.0" encoding="UTF-8"?> <project name="services" basedir="." default="generate.service"> <property environment="env"/> <property name="AXIS2_HOME" value="/home/psysiu/apps/axis2-1.6.2"/> <property name="build.dir" value="${basedir}/build"/> <property name="serviceclass" value="pl.gda.pg.eti.kask.aui.services.HelloService"/> <property name="aarname" value="HelloService"/> <property name="wsdlname" value="HelloService"/> <property name="targetnamespace" value="http://services.aui.kask.eti.pg.gda.pl/"/> <property name="schematargetnamespace" value="http://services.aui.kask.eti.pg.gda.pl/xsd"/> <path id="axis2.classpath"> <fileset dir="${AXIS2_HOME}/lib"> <include name="*.jar"/> </fileset> </path> <target name="compile.service"> ... </target> <target name="generate.wsdl" depends="compile.service"> ... </target> <target name="generate.service" depends="compile.service"> ... </target> <target name="generate.client" depends="generate.wsdl"> ... </target> <target name="clean"> ... </target> <target name="run" depends="compile.service"> … </target> </project> Głównym elementem pliku konfiguracyjnego jest <project> zawierający nazwę projektu, katalog bazowy oraz domyślny cel. Dalej zostały zdefiniowane zmienne wykorzystywane w poszczególnych celach projektu: • AXIS2_HOME – katalog domowy serwera, • build.dir – katalog do którego zostaną wgrane skompilowane klasy, • serviceclass – klasa usługi sieciowej, © 2010 - 2012 Michał Wójcik 2 AUI Laboratorium 2. • aarname – nazwa archiwum zawierającego usługę sieciową, • wsdlname – nazwa pliku wsdl opisującego usługę, • targetnamespace – przestrzeń nazw w postaci adres, • schematargetnamespace – lokalizacja schemy dla przestrzeni nazw. Następnymi elementami są definicje poszczególnych celów. W przypadku celów od siebie zależnych wykorzystywany jest argument depends powodujący łąńcuchowe wywoływanie celów. Przygotowane cele to: • compile.serivce – kompiluje wszystkie kody źródłowe, • generate.wsdl – na podstawie klasy usługi generuje jej opis w postaci pliku wsdl, • • generate.service – na podstawie skompilowanych klas generuje archiwum usługi i wgrywa je do serwera (aktualizacja usługi na serwerze może wymagać jego restartu), generate.client – na podstawie pliku wsdl generuje stuby pozwalające na interakcję z usługą wdrożoną na serwerze, • clean – usuwa katalog z skompilowanymi klasami, • run – uruchamia przygotowanego klienta usługi. Cele generate.wsdl i generate.client opierają się na wywołaniu odpowiednich metod z klas dostarczonych z Axis2. Cele compile.serivice, generate.service, clean i run korzystają ze sandardowych narzędzi platformy Java (javac, java i jar) oraz operacji na plikach (mkdir, copy, delete). Wywołanie poszczególnych celów w środowisku NetBeans IDE może być wykonane z zakładki files poprzez kliknięcie prawym przyciskiem myszy na plik build.xml i wybranie odpowiedniego celu do wykonania. Wszystkie cele ant mogą również być wołane z konsoli (o ile w systemie jest zainstalowana aplikacja Apache Ant) poprzez polecenie ant nazwa_celu. Przykładowy projekt Przykładowy projekt składa się z następujących plików: • resources/META-INF ◦ • services.xml – deskryptor usługi pozwalający na jej wdrożenie na serwerze, definiuje nazwę usługi, jej zasięg, schemę oraz klasę ją implementującą; src/pl/gda/pg/eti/kask/aui/services: ◦ ◦ HelloService.java – implementacja usługi, HelloServiceCallbackHandler.java – abstrakcyjna klasa wygenerowana przez cel generate.client pozwalająca na zdefiniowanie obsługi wyników zwracanych przez usługę, © 2010 - 2012 Michał Wójcik 3 AUI Laboratorium 2. ◦ ◦ ◦ HelloServiceCallbackHandlerImpl.java – przykładowa implementacja obsługi wyników, HelloServiceStub.java – klasa wygenerowana pozwalająca na interakcję z usługą, przez cel generate.client ServiceCaller – główna klasa klienta z przykładowymi wywołaniami usługi. Aby edytor w NetBeans IDE poprawnie podpowiadał składnię i nie zgłaszał błędów podczas edycji należy do projektu dodać następujące biblioteki: • activation-1.1.jar, • axiom-api-1.2.8.jar, • axiom-impl-1.2.8.jar, • axis2-adb-1.5.1.jar, • axis2-kernel-1.5.1.jar, • axis2-transport-http-1.5.1.jar, • axis2-transport-local-1.5.1.jar, • commons-codec-1.3.jar, • commons-httpclient-3.1.jar, • commons-logging-1.1.1.jar, • httpcore-4.0.jar, • mail-1.4.jar, • neethi-2.0.4.jar, • wsdl4j-1.6.2.jar, • XmlSchema-1.4.3.jar. Wszystkie biblioteki można znaleźć w katalogu domowym serwera w katalogu lib. Domyślnie Axis2 opakowuje parametry i wyniki usług w wygenerowane obiekty. Przykładowo aby wywołać usługę String sayHello() należy: SayHello sayHello = new HelloServiceStub.SayHello(); String ret = stub.sayHello(sayHello).get_return(); Analogicznie wywołanie usługi String sayHelloTo(String name) wymaga: SayHelloTo sayHelloTo = new HelloServiceStub.SayHelloTo(); sayHelloTo.setName("psysiu"); String ret = stub.sayHelloTo(sayHelloTo).get_return(); Wygenerowane stuby pozwalają na wywołanie usługi w dwóch trybach: • synchroniczny – wykonanie kodu jest blokowane aż do otrzymania wyników z usługi: © 2010 - 2012 Michał Wójcik 4 AUI Laboratorium 2. SayHello sayHello = new HelloServiceStub.SayHello(); String ret = stub.sayHello(sayHello).get_return(); • asynchroniczny – usługa wywołania usługi zwraca sterowanie od razu a wyniki zostają asynchronicznie w osobnym wątku dostarczone do klasy callback: SayHello sayHello = new HelloServiceStub.SayHello(); HelloServiceCallbackHandler callback = new HelloServiceCallbackHandler { @Override public void receiveResultsayHello(SayHelloResponse result) { System.out.println("Result: " + result.get_return()); } }; stub.startsayHello(sayHello, callback); Uwaga: wystąpienie błędu w synchronicznym wołaniu metody musi zostać obsłużone w tym samym miejscu co wołanie metody. W przypadku wołania asynchronicznego obsługę błędu zajmuje się klasa callback. © 2010 - 2012 Michał Wójcik 5