Wednesday, December 9, 2015

How to use send mediator in WSO2 ESB

Send mediator is used to send current message to a particular given endpoint or basically out of the synapse code. If you are not using any endpoint and also using send mediator then same message is send to the initiator because it also makes a copy of the current message.


To send a message to a particular destination this mediator must be used even you want same message as a reply.

Syntax:

When no Address:

<send/> syntax is used when no endpoint is there, if this is written in out sequence of the service, means same message will be replied back to the requester.

With Endpoint Address:

<send>
   (endpointref | endpoint)+
</send>

Above syntax will send current message to defined endpoint and same message can be used for the further logic.

With Service Chaining:

<send receive="ManagerDetailSEQ">
    <endpoint key=" ManagerDetailsEPR"/>
</send>

Above syntax is used when we need to have service chaining in our composite service logic. Above syntax shows that current message will be directed to the ManagerDetails endpoint, for which a particular key has been defined and ManagerDetailSEQ will be executed. So message can be captured for the logic in this ManagerDetailSEQ sequence.

Use from UI Configuration:

Send mediator can be found inside of Core option category as mentioned in below image.



One you click on the send mediator, you will get the below screen in which you have to provide some information.



None: As already mentioned above, if you don’t select anything then it means same message will be replied back to initiator.

Define Inline: In this option you can add a defined endpoint, there is an Add option appears in which you can add an endpoint in which you have to send the message.



Pick from Registry: In this option you can choose an endpoint from governance registry.

Receiving sequence Type: Just after the sending the message to the endpoint, which sequence you want to execute, you can define.

In the latest version you can get one more option like mentioned below:

Build Message before sending:

If you put Yes in it, it stores the message in memory and then send to endpoint otherwise does not store. To performance point of view select it to NO.


Example:

    <proxy name="DSS_EmployeeDetailDataServiceProxy" transports="http" startOnLoad="true" trace="disable" statistics="enable">
        <target inSequence="DSS_EmployeeDetailDataService_IN" outSequence="CommonSequence_OUT" faultSequence="DSS_EmployeeDetailDataService_Fault"/>
        <publishWSDL key="DSS_EmployeeDetailDataService_wsdl"/>
    </proxy>
                           <localEntry key="DSS_EmployeeDetailDataService_wsdl" src="file:repository/conf/employee/EmployeeDetailDataService.wsdl"/>
                           <sequence name="DSS_EmployeeDetailDataService_IN">
        <log level="full"/>
        <script language="js">java.lang.Thread.sleep(50000);</script>
        <cache id="GetEmpDetailCache" scope="per-host" collector="false" hashGenerator="org.wso2.caching.digest.DOMHASHGenerator" timeout="20" maxMessageSize="500">
            <implementation type="memory" maxSize="1000"/>
        </cache>
        <send>
            <endpoint key="DSS_EmployeeDetailDataService_EPR"/>
        </send>
    </sequence>
                           <endpoint name="DSS_EmployeeDetailDataService_EPR">
        <address uri="http://10.251.162.192:9763/services/EmployeeDataService1">
            <timeout>
                <duration>10000</duration>
                <responseAction>fault</responseAction>
            </timeout>
            <suspendOnFailure>
                <errorCodes>101500,101501,101506,101507,101508</errorCodes>
                <progressionFactor>0.0</progressionFactor>
            </suspendOnFailure>
            <markForSuspension>
                <errorCodes>101504,101505</errorCodes>
            </markForSuspension>
        </address>
    </endpoint>
                            <sequence name="CommonSequence_OUT">
        <log level="full"/>
        <cache id="GetEmpDetailCache" scope="per-host" collector="true"/>
        <send/>
    </sequence>