<until-successful objectStore-ref="objectStore" maxRetries="5" secondsBetweenRetries="60" doc:name="Until Successful">
<http:outbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" method="POST" doc:name="HTTP"/>
</until-successful>
Until Successful Scope
The until-successful scope processes messages through the processors within its scope until the operation succeeds. Until-successful’s processing occurs asynchronously from the main flow. After passing a message into the until-successful scope, the main flow immediately regains control of the thread.
Until-successful repeatedly retries to process a message which is attempting to complete an activity such as:
-
dispatching to outbound endpoints, for example, when calling a remote web service that may have availability issues
-
executing a component method, for example, when executing on a Spring bean that may depend on unreliable resources
-
executing a subflow
Success and Failure
As this scope continues to processes messages until successful, it is important to understand the definition of successful in context of Mule message processing.
FAILURE |
A message processor within the until-successful scope throws an exception. |
SUCCESS |
A message processor within the until-successful scope does not return a message (i.e. is a one-way endpoint) |
conditional |
Where you have configured a failure expression (see below), Mule evaluates the return message against the expression to dynamically determine if the action has failed or succeeded. |
FAILURE |
A message processor within the until-successful scope contains an exception payload. |
SUCCESS |
A message processor within the until-successful scope does not contain an exception payload. |
Configuring failureExpression
The following illustrates how to configure the failureExpression
on an until-successful scope:
<until-successful objectStore-ref="objectStore"
failureExpression="#[header:INBOUND:http.status != 202]"
maxRetries="6"
secondsBetweenRetries="600">
<http:outbound-endpoint address="http://acme.com/api/flakey"
exchange-pattern="request-response"
method="POST" />
</until-successful>
Configuring a Dead Letter Queue
To manage messages which have exhausted the number of maxRetries
within the until-successful scope, you can define a DLQ (dead letter queue) endpoint to which Mule can send such messages. Refer to the code sample below for an example configuration.
<until-successful objectStore-ref="objectStore"
deadLetterQueue-ref="dlqChannel"
maxRetries="3"
secondsBetweenRetries="10">
...
</until-successful>
Until-Successful and Object Store
This message processor needs an ListableObjectStore instance in order to persist messages pending (re)processing. There are several implementations available in Mule, including the following:
-
DefaultInMemoryObjectStore: default in-memory store
-
DefaultPersistentObjectStore: default persistent store
-
FileObjectStore: file-based store
-
QueuePersistenceObjectStore: global queue store
-
SimpleMemoryObjectStore: in-memory store
See Mule Object Stores for further information about object stores in Mule. The following code sample illustrates how to configure an in-memory store:
<spring:bean id="objectStore" class="org.mule.util.store.SimpleMemoryObjectStore" />
See Also
-
Learn more about Tuning Performance in Mule.
-
Learn more about Scopes in Mule in general.
-
Learn more about Flows and Subflows