Synchronized e jasper

8 respostas
fabianoat

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:

try{
                    String pathJasper2 = getServletContext().getRealPath("/Relatorios/Faturamento");
                    // Preenche o relatório com os dados. Gera o arquivo Faturamento.jrprint
                    JasperFillManager.fillReportToFile( pathJasper + "/Faturamento.jasper", parametros, con );
                    //Constroi o Html pelo Jrprint
                    JasperExportManager.exportReportToHtmlFile(pathJasper + "/Faturamento.jrprint", pathJasper + "/Faturamento.html");
                    response.sendRedirect("Faturamento.html");
                } catch (Exception e){
                    e.printStackTrace(out);
                }

8 Respostas

brlima

Olá Fabiano,

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.

JasperExportManager.exportReportToHtmlFile(pathJasper + "/Faturamento.jrprint", pathJasper + "/Faturamento.html");
D

[color=green]Olá.

Você pode fazer da seguinte forma:[/color]

// Para arquivos Pdf...
ServletOutputStream servletOutputStream = res.getOutputStream();
File reportFileJasper = "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...
String nomeXls = "teste.xls";
JasperPrint impressao = "teste.jasper";

JRXlsExporter exporter = new JRXlsExporter();
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?

tentei assim

jasperPrint = JasperFillManager.fillReport(caminhoJasper, parametros, con);
                    
                    JRHtmlExporter exporter = new JRHtmlExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,response.getOutputStream());
                    exporter.exportReport();

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:

jasperPrint = JasperFillManager.fillReport(caminhoJasper, parametros, con);
                    
                    JRHtmlExporter exporter = new JRHtmlExporter();
                    exporter.setParameter(JRExporterParameter.JASPER_PRINT,jasperPrint);
                    exporter.setParameter(JRHtmlExporterParameter.IMAGES_URI, "images/");
                    exporter.setParameter(JRExporterParameter.OUTPUT_STREAM,response.getOutputStream());
                    exporter.exportReport();
                    response.sendRedirect("index.jsp");

Ainda assim aparece apenas os dados no html as imagens que formam o layout não são exibidas.


D

[color=green]Olá.

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

Abraços!

Criado 19 de junho de 2008
Ultima resposta 26 de jun. de 2008
Respostas 8
Participantes 3