Vraptor - file upload

3 respostas
danilomunoz

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,

3 Respostas

Lucas_Cavalcanti

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)

G

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

danilomunoz

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:
@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;
    }
}
Criado 28 de agosto de 2012
Ultima resposta 29 de ago. de 2012
Respostas 3
Participantes 3