9

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

3 に答える 3

16

私はこの同じ問題に遭遇しました。問題は、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 スタックはファイルを一度だけ読み取るため、機能します。

解決策は少しハックですが、この場合は最良の選択肢のようです。

于 2009-06-11T14:29:05.007 に答える
0

話しているこの webapp のコンテキストで設定した作業フォルダー。この作業ディレクトリを既知のディレクトリに設定できますか? はいの場合は、一時作業ディレクトリ内で一時ファイルを見つけることができます(ご存知のとおり)。見つかったら、削除できます。

于 2008-10-01T20:31:51.130 に答える
0

標準の Java 一時ファイルを使用していますか? もしそうなら、あなたはこれを行うことができます:

File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.
于 2008-10-01T16:48:43.460 に答える