Message (Entwurfsmuster)

* Symbol für Entwurfsmuster Message (Nachricht)

Message (von englisch message ‚Nachricht') ist ein Entwurfsmuster in der Softwarearchitektur und -entwicklung aus der Kategorie Nachrichtenaufbau (Message Construction) im Werk Enterprise Integration Patterns von Gregor Hohpe und Bobby Woolf.[1]

## Erläuterung

[Bearbeiten | Quelltext bearbeiten]

Übermitteln von Daten mit Hilfe einer Message (Nachricht)

Zwei separate Anwendungen, die per Nachrichtenübermittlung über einen, die beiden verbindenden, Nachrichtenkanal kommunizieren, können Informationen und Daten über eine, in einen Datensatz gepackte Nachricht (Message) austauschen. Eine Nachricht besteht dabei 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 (Nachrichtenreihenfolge) als dann wiederum einzelne Nachrichten übermittelt werden, deren Header zusätzlich mit Informationen zur Festlegung 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 {

static class Data {

String info = "*** containing info ***";
} // Data

private static final DefaultCamelContext cc = new DefaultCamelContext();

public static void main( final String... args ) throws Exception {

final Data data = new Data();

cc.setName( "Single Message Sample" );
cc.addRoutes( new RouteBuilder() {

@Override
public void configure() {

from( "timer:start?repeatCount=1" ) // EIP Sender
.log( "Sending..." )
.process().message( m -> m.setBody( data ) ) // EIP Message
.process().message( m -> print( "Send", m ) )
.to( "direct:receiver" ) // EIP Receiver
.setId( "Sender" );

from( "direct:receiver" ) // 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 ) {

final Data data = m.getBody( Data.class ); // Data packed in Message
out.printf( "%s %s: %s%n", endpoint, m, data.info );
} // print()

} // SingleMessageSample

#### Ausgabe

[Bearbeiten | Quelltext bearbeiten]

...
11:55:00.066 [Camel (Single Message Sample) thread #0 - timer://start] INFO  Sender - Sending...
Send Message: *** containing info ***
11:55:00.070 [Camel (Single Message Sample) thread #0 - timer://start] INFO  Receiver - Receiving...
Receive Message: *** containing info ***
...

### Multiple Nachrichten

[Bearbeiten | Quelltext bearbeiten]

package org.wikipedia.de.eip.message.construction;

import static java.lang.System.out;

import java.util.Vector;

import org.apache.camel.Message;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;

class MultipleMessagesSample {

static class Data extends Vector<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 Data();

cc.setName( "Multiple Messages Sample" );
cc.addRoutes( new RouteBuilder() {

@Override
public void configure() {

onException( IndexOutOfBoundsException.class )
.handled( true )
.stop(); // Übertragung wird nach dem letzten Element der Liste abgebrochen

from( "timer:start" ) // EIP Sender
// remove(i) löst eine IndexOutOfBoundsException aus wenn die Liste leer ist
.process().message( m -> m.setBody( data.remove( 0 ) ) ) // EIP Message
.log( "Sending..." )
.process().message( m -> print( "Sending", m ) )
.to( "direct:receiver" ) // EIP Receiver
.setId( "Sender" );

from( "direct:receiver" ) // 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 ) {

final String data = (String) m.getBody(); // Data packed in Message
out.printf( "%s %s: %s%n", process, m, data );
} // print()

} // MultipleMessagesSample

#### Ausgabe

[Bearbeiten | Quelltext bearbeiten]

...
11:55:00.400 [Camel (Multiple Messages Sample) thread #0 - timer://start] INFO  Sender - Sending...
Sending Message: *** 1st  info ***
11:55:00.403 [Camel (Multiple Messages Sample) thread #0 - timer://start] INFO  Receiver - Receiving...
Receiving Message: *** 1st  info ***
11:55:00.396 [Camel (Multiple Messages Sample) thread #0 - timer://start] INFO  Sender - Sending...
Sending Message: *** 2nd  info ***
11:55:00.396 [Camel (Multiple Messages Sample) thread #0 - timer://start] INFO  Receiver - Receiving...
Receiving Message: *** 2nd  info ***
11:55:00.397 [Camel (Multiple Messages Sample) thread #0 - timer://start] INFO  Sender - Sending...
Sending Message: *** 3rd  info ***
11:55:00.397 [Camel (Multiple Messages Sample) thread #0 - timer://start] INFO  Receiver - Receiving...
Receiving Message: *** 3rd  info ***
...

## Verwandte Muster

[Bearbeiten | Quelltext bearbeiten]

Andere Muster aus der Kategorie Nachrichtenaufbau (Message Construction) sind Command Message, Document Message, Event Message, Request-Reply, Return Address, Correlation Identifier, Message Sequence, Message Expiration und Format Indicator.

Weitere verwandte Muster sind Canonical Data Model, Message Channel, Message Sequence.

## 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]

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. 82-84 (englisch, 480 S.).
2. ↑ Java DSL. In: Apache Camel User Manual. Apache Software Foundation, abgerufen am 5. Dezember 2020 (englisch).
3. ↑ Enterprise Integration Patterns. In: Apache Camel User Manual. Apache Software Foundation, abgerufen am 14. Dezember 2020 (englisch).

Entwurfsmuster

V – D

Erzeugungsmuster |

Abstrakte Fabrik | Erbauer | Fabrikmethode | Prototyp | Singleton | Multiton | Objektpool

|

Strukturmuster |

Adapter | Brücke | Decorator | Fassade | Fliegengewicht | Kompositum | Stellvertreter

Verhaltensmuster |

Beobachter | Besucher | Interpreter | Iterator | Kommando | Memento | Schablonenmethode | Strategie | Vermittler | Zustand | Zuständigkeitskette | Interceptor | Nullobjekt | Protokollstapel

Muster für objekt-
relationale Abbildung |

Datentransferobjekt | Table Data Gateway | Row Data Gateway | Active Record | Unit of Work | Identity Map | Lazy Loading | Identity Field | Dependent Mapping | Embedded Value | Serialized LOB | Inheritance Mapper | Metadata Mapping | Query Object | Command-Query-Responsibility-Segregation

Nachrichten-
übermittlungsmuster |

| Integrationsarten |

File Transfer | Shared Database | Remote Procedure Invocation | Messaging

|

Nachrichtenaufbau |

Message | Command Message | Document Message | Event Message | Request-Reply | Return Address | Correlation Identifier | Message Sequence | Message Expiration | Format Indicator

Endpunkte |

Message Endpoint | Messaging Gateway | Messaging Mapper | Transactional Client | Polling Consumer | Event-driven Consumer | Competing Consumers | Message Dispatcher | Selective Consumer | Durable Subscriber | Idempotent Receiver | Service Activator

Kanäle |

Message Channel | Point-to-Point Channel | Publisher-Subscriber Channel | Datatype Channel | Invalid Message Channel | Dead Letter Channel | Guaranteed Delivery | Channel Adapter | Messaging Bridge | Message Bus

Nachrichtenvermittlung |

Pipes-and-Filters | Message Router | Content-based Router | Message Filter | Dynamic Router | Recipient List | Splitter | Aggregator | Resequencer | Composed Message Processor | Scatter-Gather | Routing Slip | Process Manager | Message Broker

Nachrichtenumwandlung |

Message Translator | Envelope Wrapper | Content Enricher | Content Filter | Claim Check | Normalizer | Canonical Data Model

Systemmanagement |

Control Bus | Detour | Wire Tap | Message History | Message Store | Smart Proxy | Test Message | Channel Purger

andere |

Application Controller | Business Delegate | Data Access Object | Dependency Injection | Extension Interface | Fluent Interface | Inversion of Control (IoC) | Lock | Model View Controller (MVC) | Model View Presenter (MVP) | Model View Update (MVU) | Model View ViewModel (MVVM) | Page Controller | Registry | Remote Facade | Repository | Service Locator | Session State | Table Module | Template View | Threadpool | Transaction Script | Transform View | Two-Step View | Value Object

Siehe auch:  Analysemuster | Architekturmuster | Integrationsmuster | SOA-Muster