Reputation: 123
My current situation:
I currently have a Mule ESB application with three flows which process messages originating from two different sources, these three flows are tied together using a VM queue.
Flow #1:
Inbound (Endpoint #1) -> (Perform message processing and transformations) -> Outbound (Endpoint #3)
Flow #2:
Inbound (Endpoint #2) -> (Perform message processing and transformations) -> Outbound (Endpoint #3)
Flow #3
Inbound (Endpoint #3) -> (Perform message processing and transformations, do stuff) -> Outbound
Problem/ Issue:
Now what I want to do is introduce a fourth flow, Flow #4, that gets state information from an inbound endpoint and based off this information be able to prevent Flow #3 from ever being executed/ prevent it from processing its inbound messages.
In other words, what I'd ideally like is to have Flow #4 run at the startup of the ESB application (like all flows seem to automatically do), and based on the state information it gets from its inbound message, prevent/ allow or enable/ disable Flow #3 from ever processing messages from Endpoint #3.
The following are what I ideally require:
Requirements:
What's the best way to accomplish what I want to do?
If there is no real good solution, then if I must omit #3 requirement, then what's the best way to accomplish such a global variable that is shared between two independent flows that aren't tied together by some outbound -> inbound endpoint in the XML config? I've tried using session properties, but they require that the flows be tied together as either subflows or by an endpoint.
Thanks.
Upvotes: 5
Views: 4968
Reputation: 33413
Use a global property and a few MEL expressions to make this happen:
<global-property name="gate_open" value="true" />
<flow name="gated-flow">
<vm:inbound-endpoint path="gated.in" />
<expression-filter expression="#[app.registry.gate_open]" />
...
</flow>
<flow name="gate-controller">
<vm:inbound-endpoint path="gate.in" />
<expression-component>
app.registry.gate_open = false
</expression-component>
</flow>
Sending any message to vm://gate.in
will close the gate and gated-flow
will stop processing the messages it receives.
You can use any protocol you want instead of VM.
Upvotes: 7