Message (Entwurfsmuster)
-
Symbol für Entwurfsmuster Message (Nachricht)
Message (von englisch message ‚Nachricht‘) ist ein Entwurfsmuster in der Softwarearchitektur und -entwicklung aus der Kategorie Nachrichtenerzeugung im Werk Enterprise Integration Patterns von Gregor Hohpe und Bobby Woolf.[1]
Anforderung
[Bearbeiten | Quelltext bearbeiten]![](http://178.128.105.246/host-http-upload.wikimedia.org/wikipedia/commons/d/d4/Enterprise_Integration_Patterns_-_Message_sketch.gif)
Ein Unternehmen hat zwei separate Anwendungen, die per Nachrichtenübermittlung über einen, die beiden verbindenden, Nachrichtenkanal kommunizieren.
Frage
[Bearbeiten | Quelltext bearbeiten]Wie können zwei Anwendungen, die über einen Nachrichtenkanal miteinander verbunden sind, Informationen und Daten austauschen?
Antwort
[Bearbeiten | Quelltext bearbeiten]Die Informationen werden in eine Nachricht (Message), in einen Datensatz den das Nachrichtenübertragungssystem über einen Nachrichtenkanal übertragen kann, gepackt. Diese Nachricht besteht aus zwei Teilen:
- dem Header, der, unter anderem, die zu übertragenden Daten beschreibt, sowie den Ursprung und das Ziel der Nachricht enthält
- dem Body, der die zu übertragenden Daten enthält.
Grundlage weiterer Muster
[Bearbeiten | Quelltext bearbeiten]Andere Entwurfsmuster wie Command Message, Document Message und Event Message verwenden das Entwurfsmuster Message um unterschiedliche Nachrichtenarten zu repräsentieren. Muss ein Datensatz aufgeteilt werden, weil er zu groß ist, können die Teile entsprechend dem Entwurfsmuster Message Sequence als dann wiederum einzelne Nachrichten übermittelt werden, deren Header zusätzlich mit Informationen zur Bestimmung der Reihenfolge versehen ist.
Implementierungsbeispiel
[Bearbeiten | Quelltext bearbeiten]Beispiel einer Implementierung in Java:
public class Message implements Serializable {
private final MessageHeader header;
private final MessageBody body;
public Message (MessageHeader header, MessageBody body) {
this.header = header;
this.body = body;
}
// ...
}
Verwendungsbeispiel
[Bearbeiten | Quelltext bearbeiten]In den folgenden Beispielen in Java wird die DSL von Apache Camel[2] verwendet, das auf den Enterprise Integration Patterns basiert.[3]
Einzelne Nachricht
[Bearbeiten | Quelltext bearbeiten]package org.wikipedia.de.eip.message.construction;
import static java.lang.System.out;
import org.apache.camel.Message;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
class SingleMessageSample {
class Data {
String info = "**** containing information ****";
} // Data
private static final DefaultCamelContext cc = new DefaultCamelContext();
public static void main( final String... args ) throws Exception {
final Data data = new SingleMessageSample().new Data();
cc.setName( "SingleMessageSample" );
cc.addRoutes( new RouteBuilder() {
@Override
public void configure() {
from( "timer:start?repeatCount=1" )
.process().message( m -> m.setBody( data ) ) // EIP Message
.process().message( m -> print( "Send", m ) )
.log( "Sending..." )
.to( "direct:receive" ) // EIP Sender
.setId( "Sender" );
from( "direct:receive" ) // EIP Receiver
.log( "Receiving..." )
.process().message( m -> print( "Receive", m ) ) // EIP Message
.setId( "Receiver" );
}
} );
cc.start();
Thread.sleep( 2000 );
cc.stop();
cc.close();
} // main()
static void print( final String endpoint, final Message m ) {
out.printf( "%s %s: %s%n", endpoint, m, m.getBody( Data.class ).info );
} // print()
} // SingleMessageSample
Ausgabe
[Bearbeiten | Quelltext bearbeiten]...
Send Message: **** containing information ****
[ple) thread #1 - timer://start] Sender INFO Sending...
[ple) thread #1 - timer://start] Receiver INFO Receiving...
Receive Message: **** containing information ****
...
Multiple Nachrichten
[Bearbeiten | Quelltext bearbeiten]package org.wikipedia.de.eip.message.construction;
import static java.lang.System.out;
import java.util.LinkedList;
import java.util.NoSuchElementException;
import org.apache.camel.Message;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
class MultipleMessagesSample {
class Data extends LinkedList<String> {
Data() {
add( "**** 1st info ****" );
add( "**** 2nd info ****" );
add( "**** 3rd info ****" );
}
} // Data
private static final DefaultCamelContext cc = new DefaultCamelContext();
public static void main( final String... args ) throws Exception {
final Data data = new MultipleMessagesSample().new Data();
cc.setName( "Multiple Messages Sample" );
cc.addRoutes( new RouteBuilder() {
@Override
public void configure() {
onException( NoSuchElementException.class )
.handled( true )
.stop(); // aktuelle Übertragung wird abgebrochen
from( "timer:start" )
.process().message( m -> m.setBody( data.remove() ) ) // EIP Message; throws NoSuchElementException if empty Queue
.process().message( m -> print( "Sending", m ) )
.log( "Sending..." )
.to( "direct:receive" ) // EIP Sender
.setId( "Sender" );
from( "direct:receive" ) // EIP Receiver
.log( "Receiving..." )
.process().message( m -> print( "Receiving", m ) ) // EIP Message
.setId( "Receiver" );
}
} );
cc.start();
Thread.sleep( 4000 );
cc.stop();
cc.close();
} // main()
static void print( final String process, final Message m ) {
out.printf( "%s %s: %s%n", process, m, m.getBody() );
} // print()
} // MultipleMessagesSample
Ausgabe
[Bearbeiten | Quelltext bearbeiten]...
Sending Message: **** 1st info ****
[ple) thread #1 - timer://start] Sender INFO Sending...
[ple) thread #1 - timer://start] Receiver INFO Receiving...
Receiving Message: **** 1st info ****
Sending Message: **** 2nd info ****
[ple) thread #1 - timer://start] Sender INFO Sending...
[ple) thread #1 - timer://start] Receiver INFO Receiving...
Receiving Message: **** 2nd info ****
Sending Message: **** 3rd info ****
[ple) thread #1 - timer://start] Sender INFO Sending...
[ple) thread #1 - timer://start] Receiver INFO Receiving...
Receiving Message: **** 3rd info ****
...
Verwandte Muster
[Bearbeiten | Quelltext bearbeiten]Andere Muster aus der Kategorie Nachrichtenerzeugung (Message Construction) sind Command Message, Document Message, Event Message, Request-Reply, Return Address, Correlation Identifier, Message Sequence, Message Expiration und Format Indicator.
Literatur
[Bearbeiten | Quelltext bearbeiten]- Gregor Hohpe, Bobby Woolf: Enterprise Integration Patterns. Designing, Building and Deploying Messaging Solutions. Hrsg.: Addison-Wesley. 1. Auflage. Addison-Wesley, 2003, ISBN 978-0-321-20068-6 (englisch, 480 S.).
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Gregor Hohpe, Bobby Woolf: Message. Messaging Patterns → Messaging Systems. In: Enterprise Integration Patterns. Gregor Hohpe, Bobby Woolf, abgerufen am 5. Dezember 2020 (englisch).
Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ Gregor Hohpe, Bobby Woolf: Enterprise Integration Patterns. Designing, Building and Deploying Messaging Solutions. Hrsg.: Addison-Wesley. 1. Auflage. Addison-Wesley, 2003, ISBN 978-0-321-20068-6, S. 82–84 (englisch, 480 S.).
- ↑ N.N.: Java DSL. In: Apache Camel User Manual. Apache Software Foundation, abgerufen am 5. Dezember 2020 (englisch).
- ↑ N.N.: Enterprise Integration Patterns. In: Apache Camel User Manual. Apache Software Foundation, abgerufen am 14. Dezember 2020 (englisch).