<definitions xmlns="http://ws.apache.org/ns/synapse">
<sequence name="main" onError="errorHandler">
<in>
<send>
<endpoint>
<failover>
<endpoint>
<address uri="http://localhost:9001/services/LBService1">
<enableAddressing/>
<suspendDurationOnFailure>60</suspendDurationOnFailure>
</address>
</endpoint>
<endpoint>
<address uri="http://localhost:9002/services/LBService1">
<enableAddressing/>
<suspendDurationOnFailure>60</suspendDurationOnFailure>
</address>
</endpoint>
<endpoint>
<address uri="http://localhost:9003/services/LBService1">
<enableAddressing/>
<suspendDurationOnFailure>60</suspendDurationOnFailure>
</address>
</endpoint>
</failover>
</endpoint>
</send>
<drop/>
</in>
<out>
<!-- Send the messages where they have been sent (i.e. implicit To EPR) -->
<send/>
</out>
</sequence>
<sequence name="errorHandler">
<makefault response="true">
<code xmlns:tns="http://www.w3.org/2003/05/soap-envelope" value="tns:Receiver"/>
<reason value="COULDN'T SEND THE MESSAGE TO THE SERVER."/>
</makefault>
<send/>
</sequence>
</definitions>
Objective
Demonstrate the fail-over routing capabilities of Synapse. In fail-over routing
messages are sent to a designated primary endpoint. When the primary endpoint
fails, Synapse fails over to the one of the backup endpoints.
Executing the Client
Above configuration sends messages with the fail-over behavior. Initially the
server at port 9001 is treated as primary and other two are treated as backups.
Messages are always directed only to the primary server. If the primary server
fails, next listed server is selected as the primary. Thus, messages are sent
successfully as long as there is at least one active server. To test this, run
the loadbalancefailover client to send infinite requests as follows:
ant loadbalancefailover
You can see that all requests are processed by MyServer1. Now shutdown MyServer1
and inspect the console output of the client. You will observe that all subsequent
requests are processed by MyServer2. (MyServer 1 was shutdown after request 127)
...
[java] Request: 125 ==> Response from server: MyServer1
[java] Request: 126 ==> Response from server: MyServer1
[java] Request: 127 ==> Response from server: MyServer1
[java] Request: 128 ==> Response from server: MyServer2
[java] Request: 129 ==> Response from server: MyServer2
[java] Request: 130 ==> Response from server: MyServer2
...
You can keep on shutting servers down like this. Client will get a response until
you shutdown all listed servers. Once all servers are shutdown, the error sequence
is triggered and a fault message is sent to the client as follows.
[java] COULDN'T SEND THE MESSAGE TO THE SERVER.
Once a server is detected as failed, it will be added to the active servers
list again after 60 seconds (specified in <suspendDurationOnFailure> in
the configuration). Therefore, if you have restarted any of the stopped servers,
messages will be directed to the newly started server within 60 seconds.