| Messaging Patterns Overview | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/TocIcon.gif) | Table of Contents |
Detailed table of contents.
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DocumentIcon.gif) | Preface | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DocumentIcon.gif) | Introduction | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DocumentIcon.gif) | Solving Integration Problems using Patterns | |
Integration Styles |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DocumentIcon.gif) | Introduction to Integration Styles | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/FileTransferIcon.gif) | File Transfer | How can I integrate multiple applications so that they work together and can exchange information? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/SharedDatabaseIcon.gif) | Shared Database | How can I integrate multiple applications so that they work together and can exchange information? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/EncapsulatedSynchronousIcon.gif) | Remote Procedure Invocation | How can I integrate multiple applications so that they work together and can exchange information? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessagingIcon.gif) | Messaging | How can I integrate multiple applications so that they work together and can exchange information? |
Messaging Systems |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessagingIcon.gif) | Introduction to Messaging Systems | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ChannelIcon.gif) | Message Channel | How does one application communicate with another using messaging? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageIcon.gif) | Message | How can two applications connected by a message channel exchange a piece of information? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/PipesAndFiltersIcon.gif) | Pipes and Filters |
How can we perform complex processing on a message while maintaining independence and flexibility?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ContentBasedRouterIcon.gif) | Message Router | How can you decouple individual processing steps so that messages can be passed to different filters depending on a set of conditions? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageTranslatorIcon.gif) | Message Translator |
How can systems using different data formats communicate with each other using messaging?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageEndpointIcon.gif) | Message Endpoint | How does an application connect to a messaging channel to send and receive messages? |
Messaging Channels |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ChannelIcon.gif) | Introduction to Messaging Channels | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/PointToPointIcon.gif) | Point-to-Point Channel | How can the caller be sure that exactly one receiver will receive the document or perform the call? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/PublishSubscribeIcon.gif) | Publish-Subscribe Channel | How can the sender broadcast an event to all interested receivers? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DatatypeChannelIcon.gif) | Datatype Channel | How can the application send a data item such that the receiver will know how to process it? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/InvalidMessageChannelIcon.gif) | Invalid Message Channel | How can a messaging receiver gracefully handle receiving a message that makes no sense? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DeadLetterChannelIcon.gif) | Dead Letter Channel | What will the messaging system do with a message it cannot deliver? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/GuaranteedMessagingIcon.gif) | Guaranteed Delivery | How can the sender make sure that a message will be delivered, even if the messaging system fails? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ChannelAdapterIcon.gif) | Channel Adapter | How can you connect an application to the messaging system so that it can send and receive messages? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessagingBridgeIcon.gif) | Messaging Bridge | How can multiple messaging systems be connected so that messages available on one are also available on the others? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageBusIcon.gif) | Message Bus |
What is an architecture that enables separate applications to work together, but in a decoupled fashion such that applications can be easily added or removed without affecting the others?
|
Message Construction |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageIcon.gif) | Introduction to Message Construction | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/CommandMessageIcon.gif) | Command Message | How can messaging be used to invoke a procedure in another application? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DocumentMessageIcon.gif) | Document Message | How can messaging be used to transfer data between applications? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/EventMessageIcon.gif) | Event Message | How can messaging be used to transmit events from one application to another? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/RequestReplyIcon.gif) | Request-Reply | When an application sends a message, how can it get a response from the receiver? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ReturnAddressIcon.gif) | Return Address | How does a replier know where to send the reply? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/CorrelationIdentifierIcon.gif) | Correlation Identifier | How does a requestor that has received a reply know which request this is the reply for? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageSequenceIcon.gif) | Message Sequence | How can messaging transmit an arbitrarily large amount of data? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageExpirationIcon.gif) | Message Expiration | How can a sender indicate when a message should be considered stale and thus shouldn’t be processed? |
| Format Indicator | How can a message’s data format be designed to allow for possible future changes? |
Interlude: Simple Messaging |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | Introduction to Simple Messaging Examples | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | JMS Request/Reply Example | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | .NET Request/Reply Example | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | JMS Publish/Subscribe Example | |
Message Routing |
| Introduction to Message Routing | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ContentBasedRouterIcon.gif) | Content-Based Router |
How do we handle a situation where the implementation of a single logical function (e.g., inventory check) is spread across multiple physical systems?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageFilterIcon.gif) | Message Filter | How can a component avoid receiving uninteresting messages? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DynamicRouterIcon.gif) | Dynamic Router | How can you avoid the dependency of the router on all possible destinations while maintaining its efficiency? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/RecipientListIcon.gif) | Recipient List | How do we route a message to a list of dynamically specified recipients? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/SplitterIcon.gif) | Splitter |
How can we process a message if it contains multiple elements, each of which may have to be processed in a different way?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/AggregatorIcon.gif) | Aggregator |
How do we combine the results of individual, but related messages so that they can be processed as a whole?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ResequencerIcon.gif) | Resequencer | How can we get a stream of related but out-of-sequence messages back into the correct order? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DistributionAggregateIcon.gif) | Composed Message Processor |
How can you maintain the overall message flow when processing a message consisting of multiple elements, each of which may require different processing?
|
| Scatter-Gather |
How do you maintain the overall message flow when a message needs to be sent to multiple recipients, each of which may send a reply?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/RoutingTableIcon.gif) | Routing Slip |
How do we route a message consecutively through a series of processing steps when the sequence of steps is not known at design-time and may vary for each message?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ProcessManagerIcon.gif) | Process Manager | How do we route a message through multiple processing steps when the required steps may not be known at design-time and may not be sequential? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageBrokerIcon.gif) | Message Broker | How can you decouple the destination of a message from the sender and maintain central control over the flow of messages? |
Message Transformation |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageTranslatorIcon.gif) | Introduction to Message Transformation | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/EnvelopeWrapperIcon.gif) | Envelope Wrapper |
How can existing systems participate in a messaging exchange that places specific requirements on the message format, such as message header fields or encryption?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DataEnricherIcon.gif) | Content Enricher |
How do we communicate with another system if the message originator does not have all the required data items available?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ContentFilterIcon.gif) | Content Filter |
How do you simplify dealing with a large message, when you are interested only in a few data items?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/StoreInLibraryIcon.gif) | Claim Check |
How can we reduce the data volume of message sent across the system without sacrificing information content?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/NormalizerIcon.gif) | Normalizer | How do you process messages that are semantically equivalent, but arrive in a different format? |
| Canonical Data Model | How can you minimize dependencies when integrating applications that use different data formats? |
Interlude: Composed Messaging |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | Introduction to Composed Messaging Examples | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | Synchronous Implementation using Web Services | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | Asynchronous Implementation with MSMQ | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | Asynchronous Implementation with TIBCO ActiveEnterprise | |
Messaging Endpoints |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageEndpointIcon.gif) | Introduction to Messaging Endpoints | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessagingGatewayIcon.gif) | Messaging Gateway | How do you encapsulate access to the messaging system from the rest of the application? |
| Messaging Mapper | How do you move data between domain objects and the messaging infrastructure while keeping the two independent of each other? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/TransactionalClientIcon.gif) | Transactional Client | How can a client control its transactions with the messaging system? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/PollingConsumerIcon.gif) | Polling Consumer | How can an application consume a message when the application is ready? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/EventDrivenConsumerIcon.gif) | Event-Driven Consumer | How can an application automatically consume messages as they become available? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/CompetingConsumersIcon.gif) | Competing Consumers | How can a messaging client process multiple messages concurrently? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageDispatcherIcon.gif) | Message Dispatcher | How can multiple consumers on a single channel coordinate their message processing? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageSelectorIcon.gif) | Selective Consumer | How can a message consumer select which messages it wishes to receive? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DurableSubscriptionIcon.gif) | Durable Subscriber | How can a subscriber avoid missing messages while it’s not listening for them? |
| Idempotent Receiver | How can a message receiver deal with duplicate messages? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessagingAdapterIcon.gif) | Service Activator | How can an application design a service to be invoked both via various messaging technologies and via non-messaging techniques? |
System Management |
| Introduction to System Management | |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ControlBusIcon.gif) | Control Bus |
How can we effectively administer a messaging system that is distributed across multiple platforms and a wide geographic area?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/DetourIcon.gif) | Detour | How can you route a message through intermediate steps to perform validation, testing or debugging functions? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/WireTapIcon.gif) | Wire Tap | How do you inspect messages that travel on a point-to-point channel? |
| Message History |
How can we effectively analyze and debug the flow of messages in a loosely coupled system?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/MessageStoreIcon.gif) | Message Store |
How can we report against message information without disturbing the loosely coupled and transient nature of a messaging system?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/SmartProxyIcon.gif) | Smart Proxy | How can you track messages on a service that publishes reply messages to the Return Address specified by the requestor? |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/TestMessageIcon.gif) | Test Message |
What happens, though, if a component is actively processing messages, but garbles outgoing messages due to an internal fault?
|
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ChannelPurgerIcon.gif) | Channel Purger | How can you keep 'left-over' messages on a channel from disturbing tests or running systems? |
Interlude: Systems Management Example |
![](/web/20220824192523im_/https://www.enterpriseintegrationpatterns.com/img/ExampleIcon.gif) | Loan Broker System Management | |
Integration Patterns in Practice |
| Case Study: Bond Trading System | |
Concluding Remarks |
| Emerging Standards and Futures in Enterprise Integration | |
Appendices |
| Bibliography |
Annotated list of references and recommended reading.
|
| Revision History |
Chronological list of changes.
|