Boa tarde a todos,
estou desenvolvendo um componente de upload aqui na empresa e acabei tendo alguns problemas com relação há upload com uma demora excessiva…
só para constar, não usei algumas libs prontas (FileUpload da apache por exemplo) pois precisava ter controle total do que está acontecendo (memória, buffer de escrita e afins)
Esse componente, a princípio será utilizado na intranet/extranet da empresa, então terá diversas situações:
- Upload de arquivos consideravelmente grandes (100-500mb ou até superiores) por parte de usuários da intranet;
- Arquivos não tão grandes, mas que por serem enviados por usuários via VPN com link limitado, demorarão um tempo considerável para finalizarem;
Também deverá ser aplicado no futuro em um de nossos produtos, tendo que atender clientes, onde seus vendedores precisarão enviar arquivos (planilhas, arquivos de texto, imagens) com um tamanho pequeno, mas com um link limitado…
Quanto aos testes mais simples, foi sem problema, tudo funcionando legal…
Mas quando passei aos casos que citei acima… começou a surgir o problema…
Percebi que o servidor trava a thread (servlet) que está processando o upload, até ai sem problemas, mais do que esperado… até porque o navegador abre uma conexão com o servidor e o arquivo é enviado até seu final…
Mas nos testes com arquivos grandes/conexão lenta, percebemos que a sessão expira, devido a demora na transmissão/processamento do upload…
Como já temos um controle de refresh (requisições ajax enviadas em um intervalo X) achamos que fosse dar conta…
Mas o que acontece aparentemente é que o servidor ignora as requisições que são disparadas pela mesma sessão do upload… quebrando qualquer controle que poderia ser feito (ajax/iframe/meta)…
Baseio a afirmação acima em testes que fiz com 3 versões do tomcat: 5.0 que está em produção, 5.5 para testes, 6.0 versão que estamos fazendo os novos produtos…
Vale salientar que a configuração disableUploadTimeout estava habilitada em todas as versões…
A solução adotada provisoriamente para solucionar esse problema, foi criar um listener, onde o mesmo verifica se o timeout da sessão está para estourar e adiciona mais tempo… até o upload terminar, quando terminado, as configurações voltam ao normal (usando HttpSession getMaxInactiveInterval, setMaxInactiveInterval e getLastAccessedTime)…
Porém não é só isso…
Se abro um outro navegador e acesso o servidor, é criado uma outra sessão, e ai sim navego sem problemas…
Se começar a fazer um upload demorado com essa sessão, ela também será bloqueada, travando todas as requisições enviadas pelo navegador…
Fiz esse testes com os navegadores mais comerciais FF, Chrome, Safari, Opera, IE… Todos se comportaram da mesma maneira…
Trazendo a tona a dúvida que se isso poderia ser uma configuração do servidor ou um padrão do protocolo HTTP…
Como nunca explorei o assunto, sempre fiz uploads mais voltados pra internet onde a limitação de tamanho/timeout era um requisito do componente, nunca me aprofundei nesta problemática e acabou gerando algumas dúvidas…
Se alguém souber mais do assunto, tiver algum material sobre isso e quiserem contribuir, ficaria grato…
Estou aberto a discussões
Aguardo,
PS: Indo almoçar, daqui 1hr estou de volta!
Obrigato pela atenção.