Mas assim, eu tenho outro problema que é a execução simultânea do Servlet para cada imagem que carrego, ou seja, todas as ocorrências, e acaba estourando a memória heap e apenas algumas imagens são mostradas.
Considerando a boa prática (ainda sou iniciante) qual o melhor jeito de fazer isso ???
eu tentei usar esse SingleThreadModel no Servlet, mas o problema continuou, pq, pelo que eu entendi, essa interface não impede que sejam executadas várias instâncias da mesma classe, e sim que o MultiThread não aconteça dentro da mesma classe (espero não estar dizendo bobagem… ).
Pra vc ter uma idéia eu modifiquei o Servlet de modo que ao invés de converter em memória e enviar, a imagemera salva em disco e era enviada o endereço físico do arquivo. mas nesse caso, nem toda imagem era salva, era como se ele começasse a executar e se perdesse pois foram criados alguns arquivos com tamanho 0kb.
Eu já não sei mais o que tentar para resolver essa pendenga…
Aí vai ele inteiro… o JSP é, grosso modo, aquele que postei acima…
se eu não passar o parâmetro “resize” a envia é renderizada diretamente no browser.
se eu passar o parâmetro “resize”, a imagem é salva em disco com um tamanho bem menor. fiz isso para resolver o problema de memória, mas daí não é sempre que a imagem é salva corretamente, ou seja, apenas mudei de problema, mas acredito que a causa de ambos problemas seja justamente a questão de multithreading.
Pois é , esse processo de transformação não deve ser muito light realmente. Mas só encontrei essa API JAI para conseguir transformar as imagens, uma vez que o browser não carrega TIF nativamente…
Eu notei uma coisa: uma imagem de TIFF 18kb quando convertida para JPG passa a ter 531kb, ou seja, o tráfego para o browser é muito intenso, principalmente se multiplicarmos isso por 6 a 15 imagens, por isso, estou utilizando os métodos para redimensionarem a imagem, daí elas passam a ter uns 20kb.
Por outro lado, se o servlet for executado uma vez sem concorrência consigo mesmo, dá certo e nem fica muito lento. Por isso eu queria fazer o controle do fluxo tudo no Servlet, formatar a página com html e depois de abrir uma célula eu carregava a imagem, uma a uma…
Daí então, estou buscando alternativas para apresentar todas essas imagens no browser sem dar pau em algumas delas… (já faz mais de uma mês que estou estudando alternativas sem sucesso…)
Nao rola criar um processo offline que fizesse os tratamentos adequados nas imagens e salvasse em disco para posterior utilizacao da maneira “padrao”?
Mas o lance da conversao eh algo a ser investigado como o destro colocou - 15 imagens de 500kb cada uma nao sera nada agradavel para baixar no navegador.
Então Daniel fiz o teste:
uma imagem tiff de 7kb foi convertida para um jpg 172kb.
outra tif de 90kb foi convertida para um jpg de 1403kb, a API tinha convertido para 1022kb.
No fim, acho que faz sentido, pois o arquivo tif é preto e branco e o jpg colorido (não tem como configurar…) daí é natural que fique maior, não ?
offline propriamente não daria para fazer, senão eu teria que converter meu banco de imagens com mais de 6 milhões de imagens para jpg, pois é imprevisível saber o que o usuário quer consultar…
Mas o que pensei foi, inclusive tem a ver com o título do tópico, quando o usuário fizesse a escolha do processo que quisesse consultar, eu converteria todas as imagens em disco mesmo e daí faria o link no modo tradicional. mas daí eu tenho um problema de performance, pois eu precisaria salvar esses arquivos em disco e depois ainda trafegá-los.
Se vc reparar no código acima é o que eu faço ,só que redimensionando, pois as 15 imagens são carregadas na tela como thumbnail, então eu posso reduzi-las a um tamanho interessante. Quando eu precisar delas em tamanho original, aí é tranquilo, pois carrego uma a uma…
O problema realmente é chamar várias vezes o Servlet a partir do JSP, seja para converter em memória e enviar seja para salvar em disco redimensionando.
vou converter para essas outras extensões para ver o que rola… preciso estudar a API JAI para esses outros formatos…
eu estou fazendo também alguns testes de performance, gerando os arquivos todos em disco e depois utilizando o caminho direto da imagem ao invés de utilizar o caminho do Servlet, como vc sugeriu…
eu achei interessante o seguinte:
para carregar 12 imagens JPG SALVAS EM DISCO, demorou 50s
para carregar as mesmas imagens convertendo direto para o browser demorou 30s, sendo que mais da metade deu erro no envio/conversão.
Agora, fazendo o mesmo teste com imagens bem menores, os tempos ficaram muito próximos aos de cima, ou seja, o tamanho da imagem aparentemente não está interfirindo no envio (!!!). Talvez por um detalhe que esqueci de dizer, estou em uma rede local…
Mas de qualquer forma vou estudar esse link e ver o que consigo fazer…