Seguinte pessoal, tenho um servlet que trabalha com jasperReport. Ele recebe parâmetros carrega o arquivo jarper, cria um jrprint, depois exporta esse relatório no formato htm, pdf, xls, etc… só que como ele exporta os relatórios pra um arquivo e depois mostra este arquivo no browser, estou com problemas pra tratar a concorrência deste arquivo. Se duas pessoas acessarem este servlet num espaço de 3 segundos ele mostra sempre o relatório da primeira pessoa. Como faço pra tratar isso?
Já tentei colocar o synchronized(this) mas não adiantou. Abaixo o meu código:
A pouco tempo (em outra empresa) fiz exatamente isso. Uma aplicação web que recebe o relatorio e o tipo de vizualização na URL, gera o arquivo e retorna ele pro usuário. Se for HTML, mostrava direto no browser.
Com relação a problemas de concorrencia não tive nenhum, pois os arquivos gerados eram temporarios e cada browser aberto era uma sessão diferente no server.
Será que vc não setá gerando o arquivonum lugar fisico onde todo mundo está usando ele? pois se cada browser tem sua sessão e cada sessão é independende uma da outra, alguma coisa no teu código tá dizendo pra ser estático.
Abraços!
brlima
Agora que vi que vc realmente está gerando um arquivo fisico. Não faz isso não. Gera um temporario e manda direto pelo browser o HTML gerado. Nem arrisca colocar em arquivo real.
// Para arquivos Pdf...ServletOutputStreamservletOutputStream=res.getOutputStream();FilereportFileJasper="teste.jasper";byte[]bytes=JasperRunManager.runReportToPdf(reportFileJasper,parametros,con);res.setContentType("application/pdf");res.setContentLength(bytes.length);servletOutputStream.write(bytes,0,bytes.length);servletOutputStream.flush();servletOutputStream.close();// Para arquivos Xls...StringnomeXls="teste.xls";JasperPrintimpressao="teste.jasper";JRXlsExporterexporter=newJRXlsExporter();res.setHeader("Content-Disposition","attachment;filename=\""+nomeXls+"\"");res.setContentType("application/vnd.ms-excel");exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,res.getOutputStream());exporter.setParameter(JRExporterParameter.JASPER_PRINT,impressao);exporter.exportReport();
[color=green]
Assim eles serão enviados ao cliente através de um OutputStream, evitando o conflito de duas ou mais pessoas tirarem ao mesmo tempo.
Espero que isso te ajude. Até.[/color]
fabianoat
brlima e Adriano,
muito obrigado, o pdf e o xls funcionaram perfeito… Preciso saber como redirecionar o html direto pro browser, tentei encontrar uma classe que retornasse bytes atraves de um jasper ou jrprint mas rodando em html e não encontrei. Como faço neste caso?
Mas está saindo somente texto, o layout do Ireport não sai.
Valeu.
fabianoat
Não está aparecendo as imagens do html, li algo sobre arquivos px, não sei se tem algo a ver, mas já coloquei um parâmetro pra imagens o código ficou desta forma abaixo:
Esses dias tentei fazer com que o servidor enviasse o arquivo html diretamente para o cliente, porém ele gera várias imagens que acabam se perdendo e ficando desse jeito.
Acredito que para o Html, seja melhor você criar uma pasta no servidor, e armazenar todos os relatórios gerados nesta pasta.
Acredito que haja a possibilidade de criá-los temporariamente, e após algum tempo excluí-los.
Flw…[/color]
fabianoat
Certo. Vou criar com o nome do usuario da session no nome do relatório, e criar uma função que exclua os Relatórios antigos antes de criá-los…
Vai ter que ser assim até descobrir outro jeito, estou sem tempo pra esse desenvolvimento…
Muito obrigado a todos!!
brlima
Ahmm… realmente tem algo com o px da vida ae… ele usa uma imagem px (que é um pixcel) para montar todo o relatorio. Eu peguei essa imagem e joguei num diretorio comum de imagem… Nao lembro se foi isso que resolveu…
Mas também tive serios problemas pra fazer funcionar as imagens nos relatorios… Mas nada que depois de algumas pesquisas não resolvi…
Vou tentar achar como está o source (se ainda tiver ele aqui) e qqer coisa aviso. Mas pesquisa, pq vc esta no caminho certo com relação as imagens… E tenta pegar a imagem PX aí e coloca num diretorio visivel pela pagina (pasta de imagens)…