一尘不染

Tomcat 6:Web方法调用结束后如何删除临时文件?

tomcat

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

仅供参考,如果要紧的话,我不使用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;
 }
}

阅读 255

收藏
2020-06-16

共1个答案

一尘不染

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

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

2020-06-16