Tomcat 6: comment supprimer des fichiers temporaires à la fin d'un appel de méthode Web?

StackOverflow https://stackoverflow.com/questions/158568

Question

J'ai un fichier temporaire avec les données renvoyées dans le cadre d'une réponse SOAP via une pièce jointe binaire MTOM. Je souhaite le supprimer dès que l'appel à la méthode "se termine". (c.-à-d. termine le transfert). Quelle est la meilleure façon pour moi de faire cela? Le meilleur moyen de comprendre comment faire est de les supprimer lorsque la session est détruite, mais je ne suis pas sûr qu'il existe un moyen plus "immédiat" de le faire.

Pour info, je n’utilise pas Axis, j’utilise jax-ws, si ça compte.

UPDATE: Je ne suis pas sûr que les répondants comprennent vraiment le problème. Je sais comment supprimer un fichier en java. Mon problème est le suivant:

@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;
 }
}
Était-ce utile?

La solution

J'ai rencontré le même problème. Le problème est que la pile JAX-WS gère le fichier. Il n'est pas possible de déterminer dans votre code quand JAX-WS est terminé avec le fichier, vous ne savez donc pas quand le supprimer.

Dans mon cas, j'utilise un DataHandler sur mon modèle d'objet plutôt qu'un fichier. MyFileResult aurait le champ suivant au lieu d'un champ de fichier:

private DataHandler handler;

Ma solution consistait à créer une version personnalisée de FileDataSource. Au lieu de renvoyer un FileInputStream pour lire le contenu du fichier, je renvoie l'extension suivante de FileInputStream:

private class TemporaryFileInputStream extends FileInputStream {
    public TemporaryFileInputStream(File file) throws FileNotFoundException {
        super(file);
    }

    @Override
    public void close() throws IOException {
        super.close();
        file.delete();
    }
}

Essentiellement, la source de données permet de lire une seule fois. Une fois le flux fermé, le fichier est supprimé. Etant donné que la pile JAX-WS ne lit le fichier qu’une fois, cela fonctionne.

La solution est un peu un bidouillage mais semble être la meilleure option dans ce cas.

Autres conseils

Utilisez-vous des fichiers temporaires java standard? Si oui, vous pouvez le faire:

File script = File.createTempFile("temp", ".tmp", new File("./"));
... use the file ...
script.delete(); // delete when done.

le dossier de travail que vous avez configuré dans le contexte de cette application Web dont vous parlez. Pouvez-vous définir ce répertoire de travail dans un répertoire connu? Si oui, alors vous pouvez trouver le fichier temporaire dans le répertoire de travail temporaire (que vous connaissez). Une fois que vous avez trouvé, vous pouvez le supprimer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top