0 Replies Latest reply on Jul 12, 2008 7:37 PM by tom novy

    How to catch/get known of broken pipe exception within serve

    tom novy Newbie

      Hi developers,

      I have created a WS with some WebMethods running on Jboss as an Eclipse Dynamic Web Project. I am doing that with the annotations from javax.jws.*.
      Now, it is possible that a method needs some time to reply to a clients call. The client could stop waiting for the reply by setting a timeout value on the WS call like:

      client:

      // a very short time to test the error
      int timeout = 10; // in ms
      
      // set the timeout property
      Map<String, Object> ctxt = ((BindingProvider)service).getRequestContext();
      ctxt.put(com.sun.xml.internal.ws.client.dispatch.impl.protocol.MessageDispatcherHelper.REQUEST_TIMEOUT, timeout);
      
      // now call the WS method
      result = service.myMethod(number);

      If now the client stops waiting for the reply and after some time my serverside method wants to return its result to the client it fails with a java.net.SocketException 'Broken Pipe'. Unfortunately my servermethod finished successfully without getting known of the failed communication. The exception can only be seen in the jboss log.

      Is there a common way to get known of the clientside connection reset within my serverside method? Does the WS-Framework provide any concept to manage such a race condition in an elegant way?
      Or have u any other ideas on how I could solve my problem? I need to know, that the client has not recieved my result, cause in that case I need to rollback some actions that have been done on server side.

      jboss-log4j serverlog:
      2008-07-12 20:25:19,546 INFO [myws.MyWebServiceImpl] Webservice called: myMethod(5000001)
      2008-07-12 20:25:19,766 DEBUG [myws.MyWebServiceImpl] returning result
      2008-07-12 20:25:19,767 ERROR [org.jboss.ws.core.server.AbstractServiceEndpointServlet] Error processing web service request
      ClientAbortException: java.net.SocketException: Broken pipe
       at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:358)
       at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:434)
       at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:309)
       at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:288)
       at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:98)
       at org.jboss.ws.core.server.ServiceEndpointManager.processRequest(ServiceEndpointManager.java:485)
       at org.jboss.ws.core.server.AbstractServiceEndpointServlet.doPost(AbstractServiceEndpointServlet.java:114)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
       at org.jboss.ws.core.server.AbstractServiceEndpointServlet.service(AbstractServiceEndpointServlet.java:75)
       at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
       at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
       at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
       at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
       at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
       at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
       at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
       at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
       at java.lang.Thread.run(Thread.java:619)
      Caused by: java.net.SocketException: Broken pipe
       at java.net.SocketOutputStream.socketWrite0(Native Method)
       at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
       at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
       at org.apache.coyote.http11.InternalOutputBuffer$OutputStreamOutputBuffer.doWrite(InternalOutputBuffer.java:764)
       at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:124)
       at org.apache.coyote.http11.InternalOutputBuffer.doWrite(InternalOutputBuffer.java:570)
       at org.apache.coyote.Response.doWrite(Response.java:560)
       at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:353)
       ... 27 more
      


      Thanks a lot for help.

      javaboss2008