Technologie internetowe laboratorium nr 4 Instalacja i uruchomienie usługi sieciowej w serwerze Tomcat/AXIS 1. Wprowadzenie i konfiguracja Celem niniejszego laboratorium jest zainstalowanie i uruchomienie usługi sieciowej. Wykorzystany zostanie serwer Tomcat/AXIS, który pozwoli na zainstalowanie usługi sieciowej napisanej w Javie. Instalacja usługi sieciowej w konfiguracji jw. musi zosta ć poprzedzona zainstalowaniem serwera Tomcat/AXIS. Wymagana jest równie ż instalacja Javy. Przykładowa konfiguracja wygląda następująco: 1. JSDK zainstalowany w katalogu /usr/java/j2sdk1.4.2_04 JAVA_HOME=/usr/java/j2sdk1.4.2_04 1. Tomcat zainstalowany w katalogu $HOME/jakartatomcat5.0.19 1. AXIS zainstalowany w katalogu aplikacji webowych serwera Tomcat tj. $HOME/jakartatomcat5.0.19/webapps/axis Przykładowego klienta można skompilowa ć i uruchomi ć w dowolnym katalogu pod warunkiem ustawienia odpowiednich zmiennych środowiskowych jak w załączonym pliku ~/.bashrc. #.bashrc # User specific aliases and functions # Source global definitions if [ f /etc/bashrc ]; then. /etc/bashrc fi export PVM_ROOT="/usr/share/pvm3" export PVM_ARCH="LINUXI386" export PVM_RSH="/usr/bin/ssh" export PATH=$PATH:/users/student/micoinstalled/bin/:/users/student/jendrek/micoinstalled/lib/ export LD_LIBRARY_PATH=/users/student/micoinstalled/lib/:$LD_LIBRARY_PATH export AXIS_HOME=/users/student/jakartatomcat5.0.19/webapps/axis1_1 export AXIS_LIB=$AXIS_HOME/lib export AXISCLASSPATH=$AXIS_LIB/axis.jar:$AXIS_LIB/commons
discovery.jar:$axis_lib/commons logging.jar:$axis_lib/jaxrpc.jar:$axis_lib/saaj.jar:$axis_lib/log4j 1.2.8.jar:$AXIS_LIB/xmlapis.jar:$AXIS_LIB/xercesImpl.jar export AXIS_HOME; export AXIS_LIB; export AXISCLASSPATH 2. Publikacja usługi sieciowej w serwerze Tomcat/AXIS Narzędzie AXIS pozwala na publikacj ę usługi sieciowej na dwa sposoby: 1. Dysponując kodem klasy Javy z publicznymi metodami, AXIS pozwala na łatw ą i szybk ą publikacj ę usługi poprzez zamian ę rozszerzenia.java na.jws (Java Web Service) i umieszczenie w katalogu AXIS tj. w przykładzie powyżej w katalogu $HOME/jakartatomcat5.0.19/webapps/axis. 2. W przypadku konieczności określenia dodatkowych parametrów publikowanej usługi takich jak dostępne dla klienta metody (nie wszystkie metody klasy musz ą być udostępniane), ewentualnie narzędzi logujących wywoływanie metod usługi sieciowej i ich parametry (jak pliki logów), należy wykorzysta ć pliki WSDD, (Web Service Deployment Descriptor), które określaj ą ww. parametry. Instalacja usługi sieciowej zdefiniowanej w pliku deploy.wsdd wygląda następująco: java org.apache.axis.client.adminclient deploy.wsdd Po uruchomieniu serwera Tomcat poleceniem:./startup.sh (system Linux) w podkatalogu bin głównego katalogu Tomcata (powyżej jest to $HOME/jakartatomcat5.0.19), należy zweryfikowa ć poprawno ść funkcjonowania systemu AXIS poprzez wywołanie http://localhost:8080/axis w oknie przeglądarki. 3. Instalacja przykładowej usługi sieciowej Poniższy przykład ilustruje usług ę sieciow ą, która uruchamia zadan ą aplikacj ę na serwerze (w tym przypadku na serwerze, na którym uruchomiony zosta ł serwer Tomcat/AXIS). Klasa z metod ą realizując ą powyższe zadanie może mie ć następującą posta ć: import java.io.*; public class RunTaskServer { public int RunTask(String taskname) { try { Process p = Runtime.getRuntime().exec(taskname); catch (IOException e1) { System.err.println(e1); System.exit(1); return 0;
Kod ten umieszczony jest w pliku RunTaskServer.java. W celu łatwej instalacji usługi w serwerze Tomcat/AXIS należy przekopiowa ć ten plik jako RunTaskServer.jws i umieści ć w katalogu webapps/axis serwera Tomcat. Po uruchomieniu serwera Tomcat, usługa powinna by ć dostępna pod następującym URL: http://localhost:8080/axis/runtaskserver.jws co można zweryfikowa ć dzięki przeglądarce internetowej. 4. Opis usługi sieciowej w języku WSDL Jednocześnie, po instalacji usługi sieciowej jak opisano powyżej, można w łatwy sposób (poprzez odwołanie do URL: http://localhost:8080/axis/runtaskserver.jws?wsdl) uzyskać opis usługi w języku WSDL (Web Service Description Language). W szczególności, opis ten określa sygnatury metod dostępnych w ramach usługi sieciowej, a więc typy argumentów, kolejno ść argumentów jak równie ż, m.in. lokalizacj ę usługi jw. Opis usługi pozwala klientowi, potencjalnie klientowi dostawcy usług sieciowych, na zdalne wywołanie usługi. Klient, na podstawie opisu w języku WSDL, może napisa ć i uruchomi ć program klienta, który pozwoli usług ę wywoła ć. Poniżej przedstawiono opis usługi sieciowej realizującej metod ę uruchomienia zadania na serwerze. W szczególności message RunTaskRequest określa argumenty wejściowe metody (tutaj jeden argument typu xsd:string, mapowany w Javie na String), RunTaskRespone argumenty wyjściowe metody (xsd:int, mapowany w Javie na int). Element operation określa nazw ę metody i odwołuje si ę do argumentów zdefiniowanych jako elementy message i opisane powyżej. Element binding określa protokó ł (SOAP/HTTP), za ś element port lokalizacj ę usługi (tutaj http://localhost:8080/axis/runtaskserver.jws). S ą to elementy niezbędne i wystarczające klientowi do wywołania metody danej usługi. <wsdl:definitions targetnamespace="http://localhost:8080/axis/runtaskserver.jws/axis/runtaskserver.jws "> <wsdl:message name="runtaskrequest"> <wsdl:part name="taskname" type="xsd:string"/> </wsdl:message> <wsdl:message name="runtaskresponse"> <wsdl:part name="return" type="xsd:int"/> </wsdl:message> <wsdl:porttype name="runtaskserver"> <wsdl:operation name="runtask" parameterorder="taskname"> <wsdl:input message="intf:runtaskrequest" name="runtaskrequest"/> <wsdl:output message="intf:runtaskresponse" name="runtaskresponse"/>
</wsdl:operation> </wsdl:porttype> <wsdl:binding name="runtaskserversoapbinding" type="intf:runtaskserver"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="runtask"> <wsdlsoap:operation soapaction=""/> <wsdl:input name="runtaskrequest"> <wsdlsoap:body encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/runtaskserver.jws/axis/runtaskserver.jws" use="encoded"/> </wsdl:input> <wsdl:output name="runtaskresponse"> <wsdlsoap:body encodingstyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost:8080/axis/runtaskserver.jws/axis/runtaskserver.jws" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="runtaskserverservice"> <wsdl:port binding="intf:runtaskserversoapbinding" name="runtaskserver"> <wsdlsoap:address location="http://localhost:8080/axis/runtaskserver.jws"/> </wsdl:port> </wsdl:service> </wsdl:definitions> AXIS pozwala na wygenerowanie zarówno plików pomocniczych dla klienta (stub) oraz dla serwera (skeleton, implementacja itd.) w celu odpowiednio napisania programu klienta i implementacji właściwej usługi na podstawie opisu WSDL. W tym przypadku, z punktu widzenia klienta, istotna jest pierwsza funkcja. Wywołanie ma posta ć: java org.apache.axis.wsdl.wsdl2java RunTaskServer.jws.xml W katalogu localhost, wygenerowane zostan ą następujące pliki: RunTaskServer.java RunTaskServerServiceLocator.java RunTaskServerService.java RunTaskServerSoapBindingStub.java Odpowiednie klasy znajduj ą si ę w pakiecie localhost. Przykładowa implementacja klienta (uruchomienie programu emacs na serwerze) może wygląda ć nastepująco: import java.io.*; import localhost.*;
public class RunTaskClient { public static void main(string [] args) throws Exception { RunTaskServerService service = new RunTaskServerServiceLocator(); RunTaskServer port = service.getruntaskserver(); try { port.runtask("emacs"); catch (IOException e) { // Implementacja ta ukrywa np. lokalizacj ę usługi, która z kolei zakodowana jest w klasach pomocniczych, wygenerowanych wcześniej. Pozwala to klientowi na wywołanie właściwej metody bez implementacji szczegółów określonych ju ż w opisie WSDL. Kod programu powinien zosta ć umieszczony w katalogu nadrzędnym w stosunku do katalogu pakietu localhost. Wywołanie programu wygląda wówczas następująco: java RunTaskClient Klienta można równie ż zaimplementowa ć w sposób następujący, bez użycia wygenerowanych wcześniej narzędziem WSDL2Java plików: import org.apache.axis.client.call; import org.apache.axis.client.service; import org.apache.axis.encoding.xmltype; import org.apache.axis.utils.options; import javax.xml.rpc.parametermode; public class RunTaskClient1 { public static void main(string [] args) throws Exception { Options options = new Options(args);
String endpoint = "http://localhost:" + options.getport() + "/axis/runtaskserver.jws"; args = options.getremainingargs(); String method = "RunTask"; String s1 = new String(args[0]); Service service = new Service(); Call call = (Call) service.createcall(); call.settargetendpointaddress( new java.net.url(endpoint) ); call.setoperationname( method ); call.addparameter( "op1", XMLType.XSD_STRING, ParameterMode.IN ); call.setreturntype( XMLType.XSD_INT ); Integer ret=(integer) call.invoke( new Object [] { s1 ); System.out.println("Got result : " + ret); Wywołanie wygląda wówczas: java RunTaskClient1 emacs Dla argumentów typu inout lub out, wygenerowane zostan ą klasy Holder, które posiadają pole value typu, który opakowuj ą. W ten sposób serwer może przypisa ć wartości zwracane następnie klientowi. Szczegóły dostępne pod adresem: http://ws.apache.org/axis/java/userguide.html#wsdl2javabuildingstubsskeletonsanddatatypesfromwsdl W przypadku konieczności, przy kompilacji i uruchomieniu, należy poda ć odpowiednie
ścieżki do odpowiednich pakietów np.: javac classpath $AXISCLASSPATH... java cp $AXISCLASSPATH... Literatura 1. AXIS User's Guide. http://ws.apache.org/axis/java/userguide.html 2. Refsnes Data. WSDL Tutorial. http://www.w3schools.com/wsdl/default.asp