axis-java-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andreas Veithen (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (AXIS2-5062) Connection is not released while using JAXWS client API
Date Sun, 14 Aug 2011 14:19:27 GMT

    [ https://issues.apache.org/jira/browse/AXIS2-5062?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13084840#comment-13084840
] 

Andreas Veithen commented on AXIS2-5062:
----------------------------------------

In the case of an 404 (or similar) error, the response content will generally be HTML and
can't be processed. Anyways, in Axis2 1.6.0 the HTTP transport neither processes the response
(i.e. there is no call to processResponse) nor stores the HttpMethod in the message context.
That means that it is impossible that there is existing application code that does something
with the response. In that case it is better to release the connection immediately.

What worries me more about the JAX-WS code is that for request-response invocations, it doesn't
use the TransportSender#cleanup API but relies on a completely different way to release the
connection. Namely, it assumes that (1) the message builder wraps the input stream in a DetachableInputStream
and that (2) the transport performs cleanup automatically when the input stream has been consumed.
That currently works (at least for SOAP over HTTP), but AFAIK none of these two assumptions
is covered by anything in the API documentation.

> Connection is not released while using JAXWS client API
> -------------------------------------------------------
>
>                 Key: AXIS2-5062
>                 URL: https://issues.apache.org/jira/browse/AXIS2-5062
>             Project: Axis2
>          Issue Type: Bug
>          Components: jaxws, transports
>    Affects Versions: 1.6.0
>            Reporter: Ivan
>              Labels: Geronimo
>         Attachments: AXIS2-5062-Dispatch.patch, AXIS2-5062-Port.patch
>
>
> 1. Using Dispatch API
> A bit more description for my case, the server side is a simple web service, for the
client side, the codes are something like :
> --->
> Service service = new HelloService();
> Dispatch dispatchJaxb = service.createDispatch(PORT_QNAME, JAXBContext.newInstance(org.test.ObjectFactory.class),
> javax.xml.ws.Service.Mode.PAYLOAD);
> dispatchJaxb.invokeOneWay(new HelloRequest());
> <---
> After adding some code fragments in the finally block of BaseDispatch.invokeOneWay method,
it looks to me work fine.
> --->
> try {
>                 if (requestMsgCtx != null && requestMsgCtx.getAxisMessageContext()
!= null) {
>                     org.apache.axis2.context.MessageContext axisMsgCtx = requestMsgCtx.getAxisMessageContext();
>                     if (axisMsgCtx.getTransportOut() != null && axisMsgCtx.getTransportOut().getSender()
!= null) {
>                         axisMsgCtx.getTransportOut().getSender().cleanup(axisMsgCtx);
>                     }
>                 }
>             } catch (Exception ignore) {
>             }
> <---
> I also googled this issue, and do found a lot of information for the same timeout exception,
also read some related codes
> a. In the HttpSender, there is a method named cleanup, which is used to release the connection,
but it has the precondition to configure the AUTO_RELEASE_CONNECTION. And actually I did not
see other setting configurations in the Axis2 codes, and think that it should be configured
by the users in the Options ? 
> b. Some posts in the mail list recommended to call the getTransport().cleanup() in the
Axis2 specific client codes. And in the testing scenario above, since the standard JAX-WS
API is used, suppose that Axis2 should do this ?
> And very appreciated with any comment ? Thanks.
> 2. I might find another connection leak while using JAXWS API on client side. In the
scenario below :
> For the server side, it requires basic authentication.
> The client codes are something like :
> HelloPort helloPort = (HelloPort)service.getPort(HelloPort.class);
> helloPort.echo("hello");
> The client codes did not set the user name and password by the BindingProvider interface,
so the server return a 404 to the client side, then the method HttpSender.handleResponse will
enter the fourth block :
> private void handleResponse(MessageContext msgContext,
>                                 HttpMethodBase method) throws IOException {
>         int statusCode = method.getStatusCode();
>         log.trace("Handling response - " + statusCode);
>         if (statusCode == HttpStatus.SC_OK) {
>             // Save the HttpMethod so that we can release the connection when cleaning
up
>             msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
>             processResponse(method, msgContext);
>         } else if (statusCode == HttpStatus.SC_ACCEPTED) {
>         	/* When an HTTP 202 Accepted code has been received, this will be the case of
an execution
>         	 * of an in-only operation. In such a scenario, the HTTP response headers should
be returned,
>         	 * i.e. session cookies. */
>         	obtainHTTPHeaderInformation(method, msgContext);
>         	// Since we don't expect any content with a 202 response, we must release the
connection
>         	method.releaseConnection();
>         } else if (statusCode == HttpStatus.SC_INTERNAL_SERVER_ERROR ||
>                 statusCode == HttpStatus.SC_BAD_REQUEST) {
>             // Save the HttpMethod so that we can release the connection when cleaning
up
>             msgContext.setProperty(HTTPConstants.HTTP_METHOD, method);
>             Header contenttypeHeader =
>                     method.getResponseHeader(HTTPConstants.HEADER_CONTENT_TYPE);
>             String value = null;
>             if (contenttypeHeader != null) {
>                 value = contenttypeHeader.getValue();
>             }
>              OperationContext opContext = msgContext.getOperationContext();
>             if(opContext!=null){
>                 MessageContext inMessageContext =
>                         opContext.getMessageContext(WSDLConstants.MESSAGE_LABEL_IN_VALUE);
>                 if(inMessageContext!=null){
>                     inMessageContext.setProcessingFault(true);
>                 }
>             }
>             if (value != null) {
>                 processResponse(method, msgContext);
>             }
>             if (org.apache.axis2.util.Utils.isClientThreadNonBlockingPropertySet(msgContext))
{
>             	 throw new AxisFault(Messages.getMessage("transportError",
>                          String.valueOf(statusCode),
>                          method.getStatusText()));
>             }
>         } else {
>             throw new AxisFault(Messages.getMessage("transportError",   <--- Running
here
>                                                     String.valueOf(statusCode),
>                                                     method.getStatusText()));
>         }
>     }
> The stack trace is :
> org.apache.axis2.AxisFault: Transport error: 403 Error: Forbidden
> 	at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:309)
> 	at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:194)
> 	at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:75)
> 	at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:404)
> 	at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:231)
> 	at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:443)
> 	at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:406)
> 	at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
> 	at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
> 	at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.execute(AxisInvocationController.java:578)
> 	at org.apache.axis2.jaxws.core.controller.impl.AxisInvocationController.doInvoke(AxisInvocationController.java:127)
> 	at org.apache.axis2.jaxws.core.controller.impl.InvocationControllerImpl.invoke(InvocationControllerImpl.java:93)
> 	at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invokeSEIMethod(JAXWSProxyHandler.java:377)
> 	at org.apache.axis2.jaxws.client.proxy.JAXWSProxyHandler.invoke(JAXWSProxyHandler.java:174)
> 	at $Proxy89.helloPort(Unknown Source)
> 	at org.test.HelloServlet.doPost(HelloServlet.java:113)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
> 	at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
> 	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)
> 	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
> 	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
> 	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)
> 	at org.apache.geronimo.tomcat.security.SecurityValve.invoke(SecurityValve.java:87)
> 	at org.apache.geronimo.tomcat.security.jacc.JACCSecurityValve.invoke(JACCSecurityValve.java:54)
> 	at org.apache.geronimo.tomcat.GeronimoStandardContext$SystemMethodValve.invoke(GeronimoStandardContext.java:700)
> 	at org.apache.geronimo.tomcat.valve.GeronimoBeforeAfterValve.invoke(GeronimoBeforeAfterValve.java:48)
> 	at org.apache.geronimo.tomcat.valve.ProtectedTargetValve.invoke(ProtectedTargetValve.java:53)
> 	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
> 	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
> 	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:550)
> 	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
> 	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:380)
> 	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)
> 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)
> 	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)
> 	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)
> 	at org.apache.geronimo.pool.ThreadPool$1.run(ThreadPool.java:243)
> 	at org.apache.geronimo.pool.ThreadPool$ContextClassLoaderRunnable.run(ThreadPool.java:373)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
> 	at java.lang.Thread.run(Thread.java:662)
> Thanks.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: java-dev-unsubscribe@axis.apache.org
For additional commands, e-mail: java-dev-help@axis.apache.org


Mime
View raw message