Tomcat 6: como excluir os arquivos temporários após uma chamada de método web terminou?
-
03-07-2019 - |
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;
}
}
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.