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.