enterprise application integration björn eilers enterprise application integration message oriented...

37
Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

Upload: ada-brandt

Post on 05-Apr-2015

153 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

Enterprise Application Integration

Björn Eilers

Enterprise Application Integration

Message oriented Middleware

Page 2: 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

Page 3: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 4: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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; }

Page 5: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 6: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 7: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 8: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 9: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 10: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 11: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 12: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 13: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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)

Page 14: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 15: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 16: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 17: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 18: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 19: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 20: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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();

}

Page 21: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 22: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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();

Page 23: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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.");

}

}

Page 24: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 25: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 26: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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();

Page 27: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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();

Page 28: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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();

Page 29: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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) {} }

Page 30: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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);

Page 31: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 32: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 33: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 34: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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 {

}

Page 35: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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 }}

Page 36: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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

Page 37: Enterprise Application Integration Björn Eilers Enterprise Application Integration Message oriented Middleware

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)