I’m writing a web service using Axis and Apache Tomcat 7.
The service uses a third party library to do some conversions to a file and ends up creating a folder which contains more files (subfolders and regular files). When the conversion is completed the service creates a zip archive and returns it.
When it receives a new request, first of all it removes the files created during the last request and the it starts handling the request.
The service itself works fine, at least the first request is satisfied.
The problem is that when a second request is received, the service cannot delete all the files generated during the last request.
I’m using Windows XP and with Process Explorer i see that Tomcat is keeping some files (bt not all of them) open and that’s why i can’t delete it.
Is that possibile that the library i’m using keeps the files open even when the service operation ends?
In the code that i use to create the zip archive it seems that i close all the streams that i open. Btw even if i forgive to close them, can they stay still open after the service operation returns his results to the client?
And if so, why the process Tomcat keeps open only some of the files?
It seems that after some time some file are “released”, but other file are always kept open…
I hope someone can give me some advice on how to handle this situation 🙂
Well, as I was wondering, the library I’m using doesn’t close all the file streams..
I found a workaround that can be used in similar situations. I post it, maybe someone can find it useful or advise me a better way to solve the problem 🙂
Lucky the jar library can be executed from command line with the java command, so i just executed it with Runtime’s exec method in this way:
In this way a new process is created by the JVM, and, when it dies, all the pending handlers are relased.
If you can’t execute the library with the java command, such library can be simply wrapped in a custom jar made by a simple class who uses it and takes the needed parameters. The wrapper jar can be then executed with exec().