Complex Choice flow in Mule
Content-based routing is used to examine messages and route them to the correct channel or destination depending on a message's content. We use content-based routing when we want to route messages to the right destination.
Choice Flow Control
In Mule, the choice flow control is used to achieve content-based routing where routing will be done based on the message content, like inbound properties, flow variables, and payload. A choice router will always choose only one route. If no route matches, then the default route is used. In a choice router, we use the MEL expression to specify the path for the message.
The choice flow control adds conditional programming to a flow; it is similar to an if/else code block in Java.
Here we are using choice flow control in mule 3 in Anypoint studio 6.2
Here we are routing payload based on 3 parameters id,name and address
Below is the screenshot of choice router conditions :
HTTP Listener Configuration :
path : /testchoice
Below is the flow of choice flow control

URL : http://localhost:8085/api/testchoice
method : POST
input :
output :
XML project code :
<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns:tracking="http://www.mulesoft.org/schema/mule/ee/tracking" xmlns:json="http://www.mulesoft.org/schema/mule/json" 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:spring="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
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/json http://www.mulesoft.org/schema/mule/json/current/mule-json.xsd
http://www.mulesoft.org/schema/mule/ee/tracking http://www.mulesoft.org/schema/mule/ee/tracking/current/mule-tracking-ee.xsd">
<http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8085" doc:name="HTTP Listener Configuration" basePath="/api"/>
<flow name="test_choiceFlow">
<http:listener config-ref="HTTP_Listener_Configuration" path="/testchoice" doc:name="HTTP" allowedMethods="POST"/>
<byte-array-to-string-transformer doc:name="Byte Array to String"/>
<json:json-to-object-transformer returnClass="java.util.HashMap" doc:name="JSON to Object"/>
<logger message="#[payload.id == 1]" level="INFO" doc:name="Logger"/>
<logger message="#[payload.id == '1' && payload.name == 'Himanshu']" level="INFO" doc:name="Logger"/>
<choice doc:name="Choice">
<when expression="#[payload.id == '1' && payload.name == 'Himanshu' && payload.address == 'indore']">
<set-payload doc:name="1 and Himanshu and indore" value="1 and Himanshu and indore"/>
</when>
<when expression="#[payload.id == '1' && payload.name == 'Himanshu']">
<set-payload value="1 and Himanshu" doc:name="1 and Himanshu"/>
</when>
<when expression="#[payload.id == '1']">
<set-payload value="1" doc:name="1"/>
</when>
<when expression="#[payload.id == null && payload.name != null]">
<set-payload doc:name="id is null and name is not null" value="id is null and name is not null"/>
</when>
<when expression="#[payload.isEmpty()]">
<set-payload value="payload is empty" doc:name="payload is empty"/>
</when>
<otherwise>
<set-payload value="in default" doc:name="Default"/>
</otherwise>
</choice>
</flow>
</mule>