Message Channel
Before talking about routing, translation or aggregation, we have to name what separates two applications: the channel. EIP §60 lays down this elementary brick, which the rest of the catalogue dresses up with richer semantics.
Problem
Two applications must exchange messages without knowing each other directly. If the sender opens a TCP socket on the receiver's IP, both sides become coupled to the transport, to simultaneous availability, to network stability. The first outage or third consumer breaks everything. In EDI, we also need encryption, signing and receipts; and the sender often does not know whether the receiver is online. We therefore need an abstraction that represents the conduit itself — addressable, typed, with a defined delivery semantic.
Forces
- Spatial decoupling. The sender must not know the receiver's IP or availability, only the channel name.
- Temporal decoupling. Sender and receiver need not run at the same time; the channel can buffer.
- Typing. A channel does not carry just anything: a type (ORDERS, INVOIC, MDN…) is attached so consumers do not read messages they cannot process.
- Delivery semantic. At-most-once, at-least-once, exactly-once — each carries a cost and trade-off; the channel must declare it.
- Durability. Persist messages on disk or not? Latency vs. fault-tolerance trade-off.
Solution
EIP §60 (Hohpe & Woolf, 2003) defines the Message Channel as a named logical conduit between two or more participants. The channel carries five essential attributes: an addressable name (URI, JMS subject, queue ARN, Kafka topic), a direction (input / output / bidirectional), a message type (accepted schema), a delivery semantic (at-most-once, at-least-once, exactly-once) and a durability profile (persistent, in-memory, signed). Application code does not bind to a peer, it binds to a channel.
Application A Application B
───────────── ─────────────
┌──────────┐ channel ┌──────────┐
│ producer │ ───────────────────────▶ │ consumer │
└──────────┘ addressable conduit └──────────┘
- direction
- message type
- delivery semantics
- durability EDI implementation
In EDI, every partner connection is, conceptually, a separate channel:
- Point-to-point AS2 channel. An AS2 connection
between two partners (RFC 4130) is a bilateral channel,
encrypted (CMS / PKCS#7), signed, with an MDN receipt. The
channel's name is typically the pair
(AS2-From, AS2-To). One direction per way. - SFTP channel. A drop directory on an SFTP server
is an asynchronous file-by-file channel. The channel name is the
path (
/edi/in/walmart/). No transactional delivery by default, hence idempotency required downstream. - AS4 PEPPOL channel. An Access Point receives AS4 messages over an HTTPS URL; the channel is the pair (endpoint URL, participant ID). Delivery semantic is at-least-once (NRR via WS-ReliableMessaging).
- Internal Kafka / RabbitMQ channel. Between the
integration hub and the internal microservices, Kafka topics
(
edi.invoic.in.canonical) or configured-retention RabbitMQ queues.
# AS2 message envelope — point-to-point encrypted and signed channel
POST /as2 HTTP/1.1
Host: partner.example.com
Content-Type: application/pkcs7-mime; smime-type=enveloped-data
AS2-From: SUPPLIER_GLN
AS2-To: BUYER_GLN
Message-ID: <inv-202605140001@ediverse.io>
Disposition-Notification-To: as2@ediverse.io
Disposition-Notification-Options: signed-receipt-protocol=optional, pkcs7-signature;
signed-receipt-micalg=optional, sha-256
EDIINT-Features: multiple-attachments, AS2-Reliability
<encrypted-EDIFACT-payload> Reading: the AS2 HTTP header carries the channel's attributes — From / To identify the peers, Message-ID drives uniqueness semantics, Disposition-Notification-To requests the MDN receipt. The emitting application does not know how the channel is implemented underneath (TLS, IP routing, HTTP retry); it publishes on the logical AS2 channel.
Channel taxonomy
Hohpe groups channels into four foundational families:
- Point-to-Point Channel (EIP §103) — exactly one consumer receives each message. EDI equivalent: AS2 between two partners.
- Publish-Subscribe Channel (EIP §106) — multiple consumers receive each message. EDI equivalent: a UBL SBDH routed via PEPPOL to multiple destination APs of one invoice.
- Datatype Channel (EIP §111) — a channel carries
one message type only. EDI equivalent:
edi.orders.canonicalandedi.invoic.canonicalkept separate. - Invalid Message Channel (EIP §115) — where malformed messages go. See Dead Letter Channel.
Anti-patterns
- Coupling to the transport. Writing
new Socket("partner.example.com", 21)in application code instead ofpublish("partner.invoic.out"). Migrating to AS4 means rewriting. - Grab-bag channel. A channel named
edi.inthat accepts every message type. You then need a Message Router upstream anyway — name it. - Implicit delivery semantic. Not declaring whether the channel is at-most-once or at-least-once inevitably leads to duplicate or loss incidents.
- Unversioned channels. When a type's schema
evolves, create
edi.invoic.v2.canonicalbeside it rather than break every consumer.
Related patterns
- Point-to-Point Channel — specialisation for one consumer.
- Publish-Subscribe Channel — specialisation for broadcast.
- Message Bus — assembly of channels into a backbone.
- Dead Letter Channel — special channel for unprocessable messages.
Sources
- Hohpe G., Woolf B. — Enterprise Integration Patterns, Message Channel (§60). enterpriseintegrationpatterns.com — Message Channel
- RFC 4130 — MIME-Based Secure Peer-to-Peer Business Data Interchange Using HTTP, Applicability Statement 2 (AS2). IETF, July 2005. rfc-editor.org/rfc/rfc4130
- Apache Camel — Channel Adapter and the Component / Endpoint concept, concrete application of channels in configuration. camel.apache.org — Component
- OASIS ebXML Messaging Services v3.0 (AS4). The formal definition of an AS4 channel between PEPPOL Access Points.