2008-10-01 108 views
9

我有一个临时文件,其数据通过MTOM二进制附件作为SOAP响应的一部分返回。只要方法调用“结束”(即完成传送),我就想尽快清除它。我做这件事最好的办法是什么?我可以想出如何做到这一点的最好方法是在会话被销毁时将其删除,但我不确定是否有更直接的方法来实现此目的。Tomcat 6:如何在Web方法调用结束后删除临时文件?

仅供参考,我不使用安讯士,我使用jax-ws,如果这很重要的话。

更新:我不确定回答者是否真的了解问题。我知道如何在java中删除文件。我的问题是这样的:

@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; 
} 
} 

回答

15

我遇到了同样的问题。问题是JAX-WS堆栈管理文件。在JAX-WS完成该文件时,不可能在代码中确定,因此您不知道何时删除它。

对我而言,我在我的对象模型上使用DataHandler而不是文件。 MyFileResult将有以下领域而不是文件领域:

private DataHandler handler; 

我的解决方案是创建FileDataSource的定制版本。而不是返回一个FileInputStream读取文件的内容,我返回的FileInputStream以下扩展名:

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

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

本质上,数据源允许读一次。流关闭后,文件被删除。由于JAX-WS堆栈只能读取一次文件,因此它可以工作。

该解决方案有点破解,但在这种情况下似乎是最好的选择。

+0

我喜欢这个解决方案!我的破解是将文件添加到会话变量,然后在用户会话过期时删除文件。我还放入了一个额外的检查来删除finalize()中的文件。 – 2009-09-18 21:00:43

0

你使用的是标准的java临时文件吗?如果是这样,你可以这样做:

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

对不起,也许我应该更具体。我可以在什么时候删除文件?我无法直接在我的@WebMethod注释函数中,因为Web方法响应尚未返回。 – 2008-10-01 16:50:35

0

你在这个webapp中设置的工作文件夹,你正在谈论。你可以在一个已知的目录中设置这个工作目录吗?如果是,那么你可以在临时工作目录(你知道)找到临时文件。一旦找到,你可以删除它。