2008-10-01 7 views
9

J'ai un fichier temporaire avec des données retournées dans le cadre d'une réponse SOAP via une pièce jointe binaire MTOM. Je voudrais le jeter dès que l'appel de la méthode "se termine" (c'est-à-dire, finit le transfert). Quelle est la meilleure façon pour moi de faire ça? La meilleure façon de résoudre ce problème 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.Tomcat 6: comment supprimer des fichiers temporaires après la fin d'un appel de méthode Web?

Pour info, je n'utilise pas Axis, j'utilise jax-ws, si cela est important. MISE À JOUR: Je ne suis pas sûr que les répondeurs 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; 
} 
} 

Répondre

15

J'ai rencontré ce 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 fait avec le fichier, donc vous ne savez pas quand le supprimer.

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

private DataHandler handler; 

Ma solution a été de créer une version personnalisée de FileDataSource. Au lieu de retourner un FileInputStream pour lire le contenu du fichier, je retourne 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 la lecture qu'une seule fois. Une fois le flux fermé, le fichier est supprimé. Puisque la pile JAX-WS lit seulement le fichier une fois, cela fonctionne.

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

+0

J'aime cette solution! Mon hack était d'ajouter le fichier à une variable de session, puis de supprimer le fichier lorsque la session de l'utilisateur a expiré. J'ai aussi mis une vérification supplémentaire pour supprimer le fichier dans finalize(). –

0

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. 
+0

Désolé, j'aurais peut-être dû être plus précis. À quel moment puis-je supprimer le fichier? Je ne peux pas directement dans ma fonction annotée @WebMethod car la réponse de la méthode web n'a pas encore été retournée. –

0

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 trouvez, vous pouvez le supprimer.

Questions connexes