2008-10-01 10 views
9

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 descargarlo tan pronto como la llamada al método "finalice" (es decir, termine la transferencia). ¿Cuál es la mejor manera para que yo haga esto? La mejor forma de averiguar cómo hacerlo es borrarlos cuando se destruya la sesión, pero no estoy seguro de si hay una manera más "inmediata" de hacerlo.Tomcat 6: ¿cómo eliminar archivos temporales después de que ha finalizado una llamada al método web?

FYI, NO estoy usando Axis, estoy usando jax-ws, si eso es lo que importa.

ACTUALIZACIÓN: no estoy seguro de que los que responden realmente están entendiendo el problema. Sé cómo eliminar 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; 
} 
} 

Respuesta

15

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 cuando JAX-WS ha terminado con el archivo por lo que no sabe cuándo eliminarlo.

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

private DataHandler handler; 

Mi solución era crear una versión personalizada de FileDataSource. En lugar de devolver un FileInputStream para leer el contenido del archivo, vuelvo 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(); 
    } 
} 

En esencia, el origen de datos permite la lectura de una sola vez. Una vez que la transmisión se cierra, el archivo se elimina. Como la pila JAX-WS solo lee el archivo una vez, funciona.

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

+0

¡Me gusta esta solución! Mi truco fue agregar el archivo a una variable de sesión y luego eliminar el archivo cuando la sesión del usuario expiró. También puse una verificación adicional para eliminar el archivo en finalize(). –

0

¿Estás utilizando archivos temporales estándar de Java? Si es así, puede hacer esto:

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

Lo siento, tal vez debería haber sido más específico. ¿En qué momento puedo eliminar el archivo? No puedo directamente en mi función anotada de @WebMethod porque aún no se ha devuelto la respuesta del método web. –

0

la carpeta de trabajo que configuró en el contexto para esta aplicación web de la que está hablando. ¿Puedes establecer 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 conoce). Una vez que lo encuentre, puede eliminarlo.

Cuestiones relacionadas