Aufgaben zur Klausur „Enterprise Application Integration“ im SS 2006 Aufgabe 1: Integrationstopologien (6+12=18 Punkte) In der Vorlesung haben Sie drei verschiedene Topologien zur Gestaltung einer Integrationsinfrastruktur kennen gelernt. a) Erläutern Sie die Struktur der „Hub and Spokes“ Topologie und der „Punkt zu Punkt“ Integration am Beispiel einer Integration von 4 Systemen mithilfe jeweils einer kommentierten Grafik! b) Stellen Sie die Eigenschaften dieser Integrationsansätze mithilfe der nachfolgenden Tabelle stichwortartig gegenüber! „Hub and Spokes“ Topologie „Punkt zu Punkt“ Integration Implementierungsaufwand Wartungsaufwand Standardisierungsgrad der Schnittstellen Performanz Skalierbarkeit Flexibilität Aufgabe 2: Vergleich von MOM und BPEL (7 Punkte) Vergleichen Sie MOM und BPEL wie in der Vorlesung vorgestellt stichwortartig und tabellarisch anhand von sieben Aspekten! Aufgabe 3: Java Message Service (16+4=20 Punkte) a) Gegeben seien drei Message-Driven Beans, die über ein Topic Nachrichten mit aktuellen Aktienkursen entgegen nehmen und in eine dahinter liegende Datenbankeintragen. Die Nachricht ist vom Typ ObjectMessage und enthält ein Objekt der Klasse StockInformation. Als Antwort wird eine Nachricht vom Typ TextMessage zurückgesendet, in der der „Erfolg“ oder „Misserfolg“ des Eintragens des Kurses in die Datenbank als String enthalten ist („Der Aktienkurs wurde erfolgreich/nicht erfolgreich eingetragen“). Vervollständigen Sie das Gerüst der vorliegenden Java-Klasse StockClient.java an den grau markierten Stellen um die Logik zum Versenden der ausgehenden Nachricht und zum Empfang der drei Antwortnachrichten! Sie können davon ausgehen, dass die Antworten auf jeden Fall innerhalb von 10 Sekunden eintreffen. 1/7 StockInformation.Java: import java.io.Serializable; public class Stockinformation implements Serializable { private String stockID; private float stockPrice; public StockInformation (String stockID, float stockPrice) { this stockID = stockID; this stockPrice = stockPrice; } public String getStockID return this.stockID; } public float getStockPrice return this.stockPrice; } } StockClient.Java: import java.util.*; import javax.jms.*; import javax.naming.*; public class StockClient { private InitialContext ctx; private TopicConnectionFactory tcf; private TopicConnection tc; private TopicSession ts; _ hier Ergänzung einfügen public StockClient () throws NamingException, JMSException { ctx = new InitialContext (); tcf = (TopicConnectionFactory) ctx ,lookup (“ConnectionFactory“); tc = tcf.createTopicConnection(); ts = tc.createTopicSession(false, Session.AUTO_ACKNOWLEDGE) tc.start(); _ hier Ergänzung einfügen } public String [] sendStockMessage (StockInformation stockInformation) throws JMSException { String [] result = new String [3]; TextMessage[] answerMessages = new TextMessage [3]; 2/7 _ hier Ergänzung einfügen return result; } public void close [] throws NamingException, JMSException { this.tc.close (); this.ctx.close(); } public static void main String[] arge) { try { StockClient stockClient = new StockClient(); StockInformation stockInformation = new StockInformation {“EAI AG“, 1742.23f}; String[] results = stockClient.sendStockMessage (stockInformation); for (String result : results) System.out.printIn(result); stockClient.close (); } catch (Exception e) { e.printStackTrace (); } } } Ein Wetterdienst bietet seine Wettervorhersagen mithilfe des JMS-Nachrichtendienstes an. Die Abnehmer der Vorhersagen sollen wahlweise alle versendeten Vorhersagen oder nur die für einen bestimmten Ort empfangen können. Stellen Sie dar, welche Art von Destination (Queue oder Topic) für diese Situation am geeignetsten ist! Begründen Sie Ihre Antwort stichpunktartig und präzise! 3/7 Aufgabe 4: (18+9= 27 Punkte) a) Gegeben sei ein Web Service, der eine Operation returnRevenue zur Verfügung stellt, die die Erlöse aller Monate für ein Jahr zurückgibt und dabei eine Jahreszahl als Parameter erwartet. Die Beschreibung des Web Services im WSDL-Format finden Sie weiter unten unter dem Punkt RevByYear?wsdl. Implementieren Sie einen Prozess in der Business Process Execution Language (BPEL), der unter Verwendung des gerade beschriebenen Web Services die aufsummierten Erlöse für ein Jahr ausgibt! Berücksichtigen Sie dabei die vorgegebenen Dokumente RevenueByYear .wsdl, RevenueByYear.pdd und wsdlCatalog.xml, und ergänzen Sie RevenueByYear.Bpel! Hinweis: Fehlerbehandlung vernachlässigen! und Logging können Sie bei dieser Aufgabe RevByYear?wsdl <xml version=“1.0“ encoding=”UTF-8“?> <wsdl:definitions targetNamespace=“http://revenues“ xmlns:apachesoap=“http://xml.apache.org/xml-soap“ xmlns:impl=“http://revenues“ xmlns:intf=“http://revenues“ xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/“ xmlns:wsdlsoap=“http://schemas.xmlsoap.org/wsdl/soap/“ xmlns:xsd=“http://www.w3.org/2001/XMLSchema“> <wsdl:types> <schema elementFormDefault=“qualified“ targetNamespace=“http://revenues“ xmlns=“http://www.w3.org/2001/XMLSchema“> <element name=“returnRevenue“> <complexType><sequence> <element name=“in0“ type=“xsd:int“/> </sequence></complexType> </element> <element name=„returnRevenueResponse“> <complexType><sequence> <element maxOccurs=”unbounded“ name=”returnRevenueReturn“ type=”xsd:int“/> </sequence></complexType> </element> </schema> </wsdl:types> <wsdl:message name=“returnRevenueResponse“> <wsdl:part element=”impl:returnRevenueResponse“ name=”parameters“/> </wsdl:message> <wsdl:message name=“returnRevenueRequest“ <wsdl:part element=“impl:returnRevenue“ name=“parameters“/> </wsdl:message> <wsdl:portType name=“RevenuesByYear“> <wsdl:operation name=“returnRevenue“> <wsdl:input message=“impl:returnRevenueRequest” name=“returnRevenueRequest“/> <wsdl:output message=”impl:returnRevenueResponse“ name=“returnRevenueResponse“/> </wsdl:operation> </wsdl:portType> 4/7 <wsdl:binding name=“RevByYearSoapBinding“ type=“impl:RevenuesByYear“> <wsdlsoap:binding style=“document“ transport=“http://schemas.xmlsoap.org/soap/http“/> <wsdl:operation name=“returnRevenue“> <wsdlsoap:operation soapAction=““/> <wsdl:input name=“returnRevenueRequest“> <wsdlsoap:body use=“literal“/> </wsdl:input> <wsdl:output name=“returnRevenueResponse“: <wsdlsoap:body use=“literal“/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name=“RevenuesByYearService“> <wsdl:port binding=“impl:RevByYearSoapBinding“ name=“RevByYear“> <wsdlsoap:address location=“http://localhost:8080/axis/services/RevByYear“/> </wsdl:port> </wsdl:service> </wsdl:definitions> RevenueByYear.wsdl: <?xml version=“1.0“ encoding=“utf-8“?> <wsdl:definitions targetNamespace=“http://revenue.by.year“> xmlns:tns=“http://revenue.by.year“ xmlns:rby=“http://revenues“ xmlns:wsdl=“http://schemas.xmlsoap.org/wsdl/“ xmlns:plnk=“http://schemas.xmlsoap.org/ws/2003/05/partner-link/“ xmlns:xsd=“http://www.w3.org/2001/XMLSchema>“ <wsdl:types> <xsd:schema targetNamespace=“http://revenue.by.year“> <xsd:element name=“year“ type=“xsd:int“/> <xsd:element name=“revenue“ type=“xsd:int“/> <xsd:schema> </wsdl:types> <wsdl:message name=“RevenueRequest“> <wsdl:part name=“parameter“ element=“tns:year“/> </wsdl:message> <wsdl:message name=“RevenueReponse“> <wsdl:part name=“parameter“ element=“tns:revenue“/> </wsdl:message> <wsdl:portType name=“RevenueByYear“> <wsdl:operation name=“getRevByYear“/> <wsdl:input message=“tns:RevenueRequest“/> <wsdl:output message=“tns:RevenueResponse“/> </wsdl:operation> </wsdl:portType> <plnk:partnerLinkType name=“RevenueByYearPLT“/> <plnk:role> name=“Caller“> <plnk:portType name=“tns:RevenueByYear“/> <plnk:role> </plnk:partnerLinkType> 5/7 <plnk:partnerLinkType name = „RevenuesByYearPLT“> <plnk:role name =“Receiver“> <plnk:portType name=“rby:RevenuesByYear“/> </plnk:role> </plnk:partnerlinkType> </wsdl:definitions> RevenueByYear.pdd: <?xml version=“1.0“ encoding=“UTF-8“?> <process location=“bpel/RevenueByYear.bpel“ name =“tns:RevenueByYearProcess“ xmlns=“http://schemas.active-endpoints.com/pdd/2004/09/pdd.xsd“ xmlns:tns=“http://revenue.by.year“ xmlns:wsa=“http://schemas.xmlsoap.org/ws/2003/03/addressing“> <partnerLinks> <partnerLink name=“RevenueByYearPL“> <myRole allowedRoles=““ binding=“MSG“ service=“RevenueByYearService“/> </partnerLink> <partnerLink name=“RevenuesByYearPL“> <partnerRole endpointReference=“static“ invokeHandler=“default:Service“> <wsa:EndpointReference xmlns:rby=“http://revenues“> <wsa:Address>http://localhost:8080/axis/services/RevByYear</wsa:Address> <wsa:ServiceName PortName=“RevByYear“> rby:RevenuesByYearService </wsa:EndpointReference> </partnerRole> </partnerLink> </partnerLinks> <wsdlReferences> <wsdl location=“wsdl/RevenueByYear.wsdl“ namespace=“http://revenue.by.year“/> <wsdl location=“http://localhost:8080/axis/services/RevByYear?wsdl“ namespace=“http://revenues“/> <wsdlReferences> <process> wsdlCatalog.xml: <?xml version „1.0“ encoding=“UTF-3“?> <wsdlCatalog> <wsdlEntry location=“wsdl/RevenueByYear.wsdl“ classpath=“wsdl/RevenueByYear.wsdl“/> </wsdlCatalog> RevenueByYear.bpel: <?xml version=“1.0“ encoding=“utf-3“?> <process name=“RevenueByYearProcess“ targetNamespace=“http://revenue.by.year“ xmlns:tns=“http://revenue.by.year xmlns:rby=http://revenues“ xmlns=“http://schemas.xmlsoap.org/ws/2003/03/business-process/“ xmlns:xsd=“http://www.w3.org/2001/XMLSchema“ xmlns:bpws=“http://schemas.xmlsoap.org/ws/2003/03/business-process/“ 6/7 xmlns:soapenc=“http://schemas.xmlsoap.org/soap/encoding/>“ <partnerLinks> <partnerLink name=“RevenueByYearPL“ partnerLinkType=“tns:RevenueByYearPLT“ myRole=“Caller“/> <partnerLink name=“RevenuesByYearPL“ partnerLinkType=“tns:RevenuesByYearPLT“ partnerRole=“Receiver“/> </partnerLinks> _ hier Ergänzung einfügen b) Beschreiben Sie den Aufruf der Operation returnRevenue des Web Service aus Aufgabenteil a) aus einem Java-Client anhand einer Grafik. Zeichnen Sie sämtliche beteiligte Klassen in das Diagramm ein und kennzeichnen Sie alle Ihnen bekannten Protokolle, die bei der Kommunikation verwendet werden. Zeigen Sie zudem auf, an welchen Stellen Nachrichten an den Server und die Antworten an den Client in andere Formate konvertiert werden müssen! Gehen Sie davon aus, dass sowohl der Client als auch der Server mit Hilfe des Apache Axis-Frameworks in der Version 1.3 realisiert wurden! 7/7