Scatter Gather in Mule 4 | Routing in Mule 4

Scatter Gather in Mule 4



Scatter Gather routes the payload to multiple destinations parallelly. It then collects the responses from all routes and aggregates them back into a single response.

Once a message is received by Scatter-Gather, it sends a message for concurrent processing to all configured routes. The main thread executing the flow that owns the router waits until all routes complete or time out.

If there are no failures, Mule aggregates the results from each of the routes into a message collection (MessageCollection class). Failure in one route does not stop Scatter-Gather from sending messages to its other configured routes, so it is possible that many or all routes may fail concurrently.

Flow:

Scatter Gather settings:
 

Scatter Gather is used to insert data parallelly in both tables.

If any route fails, then CompositeRouterException occurs.
The failed route is identified by sequential ID.

Method: POST

Input & output:


XML project code:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:db="http://www.mulesoft.org/schema/mule/db" xmlns:http="http://www.mulesoft.org/schema/mule/http"
       xmlns="http://www.mulesoft.org/schema/mule/core"
       xmlns:doc="http://www.mulesoft.org/schema/mule/documentation" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/db http://www.mulesoft.org/schema/mule/db/current/mule-db.xsd">
       <http:listener-config name="HTTP_Listener_config" doc:name="HTTP Listener config" doc:id="fd80a52e-5bd2-402a-8479-752022beb6d6" >
              <http:listener-connection host="0.0.0.0" port="8085" />
       </http:listener-config>
      
       <db:config name="Database_Config" doc:name="Database Config" doc:id="0f447783-a70d-4a3e-91e9-7e0057d07ff7" >
              <db:my-sql-connection host="localhost" port="3306" user="root" password="" database="mule4" />
       </db:config>
       <flow name="test_scatter_gatherFlow" doc:id="129054c3-55bc-42fa-85e9-0d47eddd7917" >
              <http:listener doc:name="Listener" doc:id="bd38bf47-633b-4811-a3d6-b8432cc2970d" config-ref="HTTP_Listener_config" path="/scatter"/>
              <scatter-gather doc:name="Scatter-Gather" doc:id="1e8366b8-36b5-470c-8aca-cd865a2e02a1" >
                     <route >
                           <db:insert doc:name="Insert" doc:id="965d8d96-6e70-488a-8961-71b0bec0a105" config-ref="Database_Config">
                                  <db:sql >insert into info(ID,NAME) values(:ID,:NAME);</db:sql>
                                  <db:input-parameters ><![CDATA[#[{ID: payload.id,
       NAME: payload.name
}]]]></db:input-parameters>
                           </db:insert>
                     </route>
                     <route >
                           <db:insert doc:name="Insert" doc:id="c88fde97-7320-47f5-beea-735f4f69073b" config-ref="Database_Config">
                                  <db:sql >insert into info2(ID,NAME) values(:ID,:NAME);</db:sql>
                                  <db:input-parameters ><![CDATA[#[{
ID:payload.id,
NAME: payload.name
}]]]></db:input-parameters>
                           </db:insert>
                     </route>
              </scatter-gather>
              <set-payload value="Data inserted in Database" doc:name="Set Payload" doc:id="3ee1c60d-c8d5-43b5-8761-aef559c922bb" />
       </flow>
</mule>