Tomcat 6: ¿cómo eliminar archivos temporales después de que finalice una llamada a un método web?

StackOverflow https://stackoverflow.com/questions/158568

Pregunta

Tengo un archivo temporal con datos que se devuelven como parte de una respuesta SOAP a través de un archivo adjunto binario MTOM. Me gustaría eliminarlo tan pronto como la llamada al método " termine " (es decir, termina de transferir). ¿Cuál es la mejor manera para que yo haga esto? La mejor manera de averiguar cómo hacer esto es eliminarlos cuando se destruye la sesión, pero no estoy seguro de que haya una forma más "inmediata" de hacerlo.

Para tu información, NO estoy usando Axis, estoy usando jax-ws, si eso importa.

ACTUALIZACIÓN: no estoy seguro de que los que respondan realmente entiendan el problema. Sé cómo borrar un archivo en java. Mi problema es este:

@javax.jws.WebService 
public class MyWebService {
...

 @javax.jws.WebMethod 
 public MyFileResult getSomeObject() {
   File mytempfile = new File("tempfile.txt");
   MyFileResult result = new MyFileResult();
   result.setFile(mytempfile);  // sets mytempfile as MTOM attachment

   // mytempfile.delete() iS WRONG
   // can't delete mytempfile because it hasn't been returned to the web service  client
   // yet.  So how do I remove it?

   return result;
 }
}
¿Fue útil?

Solución

Me encontré con este mismo problema. El problema es que la pila JAX-WS administra el archivo. No es posible determinar en su código cuándo JAX-WS se realiza con el archivo, por lo que no sabe cuándo borrarlo.

En mi caso, estoy usando un DataHandler en mi modelo de objeto en lugar de un archivo. MyFileResult tendría el siguiente campo en lugar de un campo de archivo:

private DataHandler handler;

Mi solución fue crear una versión personalizada de FileDataSource. En lugar de devolver un FileInputStream para leer el contenido del archivo, devuelvo la siguiente extensión de FileInputStream:

private class TemporaryFileInputStream extends FileInputStream {
    public TemporaryFileInputStream(File file) throws FileNotFoundException {
        super(file);
    }

    @Override
    public void close() throws IOException {
        super.close();
        file.delete();
    }
}

Esencialmente, la fuente de datos permite leer solo una vez. Después de que la secuencia se cierra, el archivo se elimina. Dado que la pila JAX-WS solo lee el archivo una vez, funciona.

La solución es un poco difícil pero parece ser la mejor opción en este caso.

Otros consejos

¿Estás usando archivos temporales de java estándar? Si es así, puedes hacer esto:

File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.

la carpeta de trabajo que configuró en el contexto para esta aplicación web de la que habla. ¿Puedes configurar este directorio de trabajo en un directorio conocido? Si es así, entonces puede encontrar el archivo temporal dentro del directorio de trabajo temporal (que usted sabe). Una vez que lo encuentres, puedes eliminarlo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top