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 Heinz Schwarz <hs...@twinlogic.de> on 2003/11/25 12:08:36 UTC

Deleting attachments

I have some Axis-Webservices which deliver binary files via attachments.
After sending the attachment, I have to delete this (temporary) attachment. 

What is the best way to do this ?
How can I be sure that my client has received the attachment ?

Thanks 
Heinz


Re: Deleting attachments

Posted by Rodrigo Ruiz <rr...@gridsystems.com>.
I am experimenting some possibilities at this moment :-)

You said you have temporary binary files to send. How are these files 
generated? If the files are generated on the fly by your own code, you 
could create a DataSource implementation wrapping your generation code. 
Supposing your generation code writes to an OutputStream, you could use 
a PipedOutputStream, and make your DataSource return a connected 
PipedInputStream. Just ensure your generator runs in a separated thread, 
and you will have no temporary files to delete :-P

If you obtain the files from third-party code, or from external 
applications, I guess your only option will be to ensure file deletion 
from the FileDataSource. You could create a FileDataSource subclass like:

public class TempFileDataSource extends FileDataSource {
  public TempFileDataSource(String name) {
    this(new File(name));
  }

  public TempFileDataSource(File f) {
    super(f);
    f.deleteOnExit();
  }

  public void finalize() {
    f.delete();
    super.finalize();
  }
}

It is not a safe option, and I have not tested it yet. I guess it will 
fail if the DataSource instance is gc'ed before the InputStream used to 
obtain its contents. I do not know if this can happen, as it depends on 
the Axis source code, but I think it could work. You could also 
overwrite the getInputStream() method, and wrap the returned InputStream 
by a custom class that performs the deletion on the InputStream 
finalization, but this would prevent the file from being used twice.

Depending on your requirements / possibilities, another option is to 
redesign your service interface and add a method to delete the temporary 
files in a separated call, after finishing with them, and maintaining a 
background thread that deletes those temporary files that reach a 
certain timeout. Just store a pair (file, timestamp) in a list and make 
your background thread delete those items that are older than a certain 
amount of time. This thread would be only a safety measure, as only 
aborted (or buggy) clients would let undeleted files on your server.

Hope this helps you,
Rodrigo Ruiz

Heinz Schwarz wrote:

>I have some Axis-Webservices which deliver binary files via attachments.
>After sending the attachment, I have to delete this (temporary) attachment. 
>
>What is the best way to do this ?
>How can I be sure that my client has received the attachment ?
>
>Thanks 
>Heinz
>
>
>  
>