You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-user@axis.apache.org by Ivan <xh...@gmail.com> on 2011/06/06 17:03:47 UTC

Re: Transport is not closed while using Dispatch.invokeOneWay method ?

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.

2011/5/31 Ivan <xh...@gmail.com>

> 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.
>
> 2011/5/30 Ivan <xh...@gmail.com>
>
>> Hi, I got an exception
>> of org.apache.commons.httpclient.ConnectionPoolTimeoutException: Timeout
>> waiting for connection while using Dispatch.invokeOneWay method for some
>> times. After checking the codes in the BaseDispatch.invokeOneWay method, I
>> did not find the related codes which were used to release the connection. Is
>> there a connection leak here ? Thanks.
>>
>> --
>> Ivan
>>
>
>
>
> --
> Ivan
>



-- 
Ivan

Re: Transport is not closed while using Dispatch.invokeOneWay method ?

Posted by Ivan <xh...@gmail.com>.
Just open a JIRA https://issues.apache.org/jira/browse/AXIS2-5062 for it,
and attach some draft patches.

2011/6/6 Ivan <xh...@gmail.com>

> 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.
>
> 2011/5/31 Ivan <xh...@gmail.com>
>
>> 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.
>>
>> 2011/5/30 Ivan <xh...@gmail.com>
>>
>>> Hi, I got an exception
>>> of org.apache.commons.httpclient.ConnectionPoolTimeoutException: Timeout
>>> waiting for connection while using Dispatch.invokeOneWay method for some
>>> times. After checking the codes in the BaseDispatch.invokeOneWay method, I
>>> did not find the related codes which were used to release the connection. Is
>>> there a connection leak here ? Thanks.
>>>
>>> --
>>> Ivan
>>>
>>
>>
>>
>> --
>> Ivan
>>
>
>
>
> --
> Ivan
>



-- 
Ivan