Estavamos fazendo teste de carga na nossa aplicação (tomcat, vraptor, linux - Ubuntu/OpenSuse) e verificamos que a mesma ficava instável após um grande fluxo de file uploads. Conseguimos identificar que estava ocorrendo ‘Too many open files’. Ao verificar o processo do Tomcat com lsof -p [pid], verificamos que havia um grande número de arquivos temporários abertos.
Com isso, alteramos o nosso controller para fechar o inputstream do UploadedFile e o problema foi resolvido:
@Resource
public class SomeController {
public void postFile(UploadedFile myFile) {
try{
myFile.getFile().close;
} catch (Exception e){
e.printStackTrace();
}
}
}
Uma outra dúvida: é possível fazer alguma configuração para que não seja usado diretório temporário? Caso não, é possível mudar esse diretório (ex: ramdrive)?
bom… é suposto que se vc vai receber um arquivo de upload vc vai consumir o file.getFile() e fechá-lo… isso não é só do desenvolvimento com o VRaptor, é sempre que vc recebe um InputStream… mas podemos colocar na documentação sim, quer mandar um pull request?
pra não usar diretório temporário, tenta sobrescrever essa classe:
com @Component ao invés de @Intercepts, e sobrescreve o método createFactoryForDiskBasedFileItems pra retornar uma RamFactory (não sei o nome da classe)