gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:12:43 24 4
gpt4 key购买 nike

我有一个临时文件,其中包含通过 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com