Upload
ada-brandt
View
153
Download
2
Tags:
Embed Size (px)
Citation preview
Enterprise Application Integration
Björn Eilers
Enterprise Application Integration
Message oriented Middleware
2
Enterprise Application Integration
Björn Eilers
Nachrichtenmanagement
Einordnung in funktionale Bestandteile einer EAI Infrastruktur
Prozessmanagement
MiddlewareAd
apte
r
Met
adat
enba
nk fü
r Zus
atzd
iens
te
Adap
ter
Adap
ter
Adap
ter
Adap
ter
Adap
ter
Physisches Netzwerk
3
Enterprise Application Integration
Björn Eilers
Kommunikation zwischen IS in Unternehmen
Remote Procedure Calls
Interface-basierte MiddlewareCORBA
EJB
DCOM+
Web Services
Nachrichten
Ko
pp
lun
g
eng
lose
4
Enterprise Application Integration
Björn Eilers
Schnittstellen vs. Nachrichten
SchnittstellenFür Intraprogramm- bis Intraserver-Kommunikation
Enge Kopplung der Systeme
Ermöglicht Typprüfung während Kompilierung und Laufzeit
I.d.R. schnelle Aufrufe
Anpassung umfangreicher Systeme aufwändig bis wirtschaftlich unmöglichSchnittstellen alter und neuer Systeme oft inkompatibel
Schnittstelleint addiere(int x, int y);
Aufrufende Klasseint result = schnittstelle.addiere(17, 25)
17
25
42
Implementierungint addiere(int x, int y) {return x+y; }
5
Enterprise Application Integration
Björn Eilers
Schnittstellen vs. Nachrichten
NachrichtenFür Intraserver bis Intersystem-Kommunikation
Lose Kopplung der Systeme
bietet Zustellungsgarantie (Nachricht bei Systemausfall später zugestellt)
keine Typprüfung
langsam (Overhead durch Ver- und Entpacken der Nachricht)
Einfache Anpassung auch bei größeren Systemen Für Kompatibilität mit Altsystemen: alte Nachrichteninhalte beibehalten, neue Ergänzen)
Sender EmpfängerNachrichten-
warteschlange
An: EmpfängerDienst: addierex: 17y: 25
6
Enterprise Application Integration
Björn Eilers
Kommunikationsmodelle
Synchrone KommunikationSender und Empfänger in Ablauf aneinander gekoppelt
Sender blockiert, bis Empfänger antwortet
Asynchrone KommunikationSender und Empfänger in Ablauf nicht gekoppelt
Während Empfänger Antwort berechnet, kann Sender weiterarbeiten
Sender Empfänger
Sender Empfänger
7
Enterprise Application Integration
Björn Eilers
Kommunikationsvarianten
Synchrone Einwegkommunikationz.B. entfernter Methodenaufruf ohne Rückgabe
1. Sender sendet Anfrage an Empfänger und blockiert
2. Empfänger nimmt Nachricht entgegen, sendet Bestätigung ("Acknowledgement") und verarbeitet dann Nachricht
3. Sender erhält Bestätigung und kann direkt weiterarbeiten
Sender Empfänger
Ack
8
Enterprise Application Integration
Björn Eilers
Kommunikationsvarianten
Synchrones PollingSender fragt periodisch bei Empfänger an, ob Resultate vorliegen
Antwort entweder als Nachricht oder in gemeinsamem Speicher
1. Sender schickt Anfrage an Empfänger und arbeitet weiter
2. Empfänger startet Verarbeitung
3. Sender fragt regelmäßig nach ErgebnissenFalls keine vorhanden, wird weitergearbeitet und später erneut nachgefragt
4. Ergebnis liegt vor: Ergebnis wird geliefert, Empfänger kann weiterarbeiten
5. Sender arbeitet mit Ergebnis weiter
Sender Empfänger
9
Enterprise Application Integration
Björn Eilers
Kommunikationsvarianten
Asynchrones BroadcastingSender sendet Nachricht an mehrere Empfänger gleichzeitig, arbeitet weiter
Jeder Empfänger erhält Nachricht und kann reagieren
Sender
Empfänger 3
Empfänger 2
Empfänger 1
10
Enterprise Application Integration
Björn Eilers
Kommunikationsvarianten
Asynchrones Publish/SubscribeÄhnlich zum Broadcast, aber Empfänger müssen bei "Zusteller" Themen abonnieren
Nur registrierte Empfänger erhalten Nachricht
Zusteller
Empfänger 3
Empfänger 2
Empfänger 1
A
A
Sender Abonniere Thema A
Abonniere Thema A
Abonniere Thema B
A
11
Enterprise Application Integration
Björn Eilers
Message oriented Middleware
Middleware, die über die Weitergabe von Nachrichten kommuniziert
Dienste zentriert auf NachrichtenAnlegen
Weitergabe
Auslieferung
Speicherung (Persistierung)
Transaktionssicherheit
MoM als Vermittler zwischen Sender und EmpfängerMessage-Server / Message-Broker
12
Enterprise Application Integration
Björn Eilers
Message oriented Middleware
VorteileAsynchrone Kommunikation sehr allgemein, ermöglicht Emulation anderer Modelle
Aufgrund allgemeinen Charakters hohes Maß an Interoperabilität zwischen heterogenen Systemen
Für lose gekoppelte Systeme sehr gut geeignet; XML-Dokumente in Nachrichten einbetten
NachteileFehlende Typsicherheit
Overhead durch Ver-/Entpacken und Übermittlung der Nachrichten
13
Enterprise Application Integration
Björn Eilers
Message oriented Middleware
Entweder Standalone…IBM MQSeries
Sun ONE Middleware
MS Message Queue Server
ObjectWeb JORAM
BEA MessageQ
EldoS MsgConnect
CSS NetZyme Enterprise
TIBCO ActiveEnterprise
…oder als Bestandteil anderer Middleware-Systemez. B. Java 2 Enterprise Edition (JMS und Message-Driven Beans)
14
Enterprise Application Integration
Björn Eilers
Java Message Service
Spezifikation, definiert Schnittstellen und Protokolle für Kommunikation durch Nachrichtenaustausch
Kommunikationsvariantenasynchrones Senden (normale asynchrone Kommunikation)
asynchrones Publish/Subscribe
asynchrones Request/Reply
synchrones Request/Reply (normale blockierende, synchrone Kommunikation)
synchrone Einwegkommunikation
Ermöglicht bei entsprechender Programmierung auch weitere Kommunikationsvarianten
15
Enterprise Application Integration
Björn Eilers
Java Message Service
Zwei Arten von NachrichtenkanälenQueues: Einfache Warteschlangen für n:1-Kommunikation
Topics: Publish/Subscribe-Kanäle für n:m-Kommunikation
Queues und Topics sind zueinander inkompatibel
Grundlegende Technologie für Message-Driven Beans
Sender 1
Sender 2
Sender 1
Sender 2
Queue
Topic
Empfänger
Empfänger 1
Empfänger 2
16
Enterprise Application Integration
Björn Eilers
Java Message Service
NachrichtenBestehen aus Header, Properties und Body
Header enthält Meta-Angaben (Empfänger, Lebensdauer, ...)
Properties enthalten zusätzliche, frei definierbare Angaben(primitive Datentypen und Strings)
Body enthält den eigentlichen Inhalt
Nachrichtenarten (implementieren javax.jms.Message)TextMessage: Zum Übermitteln eines Strings
MapMessage: Für Namen-Werte-Paare primitiver Datentypen
ObjectMessage: Zum Übermitteln eines serialisierbaren Objektes
BytesMessage: Liefert einen beschreibbaren Byte-Stream
StreamMessage: Für einen Stream primitiver Datentypen
SpyMessage (JBoss-spezifisch): Nachricht ohne Inhalt ("Ping")
HeaderProperties
Body
17
Enterprise Application Integration
Björn Eilers
Java Message Service
Für Versand und Empfang existiert Interface-Hierarchiejavax.jms.ConnectionFactory: Baut Verbindungen zwischen JMS Client und JMS Provider auf; wird von J2EE bereitgestellt
javax.jms.Connection: Kapselt Verbindungen
javax.jms.Session: Sitzung, innerhalb der Nachrichten gesendet und empfangen werden können
javax.jms.Destination: Ziel einer Nachricht (z.B. Queue oder Topic), muss im J2EE-Kontext bereitliegen
javax.jms.MessageProducer/MessageConsumer: Sender/Empfänger einer Nachricht, kommunizieren mit Destination
Jeweils mit Subklassen für Queues und Topics (QueueConnectionFactory, TopicConnectionFactory, etc.)
Destinations können auch temporär sein
18
Enterprise Application Integration
Björn Eilers
Java Message Service
ConnectionFactory
Connection
erzeugt
Session
erzeugt
Nachricht
erzeugt
MessageProducererzeugt
Destination
sendet an
MessageConsumererzeugt
erhält von
19
Enterprise Application Integration
Björn Eilers
Java Message Service
Grundsätzlicher Ablauf der Kommunikation1. ConnectionFactory im JNDI-Kontext auffinden und referenzieren
2. Mithilfe der Factory Connection erzeugen
3. Destination auffinden
4. Session erzeugen
5. Verbindung starten
6. MessageProducer und/oder MessageConsumer erzeugen
7. Nachrichten austauschen
8. Verbindung schließen
20
Enterprise Application Integration
Björn Eilers
Java Message Service
Implementierung: Grundlegendes Gerüst für Clients
try {
Properties p = System.getProperties();
p.setProperty("java.naming.factory.initial",
"org.jnp.interfaces.NamingContextFactory");
p.setProperty("java.naming.factory.url.pkgs",
"org.jboss.naming:org.jnp.interfaces");
p.setProperty("java.naming.provider.url", "localhost");
InitialContext ctx = new InitialContext();
// ...
} catch (JMSException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
21
Enterprise Application Integration
Björn Eilers
Java Message Service
Nachricht an Queue senden
QueueConnectionFactory qcf = (QueueConnectionFactory) ctx .lookup("ConnectionFactory");
QueueConnection qc = qcf.createQueueConnection();
QueueSession qs = qc.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
qc.start();
Queue queue = (Queue) ctx.lookup("queue/BeispielQueue");
QueueSender sender = qs.createSender(queue);
MapMessage exampleMessage = qs.createMapMessage();
// ...
sender.send(exampleMessage);
qc.close();
für Transaktions-unterstützung: true
22
Enterprise Application Integration
Björn Eilers
Java Message Service
Nachricht an Topic senden
TopicConnectionFactory tcf = (TopicConnectionFactory) ctx
.lookup("ConnectionFactory");
TopicConnection tc = tcf.createTopicConnection();
TopicSession ts = tc.createTopicSession(false,
Session.AUTO_ACKNOWLEDGE);
tc.start();
Topic topic = (Topic) ctx.lookup("topic/BeispielTopic");
TopicPublisher publisher = ts.createPublisher(topic);
MapMessage message = ts.createMapMessage();
// ...
publisher.publish(message);
tc.close();
23
Enterprise Application Integration
Björn Eilers
Java Message Service
Asynchrones Empfangen einer Nachricht:Implementieren des Interfaces javax.jms.MessageListener und der Methode public void onMessage
Registrieren des MessageListeners an einem Receiver bzw. Subscriber
public class ExampleListener
implements javax.jms.MessageListener {
public void onMessage(Message message) {
// Verarbeitung: Gebe Empfangshinweis aus
System.out.println("Nachricht mit ID "+
message.getJMSMessageID()+" empfangen.");
}
}
24
Enterprise Application Integration
Björn Eilers
Java Message Service
// Properties setzen ...// Verbindung zum Queue erzeugenInitialContext ctx = new InitialContext();QueueConnectionFactory qcf = (QueueConnectionFactory) ctx .lookup("ConnectionFactory");QueueConnection qc = qcf.createQueueConnection();QueueSession qs = qc .createQueueSession(false, Session.AUTO_ACKNOWLEDGE);Queue queue = (Queue) ctx.lookup(QUEUE_NAME);QueueReceiver receiver = qs.createReceiver(queue);receiver.setMessageListener(new ExampleListener());qc.start();// warten ...// wenn nicht mehr empfangen werden soll: Verbindung schließenqc.close();
Queue
25
Enterprise Application Integration
Björn Eilers
Java Message Service
// Properties setzen ...// Verbindung zum Topic erzeugenInitialContext ctx = new InitialContext();TopicConnectionFactory tcf = (TopicConnectionFactory) ctx .lookup("ConnectionFactory");TopicConnection tc = tcf.createTopicConnection();TopicSession ts = tc .createTopicSession(false, Session.AUTO_ACKNOWLEDGE);Topic topic = (Topic) ctx.lookup(TOPIC_NAME);TopicSubscriber subscriber = ts.createSubscriber(topic);subscriber.setMessageListener(new ExampleListener());tc.start();// warten ...// wenn nicht mehr empfangen werden soll: Verbindung schließentc.close();
Topic
26
Enterprise Application Integration
Björn Eilers
Java Message Service
Synchrones Empfangen einer NachrichtZwei Möglichkeiten:
QueueRequestor bzw. TopicRequestor-Objekt (Vorteil: einfach implementiert, Nachteil: kein Timeout)
QueueReceiver bzw. TopicSubscriber (Vorteil: flexibler, Nachteil: höherer Implementierungsaufwand)
tc.start();
Topic topic = (Topic) ctx.lookup(TOPIC_NAME);
TopicRequestor trq = new TopicRequestor(ts, topic);
ObjectMessage exampleMessage = ts.createObjectMessage();
// ... Nachricht mit Inhalten füllen ...
Message answer = trq.request(exampleMessage);
// Antwort auswerten
tc.close();
27
Enterprise Application Integration
Björn Eilers
Java Message Service
qc.start();
Queue queue = (Queue) ctx.lookup(QUEUE_NAME);
QueueRequestor qrq = new QueueRequestor(qs, queue);
ObjectMessage exampleMessage = ts.createObjectMessage();
// Nachricht mit Inhalten füllen
...
Message answer = trq.request(exampleMessage);
// Antwort auswerten
qc.close();
28
Enterprise Application Integration
Björn Eilers
Java Message Service
Dienstenutzer:tc.start();Topic topic = (Topic) ctx.lookup("topic/TestTopic");TopicPublisher publisher = ts.createPublisher(topic);TemporaryTopic replyTopic = ts.createTemporaryTopic();TopicSubscriber subscriber = ts.createSubscriber(replyTopic);MapMessage exampleMessage = ts.createMapMessage();// ... Nachricht füllen ...// Rückgabekanal setzenexampleMessage.setJMSReplyTo(replyTopic);// Nachricht sendenpublisher.publish(exampleMessage);// Max. 15 sek. auf Antwort wartenMessage answer = subscriber.receive(15000);// ... Antwort verarbeiten ...tc.close();
29
Enterprise Application Integration
Björn Eilers
Java Message Service
Diensteanbieter (hier MessageListener/MDB, auch receive/reply):public void onMessage(Message message) {
try {
// Antwort auslesen
// TopicConnection tc und Session ts erstellen
tc.start();
Topic replyTopic = (Topic)message.getJMSReplyTo();
TopicPublisher publisher =
ts.createPublisher(replyTopic);
Message replyMessage = ts.createMessage();
// ... Nachricht mit Inhalt füllen ...
publisher.publish(replyMessage);
tc.close();
} catch (Exception e) {} }
30
Enterprise Application Integration
Björn Eilers
Java Message Service
Message Selektoren:Nur für Topics
Nachrichten können anhand ihrer Properties selektiert werden
Beispiel: Wetterinformationen nur für eine bestimmte Stadt aus Topic selektieren
Angabe eines Selektors bei Erzeugung eines TopicSubscribers:topicSession.createSubscriber(topic, messageSelector, true);
Selektorstring: Bezeichner, Werte, Vergleichs- und logische Operatoren"Stadt = 'Münster' AND Temperatur BETWEEN 15 AND 25 AND Sicht NOT IN ('neblig', 'dunkel') AND Absender LIKE 'B%n E%rs'"
Setzen der Properties in der Nachricht:message.setStringProperty("Stadt", "Münster");message.setIntProperty("Temperatur", 18);
31
Enterprise Application Integration
Björn Eilers
Java Message Service
Mehrere Nachrichten synchron empfangenVoraussetzung: Maximale Anzahl an Empfängern bekannt
Ausgehende Nachricht senden
In Schleife mit queueReceiver.receive() bzw. topicSubscriber.subscribe() Nachrichten empfangen, dabei
Timeout mit jeder Nachricht reduzieren
Schleife verlassen, wenn Timeout oder maximale Anzahl an Nachrichten erhalten
32
Enterprise Application Integration
Björn Eilers
Message-Driven Beans
Message-Driven BeansStellen JMS-Nachrichtenempfänger dar
Können Queues oder Topics abfragen
kapseln das Empfangen von Nachricht, nur Verarbeitung muss implementiert werden
Interface MessageDrivenBean und MessageListener müssen implementiert werden
Verarbeitung dann über onMessage()-Methode
Wichtig: ohne zusätzlichen Implementierungsaufwand kein Senden von Nachrichten
33
Enterprise Application Integration
Björn Eilers
Message-Driven Beans
Definition der Eigenschaften einer Message-Driven Bean über XDoclet
@ejb.beandestination-type = "javax.jms.(Topic|Queue)": Setzt die Art der Destination
destination-jndi-name = "destinationJNDIName": Setzt den JNDI-Namen der Destination
acknowledge-mode = "Auto-acknowledge": Nachrichten-Empfang automatisch bestätigen
message-selector = "Selektorstring": Definieren eines Message Selektors für Topics
@jboss.destination-jndi-name name = "destinationJNDIName": JNDI-Namen der Destination im JBoss bekanntgeben
34
Enterprise Application Integration
Björn Eilers
Message-Driven Beans
Beispiel:
/** @ejb.bean name="ExampleMDB"
* display-name="Example Message Driven Bean"
* destination-type="javax.jms.Topic"
* destination-jndi-name = "topic/ExampleTopic"
* acknowledge-mode="Auto-acknowledge"
* message-selector="ExampleString = 'example'"
* @jboss.destination-jndi-name
* name = "topic/ExampleTopic" */
public class TransferBean implements MessageDrivenBean, MessageListener {
}
35
Enterprise Application Integration
Björn Eilers
Message-Driven Beans
public class TransferBean implements MessageDrivenBean, MessageListener {
private MessageDrivenContext ctx; public TransferBean() { } public void setMessageDrivenContext(MessageDrivenContext ctx) throws EJBException { this.ctx = ctx; } public void ejbCreate() { } public void ejbRemove() throws EJBException { } public void onMessage(Message message) { // ... Nachrichten verarbeiten }}
36
Enterprise Application Integration
Björn Eilers
Beispiel<<SessionBean>>
AccountManagementBean
-unbenannt1 : AccountBean
+makeTransfer( sourceAccNo : String, destAccNo : String, amount : float )
<<GUI>>AbstractClient
#makeTransfer( transferInformation : TransferInformation )
<<MessageDrivenBean>>TransferBean
#makeTransfer( transferInformation : TransferInformation )+onMessage( message : Message )
<<Swing Component>>TransferPanel
+getTransferInformation() : TransferInformation
TransferInformation
-receiverInstituteName : String-receiverInstituteID : String-receiverAccount : String
-senderAccount : String
-referenceText : String
-receiverName : String
-senderName : String
-amount : float
<<EntityBean>>AccountBean
-accountNumber : String
-forename : String
-balance : float-name : String
<<Swing Component>>TransferReplyDialog
<<GUI>>CustomerClient
<<GUI>>ClerkClient
-replyDialog
1
-transferPanel1
37
Enterprise Application Integration
Björn Eilers
Literatur
Keller, W.: Enterprise Application Integration, dpunkt-Verlag 2002.Guter Überblick über sowohl technische als auch wirtschaftliche Aspekte der EAI
Roman, E., et. al.: Mastering Enterprise JavaBeans, Third Editionhttp://www.theserverside.com/books/wiley/masteringEJB/index.tss
Java Message Service Specification 1.1http://java.sun.com/products/jms/docs.html
Kurzdokumentationen zu J2EE und EAIhttp://www.torsten-horn.de/techdocs/#JEE (einführende Beispiel in J2EE)