PDF Generating Tool Support Forum

HOME   Login   Register    Search




  Subject: SocketException: Socket closed on PD4Device.finalize
   PostPosted: 09 Feb 2011, 12:58 
Hi Gurus, we use PD4ML within a Servlet to generate PDF from JSPs. Intermittent we get the exception you can see below.
The code we use to generate the output is as follows:

Code:
      ServletOutputStream os = res.getOutputStream();
      pd4ml.render(new URL(urlString), os);
      os.flush();
      os.close();

Does anybody have an idea what the reason for this error?
Greetings from Lutz

Code:
WARNUNG: Unable to send headers
java.net.SocketException: Socket closed
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)
        at org.apache.jk.common.JkInputStream.appendHead(JkInputStream.java:313)
        at org.apache.jk.core.MsgContext.action(MsgContext.java:266)
        at org.apache.coyote.Response.action(Response.java:183)
        at org.apache.coyote.Response.sendHeaders(Response.java:379)
        at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305)
        at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:273)
        at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:104)
        at org.zefer.pd4ml.pdf.PD4Device.dispose(Unknown Source)
        at org.zefer.pd4ml.pdf.PD4Device.finalize(Unknown Source)
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
        at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
        at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)


  Subject: Re: SocketException: Socket closed on PD4Device.finalize
   PostPosted: 10 Feb 2011, 09:52 
Some analysis shoes, that the class PD4ML calls the PD4Device method "dispose()" after completing the current rendering.
This method will close the the output stream member within the PD4Device instance, but does not set it to null.
The PD4Device class has a finalize method too. Now, the gc is collecting and calls the finalize method and tries to close the output stream again.
Maybe that´s the problem causing the the raised exception.
How can we get rid of this?
Any idea?

Lutz.Strobel wrote:
Hi Gurus, we use PD4ML within a Servlet to generate PDF from JSPs. Intermittent we get the exception you can see below.
The code we use to generate the output is as follows:

Code:
      ServletOutputStream os = res.getOutputStream();
      pd4ml.render(new URL(urlString), os);
      os.flush();
      os.close();

Does anybody have an idea what the reason for this error?
Greetings from Lutz

Code:
WARNUNG: Unable to send headers
java.net.SocketException: Socket closed
        at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:99)
        at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
        at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:531)
        at org.apache.jk.common.JkInputStream.appendHead(JkInputStream.java:313)
        at org.apache.jk.core.MsgContext.action(MsgContext.java:266)
        at org.apache.coyote.Response.action(Response.java:183)
        at org.apache.coyote.Response.sendHeaders(Response.java:379)
        at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:305)
        at org.apache.catalina.connector.OutputBuffer.close(OutputBuffer.java:273)
        at org.apache.catalina.connector.CoyoteOutputStream.close(CoyoteOutputStream.java:104)
        at org.zefer.pd4ml.pdf.PD4Device.dispose(Unknown Source)
        at org.zefer.pd4ml.pdf.PD4Device.finalize(Unknown Source)
        at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method)
        at java.lang.ref.Finalizer.runFinalizer(Finalizer.java:83)
        at java.lang.ref.Finalizer.access$100(Finalizer.java:14)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:160)


  Subject: Re: SocketException: Socket closed on PD4Device.finalize
   PostPosted: 10 Feb 2011, 20:55 
Yes, you are right: there is a possibility PD4ML tries to close output stream twice, however we never faced with such kind of exceptions in our test scenarios.

We've just implemented a fix in the development build.

On the other hand we would recommend to use ByteArrayOutputStream as a receiver for generated PDF bytes and to send the buffer content to ServletOutputStream at once.



[Reply]     [ 3 posts ] 

Copyright ©2004-10 zefer|org. All rights reserved. Bookmark and Share