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

Post on 16-Jun-2020

9 views 0 download

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

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

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

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)

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)

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

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.

7vs10.4

:InitialContext :ConnectionFactory :Connection :Session

new

lookup

createConnection new createSession

new

createTextMessage

createProducer

start

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

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

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)

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

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

}

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

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

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

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

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

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

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)

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

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.

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

23vs10.4

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

Damit wird das Volumen übertragener Meldungen minimiert.