The Call mediator is used to send messages out of the ESB to an endpoint.
When you invoke a service, the Call mediator acts in a non-blocking mode, and the underlying worker thread returns without waiting for the response.
Since Call mediator behaves in a synchronous manner, mediation pauses after the service invocation, and resumes from the next mediator in the sequence when the response is received. Call mediator allows you to create your configuration independent from the underlying architecture.
Also, Call mediator leverages the non-blocking transports for better performance. You can obtain the service endpoint for the Call mediator as follows:
- Pick from message-level information
- Pick from a pre-defined endpoint
If you do not specify an endpoint, the Call mediator tries to send the message using the WSA:TO
address of the message. If you specify an endpoint, the Call mediator sends the message based on the specified endpoint.
The endpoint type can be Leaf Endpoint (i.e. Address/WSDL/Default/HTTP) or Group Endpoint (i.e. Failover/Load balance/Recipient list).
The Call mediator is a content-unaware mediator.
Enabling mutual SSL in the blocking mode
If you use the Call mediator in the blocking mode (blocking=true), you must enable mutual SSL.
Since the Call mediator is run based on the configuration of the axis2_blocking_client.xml
file, its default HTTPs transport sender is org.apache.axis2.transport.http.CommonsHTTPTransportSender
. Therefore, the Call mediator does not have access to the required key store to handle mutual SSL. To enable the Call mediator to handle mutual SSL, the following JVM settings should be added to the <ESB_HOME>/bin/wso2server.sh
file.
-Djavax.net.ssl.keyStore="$CARBON_HOME/repository/resources/security/wso2carbon.jks" \ -Djavax.net.ssl.keyStorePassword="wso2carbon" \ -Djavax.net.ssl.keyPassword="wso2carbon" \
Syntax
<call/>
If the message is to be sent to one or more endpoints, use the following syntax:
<call> (endpointref | endpoint)+ </call>
- The
endpointref
token refers to the following:
<endpoint key="name"/>
- The
endpoint
token refers to an anonymous endpoint definition.
UI Configuration
Select one of the following options to define the endpoint to which the message should be delivered.
Parameter Name | Description |
---|---|
None | Select this option if you do not want to provide an endpoint. The Call mediator will send the message using its wsa:to address. |
Define Inline | If this is selected, the endpoint to which the message should be sent can be included within the Call mediator configuration. Click Add to add the required endpoint. See Adding an Endpoint for further details. |
Pick From Registry | If this is selected, the message can be sent to a pre-defined endpoint which is currently saved as a resource in the registry. Click either Configuration Registry or Governance Registry as relevant to select the required endpoint from the resource tree. |
XPath | If this is selected, the endpoint to which the message should be sent will be derived via an XPath expression. You are required to enter the relevant XPath expression in the text field that appears when this option is selected. You can click NameSpaces to add namespaces if you are providing an expression. Then the Namespace Editor panel would appear where you can provide any number of namespace prefixes and URLs used in the XPath expression. |
Example
Example 1 - Service orchestration
In this example, the Call mediator invokes a backend service. An Enrich mediator stores the response received for that service invocation.
The Filter Mediator added after the Call mediator carries out a filter to determine whether the first call has been successful. If it is successful, second backend service is invoked. The payload of the request to the second backend is the response of the first service invocation.
After a successful second backend service invocation, response of the first service is retrieved by the Enrich mediator from the property where it was formerly stored. This response is sent to the client by the Respond mediator.
If it is not successful, a custom JSON error message is sent with HTTP 500. If the first call itself is not successful, the output is just sent back with the relevant error code.
<target> <inSequence> <log/> <call> <endpoint> <http method="get" uri-template="http://192.168.1.10:8088/mockaxis2service"/> </endpoint> </call> <enrich> <source type="body" clone="true"/> <target type="property" action="child" property="body_of_first_call"/> </enrich> <filter source="get-property('axis2', 'HTTP_SC')" regex="200"> <then> <log level="custom"> <property name="switchlog" value="Case: first call successful"/> </log> <call> <endpoint> <http method="get" uri-template="http://localhost:8080/MockService1"/> </endpoint> </call> <filter source="get-property('axis2', 'HTTP_SC')" regex="200"> <then> <log level="custom"> <property name="switchlog" value="Case: second call successful"/> </log> <enrich> <source type="property" clone="true" property="body_of_first_call"/> <target type="body"/> </enrich> <respond/> </then> <else> <log level="custom"> <property name="switchlog" value="Case: second call unsuccessful"/> </log> <property name="HTTP_SC" value="500" scope="axis2"/> <payloadFactory media-type="json"> <format>{ "status": "ERROR!"}</format> <args/> </payloadFactory> <respond/> </else> </filter> </then> <else> <log level="custom"> <property name="switchlog" value="Case: first call unsuccessful"/> </log> <respond/> </else> </filter> </inSequence> </target>
Example 2 - Continuing mediation without waiting for responses
In this example, the message will be cloned by the Clone Mediator and sent via the Call mediator. The Drop mediator drops the response so that no further mediation is carried out for the cloned message. However, since the continueParent
attribute of the Clone mediator is set to true
, the original message is mediated in parallel. Therefore, the Log Mediator at the end of the configuration will log the After call mediator
log message without waiting for the Call mediator response.
... <log level="full"/> <clone continueParent="true"> <target> <sequence> <call> <endpoint> <address uri="http://localhost:8080/echoString"/> </endpoint> </call> <drop/> </sequence> </target> </clone> <log level="custom"> <property name="MESSAGE" value="After call mediator"/> </log> ...
Samples
For another example, see Sample 500: Call Mediator for Non-Blocking Service Invocation.