Vraptor - file upload

Pessoal,

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(); } } }

Será que não seria interessante, o Vraptor já tratar esta situação? Caso não, pelo menos sugerimos que isso seja inserido na documentação (http://vraptor.caelum.com.br/documentacao/download-e-upload/).

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)?

Obrigado e até mais,

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)

Closeables.close() do guava pode evitar try/catch.

Adicionado o pull request: https://github.com/caelum/vraptor/pull/459

Sobre o arquivo em disco, resolvemos aumentando o size threshold da classe org.apache.commons.fileupload.disk.DiskFileItemFactory:

[code]@Component
public class CustomCommonsFileuploadTempSize extends CommonsUploadMultipartInterceptor {

public CustomCommonsFileuploadTempSize(HttpServletRequest request, MutableRequest parameters, MultipartConfig cfg,     
        Validator validator, 
        ServletFileUploadCreator fileUploadCreator) {
    super(request, parameters, cfg, validator, fileUploadCreator);
}

@Override
protected FileItemFactory createFactoryForDiskBasedFileItems(File temporaryDirectory) { 
    FileItemFactory defaultFactory = super.createFactoryForDiskBasedFileItems(temporaryDirectory);
    
    DiskFileItemFactory diskFactory = ((DiskFileItemFactory) defaultFactory);
    diskFactory.setSizeThreshold(5 * 1024 *1024);
    
    return diskFactory;
}

}[/code]