Skip to content
Art2link ESB v2.02 LTS HomeDocumentationBlogContact
Core concepts/Ports
Concept

Ports

Ports are the entry and exit boundaries of an integration. Every message in Art2link ESB enters, exits, or is rerouted through a port, and four port types together cover every direction a message can take.

A port binds a configurable processing flow — variable assignments, pipelines, and maps — to either a transport adapter (for receive and send ports), an in-system fold-back (loopback), or a terminal sink (null). The four types share the same stage model; what differs is what sits at the boundary and which directions of the flow are active.

The bus referenced throughout this page is Art2link ESB's internal message fabric, not Azure Service Bus. Messages flow into the bus from receive ports, are picked up off the bus by send, loopback, and null ports through subscription expressions, and — for two-way and loopback flows — are published back to the bus when a response is produced.

Ports are scoped to an Application. Each Application has its own private bus, and a port can only reference resources defined in the same Application — Authentications, Pipelines, Maps, Message types, Schemas, and Variables.

SCOPE Application A Receive Send Loopback Null Bus — private to Application A REFERENCABLE BY THIS APP’S PORTS Authentications Pipelines Maps Message types Schemas Variables Same-Application only. Nothing else is in scope. SCOPE Application B Receive Send Null Bus — private to Application B Its own resources, its own bus. Invisible to Application A’s ports. Per-Application isolation, always.

The list view follows the platform's Selected Application behavior — with an Application selected, the list filters to it and the Application column is hidden; with no selection, the list spans every Application you have access to. Creating a new port works the same way: an Application selection preempts the picker.


PORT TYPES 01 Receive 02 Send 03 Loopback 04 Null DIRECTION ↓ Inbound ↑ Outbound ↻ In-system ✕ Terminal MODES One-way · Two-way One-way · Two-way Two-way only One-way only ADAPTER ✓ Required ✓ Required ✗ None ✗ None MESSAGE TYPE ✓ Publish If 2-way ✓ Required USE CASE Listen for input Dispatch outbound Reshape in-flow Consume & discard

A port exists in one of two states: Draft or Published. Configuring a port can run long — adapter settings, pipelines, maps, subscription expressions — and not all of it has to be finished in one sitting. Saving as a Draft lets you capture a half-configured port and come back to finish it later.

Creating a port. The editor offers two actions. Save as Draft stores the port in whatever state it is in, as long as it has a name and belongs to an Application — nothing else is mandatory. Save finalizes the port as Published and applies the full validation a port has always required.

New port being created Draft name + Application · inert Published full validation · live on the bus Save as Draft Save Publish one-way

What a Draft is. A Draft is inert. It is held separately and takes no part in routing — it does not listen, dispatch, or subscribe, and the runtime ignores it entirely until it is Published. A name and an Application are the only requirements to keep one on file; every other field may be left incomplete. Fields that do carry a value are still validated, though — a Draft will not store an illegal value, only an absent one.

Publishing a Draft. Open a Draft and the editor shows a Publish button. It runs the same full validation as a normal save: if anything is missing or invalid, it surfaces the same errors you would see saving a port the conventional way, and the port stays a Draft with nothing lost. Once validation passes, the port becomes Published.

Publishing is one-way. A Published port cannot return to Draft. Port names follow the usual rule throughout: a name must be unique within its Application across both Drafts and Published ports — the two share a single namespace, so a Draft cannot reuse a name already taken by a Published port, or the reverse.

Two configuration options are independent of port type and direction — they apply equally to receive, send, loopback, and null ports.

Exceptions. When enabled, the port has a configured exception Message Type. On error, the in-flight message's Message Type is swapped to the exception Message Type and republished to the bus — the payload itself is untouched. Subscribe to that Message Type from another port to handle the failure centrally (a send port that emails an alert, writes to a log, files a ticket). Error traffic flows on its own Message Type rather than mixed in with the original.

WITHOUT EXCEPTION MT Port processing a message error TRACKING STATUS Errors No handoff. Run fails outright. WITH EXCEPTION MT Port processing a message SWAP MT Original → Exception payload unchanged Bus HANDLER PORT Subscribed to Exception MT DELIVERY Email / Log / Ticket TRACKING STATUS Exceptions On Tracking: configured exception → Exceptions status; no exception path → Errors.

Tracking. Per-port setting with three levels. Set the level uniformly across every port of a flow to see its full end-to-end execution on the Tracking screen.

Only on Error SUCCESSFUL RUN Nothing persisted FAILED RUN Run record Full step history Message body Enabled EVERY RUN Run record Full step history Message body Body excluded to keep storage cost down Enabled + Body EVERY RUN Run record Full step history Message body Fullest view highest tracking-DB cost

A separate, minimal internal tracking is always on for the runtime dashboard (running and suspended transactions) — it does not depend on this setting. Mind the cost tradeoff: every tracked step writes to the tracking database and is subject to retention and reindexing jobs.

Send, loopback, and null ports each carry a subscription expression — a Boolean filter the bus evaluates against every published message. Two-way receive ports use one as well, the Response Subscription Expression, to identify which message on the bus is the response to send back to the caller through that same port.

Pub/sub. When a message hits the bus, every send, loopback, and null port has its expression evaluated. Every match gets its own copy and runs its outbound flow independently. The same message can be picked up by any number of ports — or by none.

PUBLISHED BY A RECEIVE PORT Message — MT: OrderCreated Bus — evaluates every subscription expression on every publish SEND Orders → ERP {{Message.MessageType}} == "OrderCreated" ✓ MATCH LOOPBACK Enrich + reshape {{Promoted.Order.Region}} == "EU" ✓ MATCH SEND Returns → CRM {{Message.MessageType}} == "ReturnCreated" – NO MATCH NULL Suppress test traffic {{Variable.Env}} == "qa" ✓ MATCH

Message Type. Every message on the bus carries a Message Type — a string identifier, similar in concept to BizTalk's. Subscription expressions most commonly match on it, but can evaluate any of six sources:

MESSAGE TYPE {{Message.MessageType}} String identifier on every message PROMOTED {{Promoted.MessageType.Name}} Property on the message type VARIABLE {{Variable.Name}} Application variables CONFIG {{Config.PortName}} Originating port name BODY PATH {{Message.Body}}.XPath() Read from the body via XPath or JPath CUSTOM FN myFn(...) User-defined predicate

For the complete binding-token reference — every family above plus Constants, and where each is used — see Expressions & bindings.

That is the full set of ports

Receive brings messages in. Send takes them out. Loopback transforms and republishes without leaving. Null consumes and discards. Together they cover every direction a message can take through Art2link ESB. Explore each in detail: Receive port, Send port, Loopback port, Null port.