Estouro (aparente) de Buffer no JasperReports

6 respostas
MarcioTavares

Fala galera,

Estou tendo problemas na geração de um relatório, que aparentemente tem a ver com o tamanho do stream passado para o JasperReports.

Minha aplicação geradora roda sob Tomcat, cria o stream (na maioria das vezes é em Html) em tempo real e gera o report via ServletOutputStream e JRExporter. Esse report não dá erro sempre. Depende da quantidade de parâmetros passados para ele. Um dos parâmetros determinantes para o tamanho do report (e do stream) são os estados do país. Na maioria das vezes um estado gera pelo menos 2 páginas de relatório, ou seja, 27 estados gerarão no mínimo 54 páginas. Quando eu escolho poucos estados o report é gerado com sucesso, perfeito. O erro só acontece de fato quando o número de estados é próximo a 27. Segue um pedaço da pilha de erro:

ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
	at org.apache.coyote.tomcat5.OutputBuffer.realWriteBytes(OutputBuffer.java:373)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:294)
	at org.apache.coyote.tomcat5.OutputBuffer.writeBytes(OutputBuffer.java:401)
	at org.apache.coyote.tomcat5.OutputBuffer.write(OutputBuffer.java:388)
	at org.apache.coyote.tomcat5.CoyoteOutputStream.write(CoyoteOutputStream.java:76)
	at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
	at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:395)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:146)
	at java.io.OutputStreamWriter.write(OutputStreamWriter.java:204)
	at java.io.Writer.write(Writer.java:126)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportText(JRHtmlExporter.java:1166)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportPage(JRHtmlExporter.java:669)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportReportToWriter(JRHtmlExporter.java:567)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportReport(JRHtmlExporter.java:392)
... ... ...

NESTED BY :
net.sf.jasperreports.engine.JRException: Error writing to OutputStream writer : chat_bytime_messages_report
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportReport(JRHtmlExporter.java:396)
... ... ...

Caused by: ClientAbortException:  java.net.SocketException: Software caused connection abort: socket write error
	at org.apache.coyote.tomcat5.OutputBuffer.realWriteBytes(OutputBuffer.java:373)
	at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:294)
	at org.apache.coyote.tomcat5.OutputBuffer.writeBytes(OutputBuffer.java:401)
	at org.apache.coyote.tomcat5.OutputBuffer.write(OutputBuffer.java:388)
	at org.apache.coyote.tomcat5.CoyoteOutputStream.write(CoyoteOutputStream.java:76)
	at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
	at sun.nio.cs.StreamEncoder$CharsetSE.implWrite(StreamEncoder.java:395)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:136)
	at sun.nio.cs.StreamEncoder.write(StreamEncoder.java:146)
	at java.io.OutputStreamWriter.write(OutputStreamWriter.java:204)
	at java.io.Writer.write(Writer.java:126)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportText(JRHtmlExporter.java:1166)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportPage(JRHtmlExporter.java:669)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportReportToWriter(JRHtmlExporter.java:567)
	at net.sf.jasperreports.engine.export.JRHtmlExporter.exportReport(JRHtmlExporter.java:392)
	... 32 more

Chegaram a sugerir que isso poderia estar sendo causado por um possível fechamento do socket devido a algum timeout, porque a query sql demora um tempo considerável para rodar. Mas eu verifiquei que o problema não é esse, porque tenho um outro report que demora, dependendo dos parâmetros passados para a query, 10 minutos para rodar, mas não é tão grande quanto esse. Muito mais tempo do que o report problemático.

Já verifiquei tudo o que estava ao meu alcance, e do que eu poderia desconfiar, mas não consegui nem chegar perto de uma solução. Alguém tem alguma idéia do que possa estar acontecendo? Se é algum tipo de estouro de buffer no JasperReports, no ServletOutputStream ou alguma outra coisa?

Grande abraço a todos.

6 Respostas

_fs

10 minutos cara? Certeza?

A requisição http não dá timeout?

MarcioTavares

Sim, tenho certeza. Às vezes é até mais do que isso.

[editado]

Bom, desculpem, na verdade o que demora mais de 10 minutos é a execução da query sql.

furetz

Eu tive um problema com timeout uma vez.
A query sql demorava, às vezes, mais que 40 minutos.

Para resolver isso eu fiz uma gambiarra, quando vou iniciar o processamento do relatório eu seto a timeout daquela sessão para 0, depois quando termina a query eu volto o timeout para o tempo que estava.

MarcioTavares

O problema é que o que parece estar causando o erro é o tamanho da saída gerada. O problema não é com tempo.

MarcioTavares

Descobri o que era: estouro do heap space da VM. Coloquei o Tomcat pra iniciar com 128MB e o treco rodou.

É isso aí, vivendo e aprendendo.

_fs

Cuidado para não deixar 10 clientes fazerem a mesma requisição ao mesmo tempo @.@

Criado 28 de julho de 2005
Ultima resposta 28 de jul. de 2005
Respostas 6
Participantes 3