DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17001>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=17001

DimeBodyPart.send()  needs to close the input stream

           Summary: DimeBodyPart.send()  needs to close the input stream
           Product: Axis
           Version: 1.0
          Platform: PC
        OS/Version: Windows NT/2K
            Status: NEW
          Severity: Major
          Priority: Other
         Component: Serialization/Deserialization
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


DimeBodyPart.send()  needs to close the input stream.

My application produces dynamically-generated files and returns their contents 
as an Attachment in the SOAP response.  Because DimeBodyPart.send() does not 
close the InputStream it acquires from the DataHandler, I am unable to delete a 
file (wrapped by a FileDataSource) after AXIS serializes the response because 
the jvm process still has an open handle on the file.  Eventually this will get 
gc'd and then I can delete it but I don't want to queue up this work.

By changing this method to something like the following...

    void send(java.io.OutputStream os, byte position, DataHandler dh,
        final long maxchunk) throws java.io.IOException {

        java.io.InputStream in = null;
        try {
            byte chunknext = 0;

            long dataSize = getDataSize();
            in = dh.getInputStream();
            byte[] readbuf = new byte[64 * 1024];
            int bytesread;

            sendHeader(os, position, dataSize, (byte) 0);
            long totalsent = 0;

            do {
                bytesread = in.read(readbuf);
                if (bytesread > 0) {
                    os.write(readbuf, 0, bytesread);
                    totalsent += bytesread;
                }
            }
            while (bytesread > -1);
            os.write(pad, 0, dimePadding(totalsent));
        }
        finally {
            if (in != null) {
                try {
                    in.close();
                }
                catch (IOException e ) {
                    // Ignore.
                }
            }
        }
    }

I am able to reliably delete my files after AXIS has serialized the response.


I haven't investigated whether a similar issue exists for outgoing MIME 
attachments (but it makes sense for this to be checked as well).

Thanks!

-Sam

Reply via email to