Katedra Architektury Systemów Komputerowych Wydział Elektroniki
Transkrypt
Katedra Architektury Systemów Komputerowych Wydział Elektroniki
Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej dr inż. Paweł Czarnul [email protected] Architektury usług internetowych laboratorium nr 1 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. Na potrzeby tego laboratorium zakładamy, że pracujemy jako użytkownik student z katalogiem domowym /home/student. Zakładamy, że treść pliku ~/.bashrc zawiera konfigurację dla AXIS 1.4 i Javy (należy zmienić katalog na dystrybucję Javy jeśli jest inna). export JAVA_HOME=/usr/local/jdk1.5.0_07 export AXIS_HOME=/home/student/axis-1_4 export AXIS_LIB=$AXIS_HOME/lib export AXISCLASSPATH=$AXIS_LIB/axis.jar:$AXIS_LIB/axis-ant.jar: $AXIS_LIB/commons-discovery-0.2.jar:$AXIS_LIB/commons-logging-1.0.4.jar:\ $AXIS_LIB/jaxrpc.jar:$AXIS_LIB/saaj.jar:$AXIS_LIB/log4j-1.2.8.jar:$AXIS_LIB/wsdl4j- 1.5.1.jar export CLASSPATH=$CLASSPATH:$AXISCLASSPATH export PATH=$JAVA_HOME/bin:$PATH Zakładamy ponadto, że serwer Tomcat został zainstalowany w katalogu /home/student/apache-tomcat-5.5.28 jak również podkatalog webapps/axis dystrybucji AXIS został skopiowany do katalogu webapps serwera Tomcat. Proszę zwrócić uwagę na następujące elementy: 1. AXIS_HOME wskazuje na katalog dystrybucji AXISa (tak, aby AXIS_LIB wskazywał na katalog lib). 2. Do Tomcata trzeba przekopiować katalog axis*/webapps/axis nie zaś axis* z dystrybucją. 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/apachetomcat5.5.28/webapps/axis. W znaleźć się implementacja w RunTaskServer.jws. *tomcat*/webapps/axis powinna 1. 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 -cp $AXISCLASSPATH:. 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/apachetomcat5.5.28), 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 -cp $AXISCLASSPATH:. 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 -cp $AXISCLASSPATH:. RunTaskClient Klienta można również zaimplementować w sposób 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"; następujący, bez użycia 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/user- guide.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/user-guide.html 2. Refsnes Data. WSDL Tutorial. http://www.w3schools.com/wsdl/default.asp