[ 
https://issues.apache.org/jira/browse/AXIS2-4800?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Chuck Williams updated AXIS2-4800:
----------------------------------

    Attachment: DefaultConnectionListener.patch

Patch to org.apache.axis2.transport.http.server.DefaultConnectionListener so 
that if an http request cannot be processed due to RejectedExecutionException 
the service returns http 503 Service Unavailable instead of shutting down the 
connection listener.


> Http connection listener terminates when request executor full
> --------------------------------------------------------------
>
>                 Key: AXIS2-4800
>                 URL: https://issues.apache.org/jira/browse/AXIS2-4800
>             Project: Axis2
>          Issue Type: Bug
>          Components: transports
>    Affects Versions: 1.6, 1.5.2, 1.5.1, 1.5, nightly
>         Environment: Any
>            Reporter: Chuck Williams
>         Attachments: DefaultConnectionListener.patch
>
>   Original Estimate: 0.5h
>  Remaining Estimate: 0.5h
>
> The DefaultConnectionListener of the built-in http server invokes the failure 
> apparatus in the configured ConnectionListenerFailureHandler when exceptions 
> arise handing off a new request connection to an HttpServiceProcessor.  The 
> built-in failure apparatus in DefaultConnectionListenerFailureHandler retries 
> (default 10 times) and then gives up, after which the 
> DefaultConnectionListener shuts down.  This permanently closes the port, 
> rendering the web service unreachable.  One can replace the 
> DefaultConnectionListenerFailureHandler easily by overriding 
> HttpFactory.newRequestConnectionListener(), however the failure processing 
> methods do not have access to the request connection and thus cannot take any 
> action that requires sending a response back to the client.
> A particularly important case arises when the http request executor's thread 
> pool and backing queue are both full.  In this case the attempt to launch a 
> thread to process the new http request gets RejectedExecutionException.  The 
> server should return an http 503 Service Unavailable, since it has already 
> accessed the new connection and so cannot refuse it.  This is impossible to 
> achieve with the existing failure apparatus because it can't send a response. 
>  The result is that the when the web service becomes overloaded the 
> connection listener permanently shuts down!
> The failure apparatus is actually a patch of mine from a few years ago.  At 
> the time any failure would immediately shut down the connection listener and 
> I added some simple processing for the case of an intermittent issue.  The 
> new case of RejectedExecutionException is clearly an important one and I've 
> prepared a new patch (to be attached next) that fixes this by sending 503 
> Service Unavailable whenever the request executor cannot accept a new request 
> after the connection listener has already accepted the request connection.
> I would have committed this, but since I've been inactive in axis2 
> development for some time that seemed unwise.  An active developer should 
> probably first weigh in.  I have tested the patch successfully in an 
> application that requires it.
> More should be done here.  Failure cases in the connection listener are 
> important as the consequences of improper handling are dire, leaving your web 
> service unreachable.  Probably there are additional cases that should be 
> built in, and the extensible failure apparatus should be generalized so that 
> it can send responses whenever a request has already been accepted but the 
> normal processing fails back to the listener.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to