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
>
>
>
>