Tomcat 6: como excluir os arquivos temporários após uma chamada de método web terminou?

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

Pergunta

Eu tenho um arquivo temporário com dados que são devolvidos como parte de uma resposta SOAP através de um anexo MTOM binário. Gostaria de lixo-lo assim que a chamada de método "extremidades" (ou seja, acabamentos de transferência). Qual é a melhor maneira para eu fazer isso? A melhor maneira que eu posso descobrir como fazer isso é excluí-los quando a sessão é destruída, mas não tenho certeza se há uma maneira mais 'imediato' para fazer isso.

FYI, eu não estou usando Axis, estou usando JAX-WS, se o que importa.

UPDATE: Eu não tenho certeza respondentes são realmente entender a questão. Eu sei como excluir um arquivo em java. Meu problema é o seguinte:

@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;
 }
}
Foi útil?

Solução

Corri para este mesmo problema. A questão é que a pilha JAX-WS gerencia o arquivo. Não é possível determinar em seu código quando JAX-WS é feito com o arquivo que você não sabe quando para excluí-lo.

No meu caso, eu estou usando um DataHandler no meu modelo de objeto em vez de um arquivo. MyFileResult teria o seguinte campo em vez de um campo de arquivo:

private DataHandler handler;

A minha solução foi criar uma versão personalizada do FileDataSource. Em vez de retornar um FileInputStream para ler o conteúdo do arquivo, volto a seguinte extensão 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();
    }
}

Essencialmente a fonte de dados permite a leitura apenas uma vez. Depois que o fluxo está fechado, o arquivo é excluído. Desde o JAX-WS pilha só lê o arquivo de uma vez, ele funciona.

A solução é um pouco de um hack, mas parece ser a melhor opção neste caso.

Outras dicas

Você está usando arquivos temporários java padrão? Se assim for, você pode fazer isso:

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

a pasta de trabalho que você configurou no contexto para este webapp que você está falando. Você pode definir esse diretório de trabalho em um diretório conhecido? Se sim, então você pode encontrar o arquivo temporário no diretório de trabalho temporário (que você sabe). Uma vez que você encontrar, você pode excluí-lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top