Hi

 AFAIU, the failover logic is working as follows, In your endpoint if its
defines as
                                    <timeout>
                                        <duration>2000</duration>
                                    </timeout>

                                    <markForSuspension>

<errorCodes>101504,101508</errorCodes>

<retriesBeforeSuspension>0</retriesBeforeSuspension>
                                        <retryDelay>0</retryDelay>
                                    </markForSuspension>

            based on 101504,101508 errocodes always the endpoint will get
marked as TIMEOUT and it wont try  and IF the endpoints are failover then
the FAILOVER will be invoked the next NONSUSPENDED endpoint.. actually the
point you need to Note that the FAILOVER will be working only
for 101504,101508,(according to your current configuration) so In your case
let say need to invoke next NONSUSPNEDED endpoint when CONNECTION CLOSED.(*
101505)*. then you should include that in MarkForSuspence, so please try
with following

                                <markForSuspension>
                                        <errorCodes>101504,101508,*101505*
</errorCodes>

<retriesBeforeSuspension>0</retriesBeforeSuspension>
                                        <retryDelay>0</retryDelay>
                                    </markForSuspension>

         so what will happen now the IF BE is closed then the EP will be
marked as TIMEOUT for 101504,101508,*101505 then as I explained earlier it
will invoke next active NONSUSPNEDED endpoint,*
*                    *
*   *        Persoally i havent try this out but if looking
http://wso2.org/library/articles/wso2-enterprise-service-bus-endpoint-error-handling
the logic is clearly explained please give more attention to
the highlighted text

e.g

<endpoint name="SampleFailover">
    <failover>
        <endpoint name="Sample_First" statistics="enable" >
            <address uri="http://localhost/myendpoint";
statistics="enable" trace="disable">
                <timeout>
                    <duration>60000</duration>
                </timeout>

                <markForSuspension>
                    <errorCodes>101504, 101505, 101500</errorCodes>
                    <retriesBeforeSuspension>3</retriesBeforeSuspension>
                    <retryDelay>1</retryDelay>
                </markForSuspension>

                <suspendOnFailure>
                    <initialDuration>1000</initialDuration>
                    <progressionFactor>2</progressionFactor>
                    <maximumDuration>64000</maximumDuration>
                </suspendOnFailure>

            </address>
        </endpoint>
    </failover>
</endpoint>


"Here the Sample_First endpoint is marked as *TIMEOUT if a connection
runs out of time, a connection close or sends IO errors. For all the
other errors*, it will be marked as suspended. *When this error occurs
the fail over will retry using the first non SUSPENDED endpoint.* In
this case, it is the same endpoint (Sample_First). It will retry until
the retry count becomes 0. The retry happens in parrellel. Since
messages do come to this endpoint using many threads, the same message
may not be retired 3 times. Another message may fail and can reduce
the retry count. So it is important to note that the retry count is
not a per message based setting, it is a per endpoint based setting."



cheers
Dushan



On Wed, Aug 29, 2012 at 7:57 PM, Andun Sameera <[email protected]> wrote:

> Hi All,
>
> I am trying to check the functionality of the Fail Over Endpoint. I want
> to verify that the failover logic is happening to specific error codes. I
> used  proxy given below for that,
>
> According to 
> [1]<http://wso2.org/library/articles/wso2-enterprise-service-bus-endpoint-error-handling>,
> error code 101504,101508 for timeouts. So I used following test case
> to produce the scenario,
>
> My logic was this,
>
>    1. Send a request to proxy to check it is functioning.
>    2. Shutdown http://localhost:9001 server.
>    3. Then send Send a request to proxy again. So the first endpoint
>    should be failed. But it cant be suspend. Because it is only suspending for
>    timeouts.
>    4. Response should come from second server.
>    5. Then Start the http://localhost:9001 server.
>    6. Then send Send a request to proxy again. Response should come from
>    server1. Because it is not suspended.( I am trying this with in the suspend
>    time period of 9001-server endpoint, so if is suspended, response should
>    come from server2)
>
> But when I tried this, in the 3rd step of the logic (Red Highlighted line
> of the code) it fails. The endpoint is suspending for connection refused
> created by shutting down the server. According to spec it cant be. Is this
> a bug or am I doing something wrong here? Please look at this ASAP we need
> this to wind up Test Automation Hackathon tomorrow.
>
> Thanks
> AndunSLG
>
> [1] -
> http://wso2.org/library/articles/wso2-enterprise-service-bus-endpoint-error-handling
>
> Proxy Service :
>
> <proxy name="failoverEndPoint_Specific_Errors" transports="http,https">
>         <target>
>             <inSequence>
>                 <send>
>                     <endpoint>
>                         <failover>
>                             <endpoint name="9001 Server">
>                                 <address uri="
> http://localhost:9001/services/LBService1";>
>                                     <timeout>
>                                         <duration>2000</duration>
>                                     </timeout>
>
>                                     <markForSuspension>
>
> <errorCodes>101504,101508</errorCodes>
>
> <retriesBeforeSuspension>0</retriesBeforeSuspension>
>                                         <retryDelay>0</retryDelay>
>                                     </markForSuspension>
>
>                                     <suspendOnFailure>
>
> <initialDuration>60000</initialDuration>
>
> <progressionFactor>2</progressionFactor>
>                                     </suspendOnFailure>
>                                 </address>
>                             </endpoint>
>                             <endpoint name="9002 Server">
>                                 <address uri="
> http://localhost:9002/services/LBService1";>
>                                     <timeout>
>                                         <duration>2000</duration>
>                                     </timeout>
>
>                                     <markForSuspension>
>                                         <errorCodes>101509</errorCodes>
>
> <retriesBeforeSuspension>0</retriesBeforeSuspension>
>                                         <retryDelay>0</retryDelay>
>                                     </markForSuspension>
>
>                                     <suspendOnFailure>
>
> <initialDuration>60000</initialDuration>
>
> <progressionFactor>2</progressionFactor>
>                                     </suspendOnFailure>
>                                 </address>
>                             </endpoint>
>                         </failover>
>                     </endpoint>
>                 </send>
>             </inSequence>
>             <outSequence>
>                 <send/>
>             </outSequence>
>         </target>
>     </proxy>
>
> Test Case :
>
> @Test(groups = "wso2.esb", description = "Test sending request to Fail
> Over Endpoint which Suspend Endpoints to Specific Errors")
>     public void testSendingFailOverEndpoint_With_Specific_Errors() throws
> IOException, InterruptedException {
>         //Check the fail over endpoint is functioning well
>         String response =
> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>                 null);
>         Assert.assertNotNull(response);
>         Assert.assertTrue(response.toString().contains("Response from
> server: Server_1"));
>
>         //Stop one server to generate a failure in one endpoint
>         //But the suspend cant be triggered here. because suspend the
> endpoint happen only for Timeouts 101504,101508
>         axis2Server1.stop();
>
>         response =
> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>                 null);
>         Assert.assertNotNull(response);
>         Assert.assertTrue(response.toString().contains("Response from
> server: Server_2"));
>
>         axis2Server1.start();
>
>         int counter=0;
>         while(!AxisServiceClientUtils.isServiceAvailable("
> http://localhost:9001/services/LBService1";)) {
>             if(counter>100){
>                 break;
>             }
>             counter++;
>         }
>
>         if(counter>100){
>             throw new AssertionError("Axis2 Server didn't started with in
> expected time period.") ;
>         }
>         else{
>             //Checaxiaxis2Server1.start()s2Server1.stop()k that the
> endpoint one is not suspended.
>             //If reply comes that means not suspended.
>             //Because suspend duration of the endpoint is 20 seconds. So
> reply cant come in this time.
>             response =
> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>                     null);
>             Assert.assertNotNull(response);
>             Assert.assertTrue(response.toString().contains("Response from
> server: Server_1"));
>
>             //Invoke a web service method which will invoke a time out and
> cause the endpoint to suspend.
>             response =
> lbClient.sendSleepRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),"4000");
>             Assert.assertNotNull(response);
>             Assert.assertTrue(response.toString().contains("Response from
> server: Server_2"));
>
>             //Invoke a web service method which will invoke a time out and
> cause the endpoint to suspend.
>             response =
> lbClient.sendLoadBalanceRequest(getProxyServiceURL("failoverEndPoint_Specific_Errors"),
>                     null);
>             Assert.assertNotNull(response);
>             Assert.assertTrue(response.toString().contains("Response from
> server: Server_2"));
>
>         }
>     }
>
>


-- 
Dushan Abeyruwan
*Senior Software Engineer*
*Integration Technologies Team*
*WSO2 Inc. http://wso2.com/*
*Mobile:(+94)714408632*
_______________________________________________
Dev mailing list
[email protected]
http://wso2.org/cgi-bin/mailman/listinfo/dev

Reply via email to