Skip to main content

Exits and Global Forwards

This page covers advanced pipeline flow control: defining exits, using global forwards to reduce repetition, and structuring pipelines for clarity.

Pipeline Exits​

Every pipeline must declare at least one <Exit>. Exits define the possible end states of a pipeline and map to HTTP response codes (for API-based adapters).

<Pipeline>
<Exits>
<Exit name="Exit" state="SUCCESS" code="200"/>
<Exit name="Created" state="SUCCESS" code="201"/>
<Exit name="BadRequest" state="ERROR" code="400"/>
<Exit name="NotFound" state="ERROR" code="404"/>
<Exit name="ServerError" state="ERROR" code="500"/>
</Exits>
<!-- pipes here -->
</Pipeline>

Exit Attributes​

AttributeDescription
nameUnique identifier; referenced by forwards in pipes
stateSUCCESS or ERROR; determines whether the result is treated as successful
codeHTTP status code returned to the caller (for HTTP-based listeners)

A pipe routes to an exit by specifying the exit's name in a <Forward> element's path attribute.

Global Forwards​

When multiple pipes need to forward to the same exit or pipe (e.g., a shared error handler), declaring the same <Forward> on every pipe is repetitive. Global forwards solve this by defining forwards at the pipeline level that apply to all pipes.

<Pipeline>
<Exits>
<Exit name="Exit" state="SUCCESS" code="200"/>
<Exit name="BadRequest" state="ERROR" code="400"/>
<Exit name="ServerError" state="ERROR" code="500"/>
</Exits>

<GlobalForward name="exception" path="ServerError"/>
<GlobalForward name="failure" path="BadRequest"/>

<XmlValidatorPipe name="validate" root="order" schema="order.xsd">
<Forward name="success" path="process"/>
<!-- "failure" forward is inherited from the global forward -->
</XmlValidatorPipe>

<SenderPipe name="process">
<FixedQuerySender query="INSERT INTO orders VALUES(?{id})" datasourceName="jdbc/${instance.name.lc}">
<Param name="id" xpathExpression="/order/@id"/>
</FixedQuerySender>
<Forward name="success" path="Exit"/>
<!-- "exception" forward is inherited from the global forward -->
</SenderPipe>
</Pipeline>

How Global Forwards Work​

  • A global forward applies to all pipes in the pipeline.
  • If a pipe declares its own <Forward> with the same name, the pipe-level forward takes precedence (overrides the global).
  • Global forwards are typically used for failure and exception outcomes that should route to the same exit across all pipes.

Common Global Forward Names​

Forward NameTypical Use
successDefault success path (rarely used globally)
failureValidation or processing failures
exceptionUnexpected errors or exceptions
parserErrorXML parsing errors

Combining Exits and Global Forwards​

A well-structured pipeline uses exits to define all possible outcomes and global forwards to establish default routing, with pipe-level forwards only where behavior differs from the default:

<Pipeline firstPipe="validate">
<Exits>
<Exit name="Exit" state="SUCCESS" code="200"/>
<Exit name="BadRequest" state="ERROR" code="400"/>
<Exit name="ServerError" state="ERROR" code="500"/>
</Exits>

<GlobalForward name="failure" path="BadRequest"/>
<GlobalForward name="exception" path="ServerError"/>

<XmlValidatorPipe name="validate" root="request" schema="request.xsd">
<Forward name="success" path="transform"/>
</XmlValidatorPipe>

<XsltPipe name="transform" styleSheetName="transform.xsl">
<Forward name="success" path="store"/>
</XsltPipe>

<SenderPipe name="store">
<FixedQuerySender query="INSERT INTO data VALUES(?{value})">
<Param name="value" xpathExpression="/result/value"/>
</FixedQuerySender>
<Forward name="success" path="Exit"/>
</SenderPipe>
</Pipeline>

This pattern keeps configurations concise and ensures consistent error handling across all pipes.