10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor...

23
1 vs10.4 10.4 JMS - Java Message Service ist Schnittstelle zu MOM-Implementierungen verschiedener Anbieter (z.B. IBM MQSeries) ist sehr liberal bezüglich der Semantik dieser Implementierungen unterstützt sowohl Nachrichten-Stil als auch Ereignis-Stil Paket javax.jms API http://java.sun.com/j2ee/1.4/docs/api/javax/jms/package-summary.html Spez. http://java.sun.com/products/jms/docs.html JMS-Terminologie: Nachrichten: point-to-point via Queues/Schlangen Ereignisse: publish/subscribe via Topics/Themen Quelle und Senke heißen hier producer/consumer

Transcript of 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor...

Page 1: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

1vs10.4

10.4 JMS - Java Message Service

ist Schnittstelle zu MOM-Implementierungen verschiedener Anbieter (z.B. IBM MQSeries)

ist sehr liberal bezüglich der Semantik dieser Implementierungen

unterstützt sowohl Nachrichten-Stil als auch Ereignis-Stil

Paket javax.jms API http://java.sun.com/j2ee/1.4/docs/api/javax/jms/package-summary.html Spez. http://java.sun.com/products/jms/docs.html

JMS-Terminologie:

Nachrichten: point-to-point via Queues/Schlangen

Ereignisse: publish/subscribe via Topics/Themen

Quelle und Senke heißen hier producer/consumer

Page 2: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

2vs10.4

Bestandteile einer Nachricht/Ereignismeldung:

Kopf (header), enthält Adresse (destination),Lieferart (delivery mode)Kennung (message ID)Einlieferungszeit (timestamp)Korrelationskennung (correlation ID)Antwortadresse (replyTo)Wiederholungsanzeige (redelivered)Nachrichtentyp (type)Löschzeitpunkt (expiration)Priorität (priority)

Eigenschaften (properties), d.h. Name/Wert-Paare mit Wertenprimitiver Typen oder String

Rumpf (body):

Page 3: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

3vs10.4

Rumpf (body), bestimmt den Nachrichten-Typ:

StreamMessage Folge von primitiven Werten

MapMessage Name/Wert-Paare mit primitiven Werten

TextMessage Typ String (auch XML!)

ObjectMessage serialisiertes Java-Objekt

BytesMessage Byte-Folge

StreamMessage,.. erweitern die Schnittstelle javax.jms.Message(diese enthält 45 Operationen, hauptsächlich getters und setters)

Page 4: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

4vs10.4

10.4.1 Sitzungen und Verbindungen

Nachrichten (messages) sind Objekte, die vom Sendernach ihrer Erzeugung mit Inhalt gefüllt werden

Quellen und Senken sind Objekte, die bei ihrer Erzeugungan eine bestimmte Queue (bzw. Topic) gebunden werdenund Operationen send bzw. receive für dasSenden bzw. Empfangen von Nachrichten anbieten(Empfangen im Push Mode ist ebenfalls möglich)

Page 5: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

5vs10.4

Sitzung (session) ist der obligatorisch bereitzustellende Kontext für Quellen bzw. Senken – diese werden grundsätzlich mit Bezug auf ein bestimmtes Sitzungsobjekt erzeugt; eine Sitzung fungiert als Fabrikobjekt für Quellen, Senken und Nachrichten.

Ein Sitzungsobjekt und die darüber erzeugten Objektewerden i.d.R. von einem Thread benutzt. Wenn im Push Mode empfangen wird, werden alle Senken der Sitzung von einem Thread bedient. Für nebenläufiges Senden/Empfangen sollten zwei getrennte Sitzungen verwendet werden.

Außerdem fungiert die Sitzung als Transaktionskontext(und hat noch weitere Funktionen).

Page 6: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

6vs10.4

Verbindung (connection) zum JMS muss hergestellt werden,bevor – auf deren Basis – Sitzungen eröffnet werdenkönnen. Beim Herstellen der Verbindung authentisiertsich der Klient. Typischerweise hat der Dienst keinenlokalen Repräsentanten, weshalb eine Verbindung i.d.R.durch eine TCP-Verbindung realisiert wird.

Die Verbindung fungiert als Fabrik für Sitzungen.

Ein Verbindungsobjekt wird wiederum über eineVerbindungsfabrik erzeugt. Diese stellt gleichsam den „Anker“ des ganzen Messaging-Systems dar und wird über das JNDI (Java Naming and Directory Interface) erhalten.

Page 7: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

7vs10.4

:InitialContext :ConnectionFactory :Connection :Session

new

lookup

createConnection new createSession

new

createTextMessage

createProducer

start

Page 8: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

8vs10.4

import javax.naming.*; // providing Context, // InitialContext, ......

import javax.jms.*; // providing Message, // ConnectionFactory, ...

.....

Context context = new InitialContext(); ConnectionFactory factory = (ConnectionFactory)context.lookup("JMSFactory");

Connection connection = factory.createConnection(); Session session = connection.createSession(

false, Session.AUTO_ACKNOWLEDGE); ................... // create producers/consumersconnection.start();

..... keine Transaktionen gewünschterst danach werden Nachrichten zugestellt

Page 9: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

9vs10.4

10.4.2 Schlangen (Queues)

Anwendungsbeispiel:

Quelle generiert „zu erledigende Aufträge“ und legt entsprechende Text-Nachrichten in einer Schlange ab,die unter dem Namen „Assignments“ verzeichnet ist.

Queue tasks = (Queue)context.lookup(„Assignments");MessageProducer producer = session.createProducer(tasks);

TextMessage message = session.createTextMessage();message.setText("Do this and that ...");

producer.send(message);

Page 10: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

10vs10.4

Senke nimmt Aufträge aus dieser Schlange im Pull Mode entgegen:

Queue tasks = (Queue)context.lookup("Assignments");MessageConsumer consumer = session.createConsumer(tasks);TextMessage message = (TextMessage)consumer.receive();

// oder für zeitlich begrenztes Warten: receive(3000);String task = message.getText();

MessageProducer MessageConsumerQueuesend receive

(vgl. CORBA Event Service (10.3.1))

(Push) (Pull)

Page 11: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

11vs10.4

10.4.3 Themen (Topics)

Anwendungsbeispiel:

Quelle generiert Ereignismeldungen zum Thema „Sicherheitswarnungen“, das unter dem Namen „Security Alerts“ verzeichnet ist.

Topic alerts = (Topic)context.lookup("Security Alerts");MessageProducer producer = session.createProducer(alerts);

TextMessage message = session.createTextMessage();message.setText("New security hole discovered in ...");

producer.send(message);

Page 12: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

12vs10.4

Damit:

Topic alerts = (Topic)context.lookup("Security Alerts");MessageConsumer consumer = session.createConsumer(alerts);consumer.setMessageListener(new AlertListener);connection.start();

Senke nimmt Meldungen im Push Mode entgegen. Dafür wird einEvent Handler mit Schnittstelle MessageListener benötigt:

import javax.jms.*;

public class AlertListener implements MessageListener {public void onMessage(Message message) {

String alert = ((TextMessage)message).getText(); ..... // take action! }

}

Page 13: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

13vs10.4

Dauerhaftes Abonnement (durable subscription)

überdauert das Stoppen und Wiederstarten einer Verbindung, d.h. wenn man später erneut an einem Thema interessiert ist,erhält man alle in der Zwischenzeit eingetroffenen Meldungen

MessageConsumer consumer = session.createDurableSubscriber(alerts, "mySub"); // not createConsumerconsumer.setMessageListener(new AlertListener);connection.start();.....connection.stop();.....consumer = session.createDurableSubscriber(alerts, "mySub"); // resumes subscription to topicconsumer.setMessageListener(new AlertListener);connection.start();

Page 14: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

14vs10.4

10.4.4 Filterung

benutzt die Properties einer Meldung.

Anwendungsbeispiel: Meldungen enthalten ein „Betrifft“ in Gestalt einer String Property

TextMessage message = session.createTextMessage();message.setText("Beware of virus 4711 .....");message.setStringProperty("Subject", "Virus")

Page 15: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

15vs10.4

Empfänger sei nur an Viren- und Wurm-Meldungen interessiert:

entsprechenden Selektor (selector) verwenden !

String selector = "(Subject = 'Virus' OR Subject = 'Worm')";

MessageConsumer consumer = session.createConsumer(alerts, selector);consumer.setMessageListener(new AlertListener);

connection.start();

Syntax von Selektoren:

Teil der Syntax von SQL92 für bedingte Ausdrücke

Page 16: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

16vs10.4

10.5 SIENA

Scalable Internet Event Notification Architecture(Carzaniga et al. 1998-…)

Konzeptionell weltumspannender Ereignisdienst

Leistungsfähige Filterung

Raffiniert verteilte Architektur und Filterung

Page 17: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

17vs10.4

Ereignismeldung (notification) = Menge typbehafteter Attribute,

z.B. string class = finance/exchanges/stock time date = Mar 4 11:43:37 MST 1998string exchange = NYSEstring symbol = DISfloat prior = 105.25float change = -4float earn = 2.04

10.5.1 Filtersprache

Page 18: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

18vs10.4

Senken und Quellen von Ereignismeldungen registrieren beim Ereignisdienst Abonnement (subscription) bzw.

Ankündigung (advertisement) (jeweils in Gestalt eines Filters)

die die interessierenden bzw. gemeldeten Ereignisse charakterisieren

Ziel: gezielte, effiziente Vermittlung zwischen Quellen und Senken

10.5.2 Überdeckungsrelationen

Page 19: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

19vs10.4

Filter (filter) = Menge von Aussagen über einzelne Attribute, hauptsächlich mit Vergleichsoperatoren,

z.B. string class >* finance/exchangesstring exchange = NYSEstring symbol = DISfloat change < 0

Muster (pattern) = Folge von Filtern(zur Filterung einer Gruppe von Meldungen)

Page 20: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

20vs10.4

Def.: Ein Abonnement erfasst/überdeckt (covers) eine Meldung, wenn für jede Aussage des Filters ein passendes Attribut der Meldung existiert

z.B. Abonnement Meldung

string what = alarm string what = alarminteger level > 3 integer level = 5integer level < 7

! Nicht Abonnement Meldung string what = alarm string what = alarm

integer level > 3 time date = 02:40:03

Page 21: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

21vs10.4

Def.: Eine Meldung entspricht (is covered by) einer Ankündigung,wenn jedes Attribut der Meldungzu mindestens einer Aussage des Filters passt

z.B. Ankündigung Meldung

string what = alarm string what = loginstring what = login string user = carzanigastring user any

Def.: Ein Abonnement und eine Ankündigung korrespondieren,wenn mindestens eine Nachricht konstruierbar ist, die

- der Ankündigung entspricht und- vom Abonnement erfasst wird.

Page 22: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

22vs10.4

Abonnements und Ankündigungen verschiedener Stationenwerden in geeigneter Weise aggregiert:

string type = alarmint level > 2

string type = alarmint level = 2

string type = quote

string type = alarmint level > 1

string type any

string type = quotestring type = alarmint level > 0

string type = alarmstring type = quoteint level > 0

string type = alarmint level = 3

Page 23: 10.4 JMS - Java Message Service · Verbindung (connection) zum JMS muss hergestellt werden, bevor – auf deren Basis – Sitzungen eröffnet werden können. Beim Herstellen der Verbindung

23vs10.4

SIENA lässt nur solche Pfade zu, bei denen Ankündigungen und Abonnements korrespodieren.

Damit wird das Volumen übertragener Meldungen minimiert.