Tomcat 6:Webメソッド呼び出しの終了後に一時ファイルを削除する方法
-
03-07-2019 - |
質問
MTOMバイナリ添付ファイルを介してSOAP応答の一部として返されるデータを含む一時ファイルがあります。メソッドが「終了」を呼び出したらすぐに破棄したい(つまり、転送を終了します)。これを行うための最良の方法は何ですか?私がこれを行う方法を理解するための最良の方法は、セッションが破棄されたときにそれらを削除することですが、これを行うためのより「即時」の方法があるかどうかはわかりません。
FYI、私は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();
}
}
本質的に、データソースは1回だけ読み取りを許可します。ストリームが閉じられた後、ファイルは削除されます。 JAX-WSスタックはファイルを一度しか読み取らないため、機能します。
解決策は少しハッキングですが、この場合の最良の選択肢のようです。
他のヒント
標準のJava一時ファイルを使用していますか?もしそうなら、あなたはこれを行うことができます:
File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
あなたが話しているこのwebappのコンテキストで設定した作業フォルダー。この作業ディレクトリを既知のディレクトリに設定できますか?はいの場合、一時作業ディレクトリ内で一時ファイルを見つけることができます(ご存知のとおり)。見つかったら削除できます。