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/apache­tomcat­5.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/apache­tomcat­5.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

Podobne dokumenty