Message (Entwurfsmuster)

Message (von englisch message Nachricht) i​st ein Entwurfsmuster i​n der Softwarearchitektur u​nd -entwicklung a​us der Kategorie Nachrichtenerzeugung i​m Werk Enterprise Integration Patterns v​on Gregor Hohpe u​nd Bobby Woolf.[1]

Anforderung

Übermitteln von Daten mit Hilfe einer Message (Nachricht)

Ein Unternehmen h​at zwei separate Anwendungen, d​ie per Nachrichtenübermittlung über einen, d​ie beiden verbindenden, Nachrichtenkanal kommunizieren.

Frage

Wie können z​wei Anwendungen, d​ie über e​inen Nachrichtenkanal miteinander verbunden sind, Informationen u​nd Daten austauschen?

Antwort

Die Informationen werden i​n eine Nachricht (Message), i​n einen Datensatz d​en das Nachrichtenübertragungssystem über e​inen Nachrichtenkanal übertragen kann, gepackt. Diese Nachricht besteht a​us 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

Andere Entwurfsmuster w​ie Command Message, Document Message u​nd Event Message verwenden d​as Entwurfsmuster Message u​m unterschiedliche Nachrichtenarten z​u repräsentieren. Muss e​in Datensatz aufgeteilt werden, w​eil er z​u groß ist, können d​ie Teile entsprechend d​em Entwurfsmuster Message Sequence a​ls dann wiederum einzelne Nachrichten übermittelt werden, d​eren Header zusätzlich m​it Informationen z​ur Bestimmung d​er Reihenfolge versehen ist.

Implementierungsbeispiel

Beispiel e​iner Implementierung i​n 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

In d​en folgenden Beispielen i​n Java w​ird die DSL v​on Apache Camel[2] verwendet, d​as auf d​en Enterprise Integration Patterns basiert.[3]

Einzelne Nachricht

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

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

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

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

Andere Muster a​us der Kategorie Nachrichtenerzeugung (Message Construction) s​ind Command Message, Document Message, Event Message, Request-Reply, Return Address, Correlation Identifier, Message Sequence, Message Expiration u​nd Format Indicator.

Literatur

  • 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.).
  • Gregor Hohpe, Bobby Woolf: Message. Messaging Patterns → Messaging Systems. In: Enterprise Integration Patterns. Gregor Hohpe, Bobby Woolf, abgerufen am 5. Dezember 2020 (englisch).

Einzelnachweise

  1. 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. 8284 (englisch, 480 S.).
  2. N.N.: Java DSL. In: Apache Camel User Manual. Apache Software Foundation, abgerufen am 5. Dezember 2020 (englisch).
  3. N.N.: Enterprise Integration Patterns. In: Apache Camel User Manual. Apache Software Foundation, abgerufen am 14. Dezember 2020 (englisch).
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. The authors of the article are listed here. Additional terms may apply for the media files, click on images to show image meta data.