1
10.4 JMS - Java Message Service
ist Schnittstelle zu 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/products/jms/javadoc-102a 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
vs10.4 2
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):
vs10.4 3
Rumpf (body), bestimmt den Nachrichten-Typ:
StreamMessage Folge von primitiven WertenMapMessage Name/Wert-Paare mit primitiven WertenTextMessage Typ String (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)
vs10.4 4
10.4.1 Sitzungen und Verbindungen
Nachrichten (messages) sind Objekte, die vom Sender
nach ihrer Erzeugung mit Inhalt gefüllt werden
Quellen und Senken sind Objekte, die bei ihrer Erzeugung
an eine bestimmte Queue (bzw. Topic) gebunden werden
und Operationen send bzw. receive für das
Senden bzw. Empfangen von Nachrichten anbieten
(Empfangen im Push Mode ist ebenfalls möglich)
vs10.4 5
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 Objekte
werden 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).
vs10.4 6
Verbindung (connection) zum JMS muss hergestellt werden,
bevor – auf deren Basis – Sitzungen eröffnet werden
können. Beim Herstellen der Verbindung authentisiert
sich der Klient. Typischerweise hat der Dienst keinen
lokalen 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 eine
Verbindungsfabrik erzeugt. Diese stellt gleichsam den
„Anker“ des ganzen Messaging-Systems dar und wird über
das JNDI (Java Naming and Directory Interface) erhalten.
vs10.4 7
:InitialContext :ConnectionFactory :Connection :Session
new
lookup
createConnection new createSession
new
createTextMessage
createProducer
start
vs10.4 8
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ünscht
erst danach werden Nachrichten zugestellt
vs10.4 9
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");
TextMessage message = session.createTextMessage();message.setText("Do this and that ...");
MessageProducer producer = session.createProducer(tasks);producer.send(message);
vs10.4 10
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 MessageConsumerQueue
(vgl. CORBA Event Service (10.3.1))
send receive
(Push) (Pull)
vs10.4 11
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");
TextMessage message = session.createTextMessage();message.setText("New security hole discovered in ...");
MessageProducer producer = session.createProducer(alerts);producer.send(message);
vs10.4 12
Senke nimmt Meldungen im Push Mode entgegen. Dafür wird ein
Event 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! }
}
Damit:
MessageConsumer consumer = session.createConsumer(alerts);consumer.setMessageListener(new AlertListener);connection.start();
vs10.4 13
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();
vs10.4 14
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", "Viruses")
vs10.4 15
Empfänger sei nur an Viren-Meldungen interessiert:
entsprechenden Selektor (selector) verwenden !
String selector = "(Subject = 'Viruses')";
MessageConsumer consumer = session.createConsumer(alerts, selector);consumer.setMessageListener(new AlertListener);
connection.start();
vs10.4 16
Syntax von Selektoren:
Teil der Syntax von SQL92 für bedingte Ausdrücke
vs10.4 17
10.5 SIENA
Scalable Internet Event Notification Architecture
(Carzaniga et al. 1998-…)
Weltumspannender Ereignisdienst
Leistungsfähige Filterung
Raffiniert verteilte Architektur und Filterung
vs10.4 18
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
vs10.4 19
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)
vs10.4 20
vs10.4 21
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
Beachte: Eine Quelle ist für eine Senke nur dann relevant, wenn
die durch Ankündigung bzw. Abonnement erfassten
Mengen nicht disjunkt sind.
10.5.2 Überdeckungsrelationen
vs10.4 22
Def.: Ein Abonnement erfasst/überdeckt (covers) eine Meldung,
wenn für jede Aussage des Filters
ein passendes Attribut der Meldung existiert
z.B. string what = alarm string what = alarminteger level > 3 integer level = 5integer level < 7
! Nicht string what = alarm string what = alarminteger level > 3 time date = 02:40:03
vs10.4 23
Def.: Eine Meldung entspricht (is covered by) einer Ankündigung,
wenn jedes Attribut der Meldungzu einer Aussage des Filters passt
z.B. string what = alarm string what = login
string what = login string user = carzanigastring user any
Ankündigung Meldung
Top Related