Arten von Broker Architekturen • Common Object Request Broker Architecture (CORBA) – Entworfen von Object Management Group (OMG) – Für Datenaustausch und Kommunikation zwischen Komponenten verschiedener Programmiersprachen • Remote Method Invocation (RMI) – Java Standard zur Kommunikation von verteilten Objekten – Spezifisch für Java, es können nur Java-Objekte miteinander kommunizieren und ausgetauscht werden • Distributed Component Object Model (DCOM) – Microsoft-eigener Standard für verteilte Kommunikation – Grundsätzlich auch zwischen verschiedenen Sprachen • Heute: Webservice-Standards (WSDL, SOAP, XML,…) http://www.dke.univie.ac.at Details zur Remote Method Invocation Client Server Application Stub Skeleton Remote Reference layer Remote Reference layer Transport Layer Network Transport Layer Stub = abstrakter „Rumpf“, entspricht in Java einem Interface Skeleton = realisiert zum Stub passende Implementierung, in Java Implementierung des StubInterfaces + serverspezifische Eigenschaften http://www.dke.univie.ac.at 1 Beispiel zur Illustration Name: String Produktnr: Integer Menge: Integer Kunde „Formular für Anfrage“ Produkt: P d kt String St i Menge: Integer Remote Reference layer Transport Layer Lieferant Formular + Verarbeitung GET /index.html?produkt=TV HTTP/1.1 Host: www.lieferant.com Network Source address: 131.130.1.78 Destination address: 120.1.89.3 Length: 1278 Checksum: FDAE64B12 Data: ….. Remote Reference layer Transport Layer http://www.dke.univie.ac.at Details Web Service Kommunikation Client Stub Remote Reference layer Transport Layer Server Application WSDL Endpoints, Operations, Messages SOAP / HTTP Head, Body Network Skeleton Remote Reference layer Transport Layer http://www.dke.univie.ac.at 2 Serialisierung / Deserialisierung • Serialisierung = Umwandlung eines Objekts in einen Datenstrom • Voraussetzung für die Übertragung von Objekten ist ihre Serialisierbarkeit • Manche Objekte können nicht serialisiert werden, da sie beispielsweise lokal gebundene Referenzen beinhalten, zB eine konkrete Verbindung zu einer Datenbank • Serialisierbare Klassen sollten möglichst klein gehalten werden um Overhead bei der Kommunikation zu vermeiden http://www.dke.univie.ac.at XML-Serialisierung in Java mit JAXB I http://java.sun.com/webservices/docs/1.6/tutorial/doc/ http://www.dke.univie.ac.at 3 XML-Serialisierung in Java mit JAXB II http://java.sun.com/webservices/docs/1.6/tutorial/doc/ http://www.dke.univie.ac.at Ein einfacher Web Service in Java mit Apache CXF Benötigte Software (OpenSource): – – – – – Java EE SDK Apache Tomcat Apache CXF (inkl. Springframework) Eclipse Entwicklungsumgebung WebTools Plugins für Eclipse Implementierung von: – – – – Interface (Stub) Klassen, die das Interface implementieren Konfiguration der Deployment Deskriptoren Konfiguration von CXF http://www.dke.univie.ac.at 4 Eclipse Übersicht Another Tool Eclipse Platform Workbench Java Development Tools (JDT) Help JFace SWT Plug-in Development Environment (PDE) Workspace Team Your Tool Debug Their Tool Platform Runtime Eclipse Project http://www.dke.univie.ac.at Beispiel-Interface package demo.spring; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; @WebService(name = "HelloWorld", targetNamespace = "http://spring.demo/") @SOAPBinding(use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) public interface HelloWorld { @WebMethod(operationName = "sayHi", action = "") @WebResult(name = "return", targetNamespace = "") public Dataobject sayHi( @WebParam(name = "arg0", targetNamespace = "") String arg0); } http://www.dke.univie.ac.at 5 Beispiel-Implementierung des Interface package demo.spring; import javax.jws.WebService; @WebService(endpointInterface = "demo.spring.HelloWorld") public class HelloWorldImpl implements HelloWorld { public Dataobject sayHi(String text) { System.out.println(text); return new Dataobject(text, "Name"); } } http://www.dke.univie.ac.at Beispiel-Konfiguration web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value>WEB-INF/beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <display-name>CXF Servlet</display-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet g p p </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> http://www.dke.univie.ac.at 6 Beispiel-Konfiguration beans.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf xmlns:jaxws= http://cxf.apache.org/jaxws apache org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <jaxws:endpoint id="helloWorld" implementor="demo.spring.HelloWorldImpl" address="/HelloWorld" /> </beans> http://www.dke.univie.ac.at Ergebnis WSDL I <wsdl:definitions name="HelloWorldImplService" targetNamespace="http://spring.demo/"> <wsdl:types> <xs:schema attributeFormDefault="unqualified" elementFormDefault="unqualified" targetNamespace "http://spring demo/"> targetNamespace="http://spring.demo/"> <xs:complexType name="dataobject"> <xs:sequence> <xs:element minOccurs="0" name="meaning" type="xs:string"/> <xs:element minOccurs="0" name="name" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="sayHi" type="sayHi"/> <xs:complexType name="sayHi"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:element name="sayHiResponse" type="sayHiResponse"/> <xs:complexType name="sayHiResponse"> http://www.dke.univie.ac.at 7 Ergebnis WSDL II <xs:sequence> <xs:element minOccurs="0" name="return" type="dataobject"/> </xs:sequence> </xs:complexType> / l T </xs:schema> </wsdl:types> <wsdl:message name="sayHiResponse"> <wsdl:part element="tns:sayHiResponse" name="result"> </wsdl:part> </wsdl:message> <wsdl:message name="sayHi"> <wsdl:part element="tns:sayHi" name="parameters"> </wsdl:part> </wsdl:message> http://www.dke.univie.ac.at Ergebnis WSDL III <wsdl:portType name="HelloWorld"> <wsdl:operation name="sayHi"> <wsdl:input message="tns:sayHi" name="sayHi"> </wsdl:input> <wsdl:output message="tns:sayHiResponse" name="sayHiResponse"> </wsdl:output> </wsdl:operation> </wsdl:portType>− <wsdl:binding name="HelloWorldImplServiceSoapBinding" type="tns:HelloWorld"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> http://www.dke.univie.ac.at 8 Ergebnis WSDL IV <wsdl:operation name="sayHi"> <soap:operation soapAction="" style="document"/> <wsdl:input name="sayHi"> <soap:body b d use="literal"/> "lit l"/ </wsdl:input> <wsdl:output name="sayHiResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding>− <wsdl:service name="HelloWorldImplService"> <wsdl:port binding="tns:HelloWorldImplServiceSoapBinding" name="HelloWorldImplPort"> <soap:address location="http://localhost:8080/DKEWebService/HelloWorld"/> </wsdl:port> </wsdl:service> </wsdl:definitions> http://www.dke.univie.ac.at Testen des Web Service über Eclipse Web Services Explorer http://www.dke.univie.ac.at 9 Alternative Web Services über EJB mit JBOSS Application Server Benötigte Software (OpenSource): – – – – Java EE SDK JBOSS Application Server (inkl. EJB Container) Eclipse Entwicklungsumgebung JBOSS Plugin für Eclipse Implementierung von: – Interface (Stub) – Klassen, die das Interface implementieren – Konfiguration der Deployment Deskriptoren http://www.dke.univie.ac.at Beispiel Implementierung package at.ac.dke; import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebService; import javax.jws.soap.SOAPBinding; javax jws soap SOAPBinding; @WebService(name = "TestWs", targetNamespace = "http://hugo.dke.ac.at") @SOAPBinding ( style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL, parameterStyle = SOAPBinding.ParameterStyle.WRAPPED ) public class TestWs { @WebMethod public String greet( @WebParam(name = "name") String name ) { return "Hello" + name; }} http://www.dke.univie.ac.at 10 Beispiel-Konfiguration web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java xmlns= http://java.sun.com/xml/ns/javaee sun com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>TestWS</display-name> <servlet> <servlet-name>TestWs</servlet-name> <servlet-class>at.ac.dke.TestWs</servlet-class> <load-on-startup>1</load-on-startup> <load on startup>1</load on startup> </servlet> <servlet-mapping> <servlet-name>TestWs</servlet-name> <url-pattern>/TestWs</url-pattern> </servlet-mapping> http://www.dke.univie.ac.at Ergebnis http://www.dke.univie.ac.at 11 .NET Framework http://www.dke.univie.ac.at Open Source .NET Entwicklung http://www.mono-project.com/ http://www.dke.univie.ac.at 12 Einige Vergleiche zwischen .NET und J2EE http://www.dke.univie.ac.at Programmiersprachen • J2EE baut auf einer einzigen Sprache auf: Java • .NET ist von Grund auf mehrsprachig konstruiert – C# als neue (wichtigste) Sprache – VB.NET (eigtl. Visual Basic 7), Managed C++, JScript.NET – weitere Sprachen von Microsoft oder von Drittanbietern: • J#, PERL, APL, COBOL, Eiffel, Fortran, Haskell etc. • Die Herausforderung ist nicht der Bytecode Compiler (da gibt auch für JavaVM verschiedene Sprachen) sondern die Interoperabilität auf Klassenebene während der Laufzeit (ohne Linking). http://www.dke.univie.ac.at 13 Plattformneutralität • .NET = Windows – Rotor - eine Betaversion der C# und JScript.NET Compilers und der CLI (Common Language Infrastructure) für Open BSD Unix von Microsoft als Shared Source. – Projekt Mono: Versuch gesamtes .NET Framework als Open Source für Linux zu implementieren. http://www.gomono.com/ • J2EE = gegeben http://www.dke.univie.ac.at Glossar • • • • • • • IIS – Internet Information Server: Der Webserver von Microsoft CLR – Common Language Runtime: gemeinsame Laufzeitumgebung für alle .NET Anwendungen. CG – Garbage Collection: Sie sorgt dafür, das Speicher, der von einem Programm angefordert und benutzt wurde automatisch wieder freigegeben wird. wird Vorsicht beim Programmieren: Die GC bestimmt, wann Speicher physikalisch freigegeben wird. Deshalb sollten „teure“ Resourcen - wie bspw. Datenbankverbindungen - explizit innerhalb einer eigens dafür geschriebenen Methode „entsorgt“ werden. Diese Methode sollte immer dann aufgerufen werden, wenn die Resourcen unmittelbar freigegeben werden sollen. MSIL – Microsoft Intermediate Language JIT – Just in time Managed Code: In der .NET Plattform wird kein nativer Code mehr erzeugt. Stattdessen generieren Compiler unter .NET eine Zwischensprache (MSIL), die dann unter Aufsicht der CLR bei Bedarf (JIT) in nativen Code übersetzt und ausgeführt wird. Deshalb wird der von den Compilern erzeugte Code auch Managed Code genannt. .config-Datei: Jede .NET Anwendung kann mit benutzerspezifischen Einstellungen versehen werden. Diese Einstellungen können in einer XML-Datei abgelegt sein, die sich im Verzeichnis der Anwendung befinden muss. Die Datei muss außerdem die Endung .config haben und den gleichen Namen wie die Anwendung besitzen (z.B.: C:\Test.exe und C:\Test.exe.config). Quelle: Microsoft http://www.dke.univie.ac.at 14