java - Tomcat 6 : how to delete temporary files after a web method call has ended?

标签 java web-services tomcat jax-ws

我有一个临时文件,其中包含通过 MTOM 二进制附件作为 SOAP 响应的一部分返回的数据。我想在方法调用“结束”(即完成传输)后立即将其丢弃。对我来说最好的方法是什么?我能弄清楚如何执行此操作的最佳方法是在 session 被销毁时删除它们,但我不确定是否有更“直接”的方法来执行此操作。

仅供引用,我没有使用 Axis,我使用的是 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;
 }
}

最佳答案

我遇到了同样的问题。问题是 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 堆栈只读取文件一次,所以它可以工作。

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

关于java - Tomcat 6 : how to delete temporary files after a web method call has ended?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/158568/

相关文章:

linux - Perl 脚本卡在 Tomcat 服务器上

postgresql - 在 Amazon EC2/Google Compute Engine 中设置 XNAT

java - 将 Byte[] 读取为 unsigned short Java

java - 我应该将 validate 函数命名为 throwExceptionIf... 吗?

java - 在第二个显示器上调整大小时 Swing 挂起

java - 如何使用 Java 将 PDF 中表格的特定单元格内的文本设为粗体

java - Metro 服务和 WCF 客户端之间的传输安全

c# - 从 wsdl 文件模拟 Web 服务

java - 使用apache cxf动态创建Web服务客户端(修复no operationfound unchecked异常),调用带有身份验证的操作

eclipse - 过早调用 context.getApplication()?