[[pipeline-eip]]
= Pipeline EIP
:page-source: core/camel-core-engine/src/main/docs/eips/pipeline-eip.adoc

Camel supports the http://www.enterpriseintegrationpatterns.com/PipesAndFilters.html[Pipes and Filters] from the xref:enterprise-integration-patterns.adoc[EIP patterns] in various ways.

image::eip/PipesAndFilters.gif[image]

With Camel you can split your processing across multiple independent
xref:endpoint.adoc[Endpoint] instances which can then be chained
together.

== Options

// eip options: START
The Pipeline EIP has no options.
// eip options: END

[[pipeline-Examples]]
== Examples

You can create pipelines of logic using multiple
xref:endpoint.adoc[Endpoint] or xref:message-translator.adoc[Message
Translator] instances as follows

Though pipeline is the default mode of operation when you specify
multiple outputs in Camel. The opposite to pipeline is multicast; which
fires the same message into each of its outputs. (See the example
below).

In Java you do:
[source,java]
----
from("activemq:SomeQueue")
    .pipeline()
      .bean("foo")
      .bean("bar")
      .to("acitvemq:OutputQueueu");
----

The pipeline is the default mode, which can be omitted, and therefore you almost often write as:

[source,java]
----
from("activemq:SomeQueue")
    .bean("foo")
    .bean("bar")
    .to("acitvemq:OutputQueueu");
----

In XML you can use the `<pipeline>` element

[source,xml]
----
<route>
  <from uri="activemq:SomeQueue"/>
  <pipeline>
    <bean ref="foo"/>
    <bean ref="bar"/>
    <to uri="activemq:OutputQueue"/>
  </pipeline>
</route>
----

In the above the pipeline element is actually unnecessary, you could use this:

[source,xml]
----
<route>
  <from uri="activemq:SomeQueue"/>
  <bean ref="foo"/>
  <bean ref="bar"/>
  <to uri="activemq:OutputQueue"/>
</route>
----

Its just a bit more explicit. However if you wish to use `<multicast/>` to
avoid a pipeline - to send the same message into multiple pipelines -
then the `<pipeline>` element comes into its own.

[source,xml]
----
<route>
  <from uri="activemq:SomeQueue"/>
  <multicast>
    <pipeline>
      <bean ref="something"/>
      <to uri="log:Something"/>
    </pipeline>
    <pipeline>
      <bean ref="foo"/>
      <bean ref="bar"/>
      <to uri="activemq:OutputQueue"/>
    </pipeline>
  </multicast>
</route>
----
